diff --git a/crc32_uds.c b/crc32_uds.c index a255a56..d12a1a3 100644 --- a/crc32_uds.c +++ b/crc32_uds.c @@ -57,15 +57,31 @@ UdsCrc32Update(uint32_t crc, const uint8_t *data, uint32_t len, crc32_update_fun uint32_t timeout) { uint32_t time = SystemGetMs() + timeout; - for (uint32_t i = 0; i < len; ++i) { - crc = (crc >> 8) ^ crc_table[(crc ^ data[i]) & 0xFF]; + // Обрабатываем выровненные 4-байтовые блоки + while (len >= 4) { + uint32_t word = *(const uint32_t*)data; + + // Оптимизированная обработка 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]; if (SystemGetMs() > time) { update_func(update_func_env); time = SystemGetMs() + timeout; } + + data += 4; + len -= 4; } - return crc; // Без финальной инверсии + + // Обрабатываем оставшиеся байты (0-3 байта) + while (len--) { + crc = (crc >> 8) ^ crc_table[(crc ^ *data++) & 0xFF]; + } + + return crc; } uint32_t UdsCrc32Finalize(uint32_t crc) {