Цитата(skripach @ Mar 12 2011, 10:49)

Код
ielftool --fill 0xFF;0x0-0x3ffff --checksum __checksum:2,crc16,0x0;0x0-0x3ffff --checksum __vector+0x14:4,sum32:2;__vector-__vector+0x1f --verbose D:\work...\bl.out.tmp D:\work...\bl.out
Т.е. как я понял, нужно сначала посчитать одну кс, потом вторую, а потом ещё файл конвертировать в .hex. Пробовал это сделать в Project>Options>Build_Actions>Post_Build - работает но неудобно, длинные строчки и т.д.
Как всё же правильно считать кс.
Измените интервалы, чтобы вторая CRC, которая по таблице векторов, не пересекалась с первой. Ну и место под нее оставить надо бы

, т.е. исключить из интервала подсчета адреса, где она лежать будет. Выделить место под нее можно несколькими способами. Я правил icf файл так:
Код
define symbol __ICFEDIT_region_ROM_start__ = 0x00002044;
define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFB;
define symbol __checksum_region_start__ = 0x0003FFFB; /*4bytes for crc16 (aligment 4) */
define symbol __checksum_region_end__ = 0x0003FFFF;
....
define region checksum_region = mem:[from __checksum_region_start__ to __checksum_region_end__];
.....
place in checksum_region { section .checksum };
После этого у себя в коде:
Код
extern unsigned short const __checksum;
main()
{
unsigned short flash_crc = CRC16_Slow(FW_INITIAL_CRC,(unsigned char *)0x2044,0x3FFFB - 0x2044 +1);
if (flash_crc != __checksum)
{
hrrrrrrrr!!!
}
}
Сообщение отредактировал grinux - Mar 13 2011, 13:06