Вот этот кусок... можно упростить:Код:IF WORD_TO_BOOL(crc AND 16#0001) THEN crc:= ( SHR(crc, 1) XOR 16#A001); ELSE crc := SHR(crc, 1); END_IFКод:crc := SHR(crc, 1) XOR 16#A001 * BOOL_TO_WORD(crc.0);
Вот этот кусок... можно упростить:Код:IF WORD_TO_BOOL(crc AND 16#0001) THEN crc:= ( SHR(crc, 1) XOR 16#A001); ELSE crc := SHR(crc, 1); END_IFКод:crc := SHR(crc, 1) XOR 16#A001 * BOOL_TO_WORD(crc.0);
У умножения приоритет больше чем у XOR?
Без скобок проблем не будет?
Так и надо, чтобы сначала умножалось. Я проверил, если что.
Кстати для прикола вообще без ветвлений в один цикл переписал:Тоже проверил. Компактнее, но медленнее (много бесполезного ксора с нулём).Код:FOR j := 0 TO size * 8 - 1 DO crc := crc XOR arr[j / 8] * BOOL_TO_WORD(j MOD 8 = 0); crc := SHR(crc, 1) XOR (16#A001 * BOOL_TO_WORD(crc.0)); END_FOR
http://www.owen.ru/forum/showthread.php?t=17523
Может поможет, там тоже был алгоритм на Си и вариант на ST того же кода.
а если заглянуть в бибку ОСКАТ, то там есть готовый блок расчета любых контрольных сумм
да, знаю, но там много лишнего. Он ведь универсален для всего на свете.