Обновление
This commit is contained in:
parent
14827084d1
commit
099a66998a
|
|
@ -47,6 +47,9 @@ uint32_t FirmwareLoader_crc32(uint8_t *data, uint32_t size) {
|
||||||
return crc;
|
return crc;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
// Таблица CRC32, предвычисленная для полинома 0xEDB88320UL (отражённая форма 0x04C11DB7)
|
// Таблица CRC32, предвычисленная для полинома 0xEDB88320UL (отражённая форма 0x04C11DB7)
|
||||||
static const uint32_t crc_table[256] = {
|
static const uint32_t crc_table[256] = {
|
||||||
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
|
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
|
||||||
|
|
@ -94,15 +97,41 @@ static const uint32_t crc_table[256] = {
|
||||||
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
|
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Быстрое обновление CRC32 с обработкой по 4 байта (uint32_t)
|
||||||
|
* @param crc Текущее значение CRC
|
||||||
|
* @param data Указатель на данные
|
||||||
|
* @param len Длина данных в байтах
|
||||||
|
* @return Обновленное значение CRC (без финальной инверсии)
|
||||||
|
*/
|
||||||
|
uint32_t UdsCrc32Update(uint32_t crc, const uint8_t *data, uint32_t len) {
|
||||||
|
// Обрабатываем выровненные 4-байтовые блоки
|
||||||
|
while (len >= 4) {
|
||||||
|
uint32_t word = *(const uint32_t*)data;
|
||||||
|
|
||||||
uint32_t
|
// Оптимизированная обработка 4 байт за раз
|
||||||
UdsCrc32Update(uint32_t crc, const uint8_t *data, uint32_t len) {
|
crc = (crc >> 8) ^ crc_table[(crc ^ (word >> 0)) & 0xFF];
|
||||||
for (uint32_t i = 0; i < len; ++i) {
|
crc = (crc >> 8) ^ crc_table[(crc ^ (word >> 8)) & 0xFF];
|
||||||
crc = (crc >> 8) ^ crc_table[(crc ^ data[i]) & 0xFF];
|
crc = (crc >> 8) ^ crc_table[(crc ^ (word >> 16)) & 0xFF];
|
||||||
}
|
crc = (crc >> 8) ^ crc_table[(crc ^ (word >> 24)) & 0xFF];
|
||||||
return crc; // Без финальной инверсии
|
|
||||||
|
data += 4;
|
||||||
|
len -= 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Обрабатываем оставшиеся байты (0-3 байта)
|
||||||
|
while (len--) {
|
||||||
|
crc = (crc >> 8) ^ crc_table[(crc ^ *data++) & 0xFF];
|
||||||
|
}
|
||||||
|
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Финальная инверсия CRC32
|
||||||
|
* @param crc Значение CRC перед финализацией
|
||||||
|
* @return Финальное значение CRC32
|
||||||
|
*/
|
||||||
uint32_t UdsCrc32Finalize(uint32_t crc) {
|
uint32_t UdsCrc32Finalize(uint32_t crc) {
|
||||||
return crc ^ 0xFFFFFFFF;
|
return crc ^ 0xFFFFFFFF;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue