From d6a399adf49b81ff158b5f0dc36477e26ae49544 Mon Sep 17 00:00:00 2001 From: cfif Date: Thu, 28 May 2026 13:06:54 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BB=D0=B0=D1=82=D1=8B=20=D0=BD?= =?UTF-8?q?=D0=B0=20V2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crc32_uds.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) 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) {