meister 0 28 января, 2008 Опубликовано 28 января, 2008 (изменено) · Жалоба Здравствуйте, как можно заставить линковщик (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? Я могу сам посчитать и записать, но тогда отлаживать проблематично - мой бутлоадер отвергает то, что сделал линковщик :( Спасибо. Изменено 28 января, 2008 пользователем meister Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 28 января, 2008 Опубликовано 28 января, 2008 · Жалоба Что за причуды? В начале прошивки указатель на сегмент с контрольной суммой, который, естественно линковать последним. Ваш загрузчик таким образом будет иметь и размер контролируемой области и месторасположение контрольной суммы посчитанной линкером. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
meister 0 28 января, 2008 Опубликовано 28 января, 2008 (изменено) · Жалоба Что за причуды? В начале прошивки указатель на сегмент с контрольной суммой, который, естественно линковать последним. Ваш загрузчик таким образом будет иметь и размер контролируемой области и месторасположение контрольной суммы посчитанной линкером. А линковщик? Ему как контролировать? Чтоб не по всему флэшу CRC считать (нижний адрес 0x2004 я могу захардкодить, а верхний? я хотел брать конец DATA_C). Изменено 28 января, 2008 пользователем meister Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 28 января, 2008 Опубликовано 28 января, 2008 · Жалоба Чтоб не по всему флэшу CRC считать Начнем с простого вопроса - ЗАЧЕМ не по всему? (нижний адрес 0x2004 я могу захардкодить, Угу. а верхний? А верхний (старший) - я уже писал - и лежит, например, в 0x2000 а по нему уже лежит СRC. Все однако :). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
meister 0 28 января, 2008 Опубликовано 28 января, 2008 · Жалоба Ладно, пусть верхняя граница будет концом флэша и вычислять 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 28 января, 2008 Опубликовано 28 января, 2008 · Жалоба Ладно, пусть верхняя граница будет концом флэша и вычислять crc в два диапазаона 0x2004 до CRC и после... Жуть какая-то - в один - от 0x2000 до CRC. За пределами этой прошивки может быть вообще-то еще всякая всячина, типа еще нескольких вариантов прошивки. Даже если нет, то считать контрольные суммы неиспользуемой области это параноя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
meister 0 28 января, 2008 Опубликовано 28 января, 2008 (изменено) · Жалоба от 0x2000 до CRC. Symbol Checksum Memory Start End Initial value ------ -------- ------ ----- --- ------------- __checksum 0xe424 CODE 0000200[b]4[/b] - 000194FE 0x0 За пределами этой прошивки может быть вообще-то еще всякая всячина, типа еще нескольких вариантов прошивки. Даже если нет, то считать контрольные суммы неиспользуемой области это параноя. ?FILL2 00019501 - 0003FFFF 26AFF rel 0 Туда запишется ?FILL2 - никаких других вариантов прошивки там не будет (raw binary файл у меня 256кб). Меня только терзают сомнения - не перепишется ли ISP c IAP отладчиком при этом. Или заполнение не пишется во флэш? Изменено 28 января, 2008 пользователем meister Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 28 января, 2008 Опубликовано 28 января, 2008 · Жалоба Туда запишется ?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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
meister 0 29 января, 2008 Опубликовано 29 января, 2008 · Жалоба Зачем????? Об этом и был мой самый первый вопрос. Сейчас 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) но он такое не понимает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 29 января, 2008 Опубликовано 29 января, 2008 · Жалоба но я не знаю, что писать в опции линковщика: В конце списка сегментов: .... -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.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
meister 0 27 марта, 2008 Опубликовано 27 марта, 2008 · Жалоба Раньше отлично работало, а сегодня 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 27 марта, 2008 Опубликовано 27 марта, 2008 · Жалоба Как туда можно заполнитель вставить (чтобы считал)? Убрать выравнивание сегмента с контрольной суммой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
meister 0 28 марта, 2008 Опубликовано 28 марта, 2008 · Жалоба Убрать выравнивание сегмента с контрольной суммой. У меня пустота образовалась не между программой и контрольной суммой, а между сегментами программы. Пока проблему решил, переставив сегмент кода (его размер не кратен 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 и опять... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 28 марта, 2008 Опубликовано 28 марта, 2008 · Жалоба Хочется чего-нибудь понадежнее, завтра у меня размер ICODE, DATA_ID или DATA_C перестанет быть кратным 4 и опять... Это невероятно, если только специально не постараться. А вообще тогда придется всместо общего указания (CODE) поколдовать c указаниями линкеру Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
meister 0 28 марта, 2008 Опубликовано 28 марта, 2008 (изменено) · Жалоба Можно в пропроцессоре ассемблера в зависимости от адреса сделать заглушку размером 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; Изменено 28 марта, 2008 пользователем meister Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться