ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
789797
pav256 (26.10.2017 17:42, просмотров: 6544)
Не пишется CRC16 в hex файл. Задача периодически проверять программу на целостность. Дано: Iar 8.11, проц. stm32F407. Подсчет CRC16 реализован посредством размещения меток, в соответствии с IAR "Technical Note 62709" следующим образом: 1. Определены секции меток, добавлена запись в "stm32f4xx_flash.icf" define block ROM_CONTENT with fixed order { readonly section checksum_start_mark, readonly, readonly section checksum_end_mark, readonly section checksum }; place in ROM_region { block ROM_CONTENT }; 2.Заполнение пустых мест и определение меток - вкладка "Build Actions/Post build command line" добавлено: ielftool --fill 0xFF; checksum_start-checksum_end+3 --checksum ielftool_checksum:2,crc16,0x0;checksum_start-checksum_end+3 --verbose "$TARGET_PATH$" "$TARGET_PATH$" 3.Подсчет CRC16 и занесение в память - вкладка "Linker/Extra Options" добавлено: --place_holder ielftool_checksum,2,checksum,4 --keep=ielftool_checksum 4.В основной программе доступ к меткам осуществляется следующим образом: extern const uint16_t ielftool_checksum; __root const uint8_t checksum_start @ "checksum_start_mark" = 0; __root const uint8_t checksum_end[4] @ "checksum_end_mark" = {0,0,0,0xEE}; // The last byte is the actual "checksum area end mark" void test_flash(unsigned char Start) { uint16_t Crc16; Crc16 = crc16(0x0000, (uint8_t *)&checksum_start, (unsigned long) (&checksum_end[3] - &checksum_start + 1)); if (Crc16 != ielftool_checksum) ErrFlashProgram = 1; else ErrFlashProgram = 0; return; } Самое интересное, что CRC16 считается и сравнивается с исходной правильно, проверял в симуляторе (см. скриншот). Проблема в том, что в hex файле её НЕТ (см. скриншот)! В памяти сумма располагается ( --keep=ielftool_checksum ). Создается впечатление, что hex файл создается до подсчета CRC16, да и место под неё выделено, а затем вычисляется CRC16. Кто знает в чем проблема или куда двигаться прошу поделиться информацией.
image