Не пишется 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. Кто знает в чем проблема или куда двигаться прошу поделиться информацией.