|
CHECKSUM |
|
|
|
Jan 28 2008, 15:10
|

Местный
  
Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484

|
Здравствуйте, как можно заставить линковщик (IAR 4.42A) считать контрольную сумму только для указанных сегментов: Код PRGENTRY 00002004 - 0000207F 7C rel 2 ICODE 00002080 - 00002633 5B4 rel 2 DIFUNCT 00002634 - 00002637 4 rel 2 CODE 00002638 - 0000F39F CD68 rel 2 INITTAB 0000F3A0 - 0000F3B7 18 rel 2 DATA_ID 0000F3B8 - 0000F3BB 4 rel 2 DATA_C 0000F3BC - 0001386F 44B4 rel 2 т.е. с начала PRGENTRY до конца DATA_C? Я могу сам посчитать и записать, но тогда отлаживать проблематично - мой бутлоадер отвергает то, что сделал линковщик  Спасибо.
Сообщение отредактировал meister - Jan 28 2008, 15:10
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Jan 28 2008, 16:22
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(meister @ Jan 28 2008, 18:55)  Чтоб не по всему флэшу CRC считать Начнем с простого вопроса - ЗАЧЕМ не по всему? Цитата (нижний адрес 0x2004 я могу захардкодить, Угу. Цитата а верхний? А верхний (старший) - я уже писал - и лежит, например, в 0x2000 а по нему уже лежит СRC. Все однако  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 28 2008, 17:20
|

Местный
  
Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484

|
Ладно, пусть верхняя граница будет концом флэша и вычислять crc в два диапазаона 0x2004 до CRC и после CRC до конца флэш, считая, что там везде 0xFF. Не сходится  Все диапазоны сделаны на манер STL (поэтому конец флэш 0x40000, а не 0x3FFFF). Код -J2,crc16,,,,1,0=2004-3ffff Код unsigned short slow_crc16(unsigned short sum, u8_t const * p, unsigned short len) { while (len--) { int i; unsigned char byte = *p++; for (i = 0; i < 8; ++i) { unsigned long osum = sum; sum <<= 1; if (byte & 0x80) sum |= 1; if (osum & 0x8000) sum ^= 0x1021; byte <<= 1; } } return sum; } bool is_code_valid(void) { if (validate_write_address(bootloader_programm_size)) { u8_t const * const programm_begin = reinterpret_cast<u8_t const *>(0x2004); u8_t const * const programm_end = reinterpret_cast<u8_t const *>(bootloader_programm_size); u8_t const * const flash_end = reinterpret_cast<u8_t const *>(0x40000); u8_t const zero[] = {0, 0};
u16_t crc = 0; crc = slow_crc16(crc, programm_begin, programm_end - programm_begin); crc = slow_crc16(crc, programm_end + 2, flash_end - programm_end - 2); crc = slow_crc16(crc, zero, 2); u16_t linker_crc; my_memcpy(&linker_crc, programm_end, 2); // читается правильно return crc == linker_crc; // вообще не сходится, ни инвертирование, ни меняя endian. } else { return false; } } Код MODULE PROGRAMM_SIZE; PUBLIC bootloader_programm_size; EXTERN __checksum; RSEG PRGSIZE:CODE:NOROOT(2);
bootloader_programm_size DC32 __checksum;
ENDMOD; Код **************************************** * * * SEGMENTS IN ADDRESS ORDER * * * ****************************************
SEGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN ======= ===== ============= =========== ==== ==== ===== PRGSIZE 00002000 - 00002003 4 rel 2 PRGENTRY 00002004 - 0000207F 7C rel 2 ICODE 00002080 - 00002633 5B4 rel 2 DIFUNCT 00002634 - 00002637 4 rel 2 CODE 00002638 - 00014ED7 128A0 rel 2 INITTAB 00014ED8 - 00014EEF 18 rel 2 DATA_ID 00014EF0 - 00014EF3 4 rel 2 DATA_C 00014EF4 - 000194FE 460B rel 2 CHECKSUM 000194FF - 00019500 2 rel 0 ?FILL2 00019501 - 0003FFFF 26AFF rel 0
**************************************** * * * CHECKSUMS * * * ****************************************
Symbol Checksum Memory Start End Initial value ------ -------- ------ ----- --- ------------- __checksum 0xe424 CODE 00002004 - 000194FE 0x0 CODE 00019501 - 0003FFFF
|
|
|
|
|
Jan 28 2008, 17:29
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(meister @ Jan 28 2008, 20:20)  Ладно, пусть верхняя граница будет концом флэша и вычислять crc в два диапазаона 0x2004 до CRC и после... Жуть какая-то - в один - от 0x200 0 до CRC. За пределами этой прошивки может быть вообще-то еще всякая всячина, типа еще нескольких вариантов прошивки. Даже если нет, то считать контрольные суммы неиспользуемой области это параноя.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 28 2008, 18:31
|

Местный
  
Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484

|
Цитата(zltigo @ Jan 28 2008, 20:29)  от 0x2000 до CRC. Код Symbol Checksum Memory Start End Initial value ------ -------- ------ ----- --- ------------- __checksum 0xe424 CODE 0000200[b]4[/b] - 000194FE 0x0 Цитата(zltigo @ Jan 28 2008, 20:29)  За пределами этой прошивки может быть вообще-то еще всякая всячина, типа еще нескольких вариантов прошивки. Даже если нет, то считать контрольные суммы неиспользуемой области это параноя. Код ?FILL2 00019501 - 0003FFFF 26AFF rel 0 Туда запишется ?FILL2 - никаких других вариантов прошивки там не будет (raw binary файл у меня 256кб). Меня только терзают сомнения - не перепишется ли ISP c IAP отладчиком при этом. Или заполнение не пишется во флэш?
Сообщение отредактировал meister - Jan 28 2008, 18:31
|
|
|
|
|
Jan 28 2008, 18:40
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(meister @ Jan 28 2008, 21:31)  Туда запишется ?FILL2 - никаких других вариантов прошивки там не будет (raw binary файл у меня 256кб). Зачем????? Вам платят побайтно? Цитата Меня только терзают сомнения - не перепишется ли ISP c IAP отладчиком при этом. Разумеется нет - туда доступ получить непросто. Даже документации нет, хотя с полгода назад библиотеки выложили. Код Segments in Address Order Segment Space Start End Size Kind Align INTVEC 00002000 - 0000201F 20 Common 2 ICODE 00002020 - 000022C3 2A4 Relative 3 DIFUNCT 000022C4 Relative 2 CODE 000022C4 - 0001075F E49C Relative 2 INITTAB 00010760 - 00010777 18 Relative 2 DATA_ID 00010778 - 00010F77 800 Relative 2 DATA_C 00010F78 - 00012790 1819 Relative 2 CHECKSUM 00012791 - 00012792 2 Relative 0 DATA_I 40000000 - 400007FF 800 Relative 2 DATA_Z 40000800 - 40001C37 1438 Relative 2 SVC_STACK 40001C38 - 40001E37 200 Relative 3 CSTACK 40001E38 - 40001E3F 8 Relative 3 FIQ_STACK 40001E40 - 40001EBF 80 Relative 3 IRQ_STACK 40001EC0 - 400020BF 200 Relative 3 HEAP_RTOS 400020C0 - 400040FF 2040 Relative 3 XXX_STACK 40007FE0 - 40007FFF 20 Relative 3
ChecksumsSymbol Checksum Memory Start End Initial value __checksum 0xc2e2 CODE 00002000 - 00012790 0x0
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 29 2008, 09:58
|

Местный
  
Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484

|
Цитата(zltigo @ Jan 28 2008, 21:40)  Зачем????? Об этом и был мой самый первый вопрос. Сейчас CRC считается верно, но я не знаю, что писать в опции линковщика: -J2,crc16,,,,1,0=2000- 194FEКод **************************************** * * * SEGMENTS IN ADDRESS ORDER * * * ****************************************
SEGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN ======= ===== ============= =========== ==== ==== ===== PRGSIZE 00002000 - 00002003 4 rel 2 ... DATA_C 00014EF4 - 000194FE 460B rel 2 Но этот вариант мне не нравится - линковать дважды? Я бы хотел линковщику написать типа -J2,crc16,,,,1,0= SFB(PRGSIZE)-SFE(DATA_C)но он такое не понимает.
|
|
|
|
|
Jan 29 2008, 10:20
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(meister @ Jan 29 2008, 12:58)  но я не знаю, что писать в опции линковщика: В конце списка сегментов: .... -Z(CONST)CHECKSUM=ROMSTART-ROMEND // to end of CODE block .... Ну и собственно CRC -Hff -h(CODE) -J2,crc16,,,,1,0 Это нежели Вам побайтно будут когда-нибудь платить  -Z(CODE)CHECKSUM#ROMSTART-ROMEND // to end of ROM block и укажете всесь FLASH для CRC....
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 27 2008, 16:58
|

Местный
  
Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484

|
Раньше отлично работало, а сегодня IAR сделал вот так: Код CODE 00001428 - 00010F9[b]9[/b] FB72 rel 2 INITTAB 00010F9[b]C[/b] - 00010FB3 18 rel 2
**************************************** * * * CHECKSUMS * * * ****************************************
Symbol Checksum Memory Start End Initial value ------ -------- ------ ----- --- ------------- __checksum 0x2b89 CODE 00001000 - 00010F99 0x0 CODE 00010F9C - 00015357 То есть он не считает CRC с 00010F9A до 00010F9B. Как туда можно заполнитель вставить (чтобы считал)? Линкую вот так: -H00 -h(CODE) -J2,crc16,,,,1,0=1000-3FFFF
|
|
|
|
|
Mar 28 2008, 06:37
|

Местный
  
Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484

|
Цитата(zltigo @ Mar 28 2008, 01:51)  Убрать выравнивание сегмента с контрольной суммой. У меня пустота образовалась не между программой и контрольной суммой, а между сегментами программы. Пока проблему решил, переставив сегмент кода (его размер не кратен 4, с остальными сегментами мне пока везет  ) в самый конец. Код PRGSIZE 00001000 - 00001003 4 rel 2 PRGENTRY 00001004 - 0000101B 18 rel 2 ICODE 0000101C - 00001427 40C rel 2 DIFUNCT 00001428 rel 2 INITTAB 00001428 - 0000143F 18 rel 2 DATA_ID 00001440 - 00001443 4 rel 2 DATA_C 00001444 - 000057E3 43A0 rel 2 CODE 000057E4 - 00015355 FB72 rel 2 CHECKSUM 00015356 - 00015357 2 rel 0 Хочется чего-нибудь понадежнее, завтра у меня размер ICODE, DATA_ID или DATA_C перестанет быть кратным 4 и опять...
|
|
|
|
|
Mar 28 2008, 07:08
|

Местный
  
Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484

|
Можно в пропроцессоре ассемблера в зависимости от адреса сделать заглушку размером 2 или 4 байта (есть где-нибудь полный мануал на ассемблер ИАРа?)? Пока хочу выровнять контрольную сумму (потом это будет любой другой сегмент, как возникнут проблемы): CODE 00005804 - 0001548D FC8A rel 2 ALIGNER1 00015490 - 00015493 4 rel 1 CHECKSUM 00015494 - 00015495 2 rel 0 Код RSEG ALIGNER1:CONST:ROOT(1); PUBLIC ALIGNERFILL1;
вот тут в зависимости от адреса ALIGNERFILL1 DC32 0; или ALIGNERFILL1 DC16 0;
ENDMOD;
Сообщение отредактировал meister - Mar 28 2008, 07:09
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|