avatar
Рейтинг
0.00
Сила
0.00

Публикации

avatar
Значит что-то тут не так… Должно получиться. Но в чём дело я пока не понял. В своей программе для STM32 считал CRC практически так-же, но включая само значение CRC. Правда компилировал GCC, а не IAR. И CRC считал внешней программой в уже откомпилированом .hex файле и только для используемой области Flash памяти. CRC помещал сразу после контролируемой области памяти, порядок байт: младший байт по младшему адресу.
Кстати, в Вашей программе после выхода из цикла переменная ptr как раз указывает на CRC. Не пробовали вместо:
if (calculated_crc != read_crc)
написать:
if (calculated_crc != *ptr)
avatar
Постараюся объяснить более просто. Мажоритар — это логическое устройство с нечётным числом входов и одним выходом. На выходе присутствует уровень, который имеется на большинстве входов. Обычно используются мажоритары с 3-мя входами, но я где-то слышал, что на корабле «Apollo» в каких-то приборах использовались мажоритары с 5-ю входами (не проверено).
Если имеются 3 одинаковых устройства, которые работают одновременно и одинаково, и их выходы подключены ко входам мажоритара, то на выходе мажоритара будет сигнал, совпадающий с сигналами на выходе всех 3-х устройств. Кстати мажоритаров — тоже 3, их входы подключаются параллельно к выходам каждого из предыдущих устройств, а выходы на входы 3-х следующих устройств — каждый к своему. Если одно из устройств выйдет из строя, а два других продолжают функционировать нормально, то на выходе мажоритара всё равно будет правильный сигнал.
Такая схема отлично работает с устройствами без памяти, а также с устройствами памяти в «чистом» виде (триггеры, ОЗУ). А вот при работе со сложными устройствами есть «ложка дёгтя»:
Предположим, что устройство (к примеру микроконтроллер) опрашивает некий сигнал по таймеру и в ответ на него на одном из своих выходов разворачивает некую циклограмму. Предположим, что одно из устройств обнаружило сигнал и начало выдавать циклограмму, а второе устройство обнаружило его только на следующем такте таймера. Скорее всего обнаружение сигнала на следующем такте — вполне допустимая задержка реакции на сигнал — т.е. оба устройства работают нормально. Но сигналы на входах мажоритара — разные! Здесь возможно два решения:
  1. разбить устройство на более мелкие: «устройство обнаружения сигнала» — «мажоритар» — «устройство реакции на сигнал» — «мажоритар», в этом случае реакция на сигнал последует только после того, как его обнаружат не менее 2-х устройств (а третье может и не обнаружит, но всё равно отреагирует);
  2. отказаться от мажоритирования для микроконтроллеров и использовать обычное переключение на резервный микроконтроллер. Работоспособность микроконтроллера контролировать с помощью сторожевого таймера, но не того, что встроен в микроконтроллер, а внешнего — троированного с мажоритарами.
avatar
И это. Не будет ли равен CRC от ВСЕЙ прошивки (включая CRC от компилятора!) нулю в случае отсутствия ошибок?
Да, будет. Таково свойство CRC. По сути CRC — это остаток от деления нашей прошивки, как одного много-многобитного числа, на полином (а по сути на число, которое мы видим на вкладке «Options->Linker->Checksum» справа от поля «Algorithm:»). Правда деление используется не обычное. Используется «полиномиальная арифметика по модулю 2», а именно — при обычном делении «в столбик» операция вычитания заменяется на XOR. Дописывая CRC в конец прошивки мы добавляем к числу остаток от деления и в результате получаем число, которое дилится на полином нацело — остаток равен 0.