Обновление

This commit is contained in:
cfif 2026-05-28 12:52:38 +03:00
parent 14827084d1
commit 099a66998a
1 changed files with 34 additions and 5 deletions

View File

@ -47,6 +47,9 @@ uint32_t FirmwareLoader_crc32(uint8_t *data, uint32_t size) {
return crc;
}
*/
#include <stdint.h>
#include <string.h>
// Таблица CRC32, предвычисленная для полинома 0xEDB88320UL (отражённая форма 0x04C11DB7)
static const uint32_t crc_table[256] = {
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
@ -94,15 +97,41 @@ static const uint32_t crc_table[256] = {
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
UdsCrc32Update(uint32_t crc, const uint8_t *data, uint32_t len) {
for (uint32_t i = 0; i < len; ++i) {
crc = (crc >> 8) ^ crc_table[(crc ^ data[i]) & 0xFF];
// Оптимизированная обработка 4 байт за раз
crc = (crc >> 8) ^ crc_table[(crc ^ (word >> 0)) & 0xFF];
crc = (crc >> 8) ^ crc_table[(crc ^ (word >> 8)) & 0xFF];
crc = (crc >> 8) ^ crc_table[(crc ^ (word >> 16)) & 0xFF];
crc = (crc >> 8) ^ crc_table[(crc ^ (word >> 24)) & 0xFF];
data += 4;
len -= 4;
}
return crc; // Без финальной инверсии
// Обрабатываем оставшиеся байты (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) {
return crc ^ 0xFFFFFFFF;
}