fk0, легенда (12.07.2017 00:22, просмотров: 828) ответил Ljutik1 на Расскажите, как правильно делать контроль целостности прошивки.
Из функции _start (в C-стартапе, до main) пересчитывается CRC32 прошивки, например, и сравнивается с значениями записанными по специальным адресам (которые при чтении всегда принимаются нулевыми, например). Или контрольная сумма (тут можно подобрать, чтоб с самими байтами контрольной суммы вышел ноль). Или сумма Флетчера, или Адлера. Если контрольный код не верный -- отказ от работы, мигание диодом, азбукой морзе, матерного слова. Код осуществляющий проверку должен быть как можно проще, чтоб не был затронут отказом флеши.
Как добавить CRC в программу, да просто: const long flash_checksum = 0 в отдельном файлике. Потом делаешь elf файл, из него достаешь с помощью objcopy сегменты .rodata, .text (все, что во флеш), считаешь crc внешней программой (на входе hex или bin), потом линкуешь проект еще раз, но с другим содержимым отдельного файлика, где реальное значение crc вписано. Вместо файлика можно линкерскрипт специальный написать, но мороки больше, проще с файликом. Повторяю, при расчете в прошивке уже, 4 байта по адресу flash_checksum не считывать и принимать равными нулю.
[ZX]