CRC-CCITT и ноль-ноль-ноль

CALL'ы и RET'ы

Postby TS-Labs » Thu, 11.08.2016 03:34:40

Чуть не сошел с ума (а шел уже третий час времени суток), пока ловил багу.

Итак, сценарий.
Есть некий тест, который шлет по шнурку буфер. Содержимое буфера дополняется в конце двумя байтами сабжа. Для простоты, буфер длиннее максимального блока данных на два байта, црц16 добавляется в конец, шлется суммарно длина буфера плюс 2.
Содержимое буфера не важно (ибо просто тест линии), и собственно никем не задается. Это важно.
Еще в тесте есть опция - длина буфера, которую можно изменять на лету.

Итак, тест.
В буфере 0х01, длина равна один байт. На осциллографе видно: 0х01, 0xF1, 0xD1.
Нажимаю увеличить длину (2 байта). На осциллографе: 0х01, 0xF1, 0xD1, 0x00.
Снова нажимаю увеличить длину (уже 3 байта). На осциллографе: 0х01, 0xF1, 0xD1, 0x00, 0x00. И так до бесконечности.
То есть, глаза видят две вещи:
1. Црц не меняется (как предполагалось, в конце).
2. Црц равна два нуля.

В коде примерно такое:
Code: Select all
void send_dblock(u8 *ptr, u8 num)
{
  *(u16*)&ptr[num] = crc::calc_crc16(ptr, num);
  uart_ext_out.put(ptr, num + 2);
}

Вроде и неговнокод, вроде и негде ошибиться.

Проверил функции, честно спижженные из GCC. Все спижжено верно.
Полез на сайт - багу воспроизвел. :o

Фактически, если в блоке данных попадается комбинация, совпадающая с црц16 на момент вычисления, текущее значение црц16 обнуляется, и если до конца буфера идут нули, мы нули же в црц16 и получим.

Теперь с этим жить.
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby DDp » Thu, 11.08.2016 10:41:17

Теперь с этим жить.


Внезапно, AVRBOOT проверяет целостность заголовка fw.bin и данных
посчитывая CRC данных вместе с двумя байтами самой CRC.
Результат при этом должен быть равен нолю. :hi:
(порядок байт CRC - старший вперёд)

*(u16*)&ptr[num] = crc::calc_crc16(ptr, num);

:haha: у вас там "моторолла" какая-то.
D356 47C0 35F8 F55E 8A52 A88F F3F8 B003 03EB 3D7F
DDp
 
Posts: 116
Joined: Fri, 03.08.2012 20:41:33

Postby VBI » Thu, 11.08.2016 11:11:07

DDp, неплохой хак.
User avatar
VBI
 
Posts: 1965
Joined: Mon, 03.06.2013 09:20:29

Postby psb » Thu, 11.08.2016 13:04:10

TS-Labs, но ведь равенство црц нулю если саму црц тоже "посчитать" - это ж известный факт и довольно много где используется. а что нуль после такого продолжается - это ж видно из алгоритма, хоть табличного, хоть побитового. типа, слепое пятно:)
User avatar
psb
 
Posts: 715
Joined: Tue, 30.12.2014 23:22:32

Postby TS-Labs » Thu, 11.08.2016 13:56:06

Даа, даа. Читал, смотрел. Помнил. ЗАБЫЛ :wow2:
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56


Return to Coding

Who is online

Users browsing this forum: No registered users and 1 guest

cron

x