|
|
  |
Контроль CRC программы из BootLoader, Помогите победить линкер пожалста |
|
|
|
May 22 2009, 06:12
|
Участник

Группа: Свой
Сообщений: 72
Регистрация: 4-02-05
Пользователь №: 2 424

|
Доброго времени суток. Понадобилось добавить bootloader в рабочий проект, и просчитывать при загрузке CRC приложения. Проблема в следующем: Я хочу сделать так - чтобы линкер во время сборки приложения, считал CRC используемой памяти, последним сементом располагал значение CRC. А по фиксированному адресу в конце ROM, расположил указатель на значение CRC. После ресета, попадаем в бутлодер, который из фиксированного адреса считывает адрес значения CRC, затем просчитывает CRC до этого адреса (т.е. до значения). Вот перечитал документация на линкер, и не могу понять как такое можно сделать. Может что-то пропустил... Как это описать линкеру? С линкером экспериментов раньше не проводил, видать пришло время учиться... Заранее спасибо. P.S. mcu - ATMega16.
|
|
|
|
|
May 22 2009, 10:46
|
Тутэйшы
   
Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263

|
Есть термоядерная утилита SRecord. Тут обсуждалась. Она позволяет с прошивкой все что угодно сделать. Я через нее собрал обновление загрузчика из приложения с контролем CRC32. Пример скрипта: Код @echo off
@echo 1.PATCH BOOT SIGNATURE 0x14 srec_cat.exe bootloader.hex --Intel --Output bootloader_tmp.bin --Binary patch_signature.exe bootloader_tmp.bin del bootloader.hex srec_cat.exe bootloader_tmp.bin --Binary --Output bootloader.hex --Intel
@echo 2.GENERATE BOOT CRC32 AND PASTE BEGIN srec_cat.exe bootloader.hex --Intel --offset 0x04 --l-e-crc32 --min bootloader.hex --Intel --Output bootloader_and_crc32.hex --Intel
@echo 3.ADD BOOT LEN srec_cat.exe bootloader_and_crc32.hex --Intel --offset 0x04 --b-e-length --min bootloader.hex --Intel --Output bootloader_and_len_and_crc32.hex --Intel
@echo 4.ADD BOOT TO APP AND OUTPUT skat_app.hex srec_cat.exe bootloader_and_len_and_crc32.hex --Intel --offset 0x00006000 skat.hex --Intel --Output skat_app.hex --Intel
@echo 5.OUTPUT skat_app.bin srec_cat.exe skat_app.hex --Intel --fill 0xFF 0x00 0x8008 --Output skat_app.bin --Binary
move skat_app.bin release move skat_app.hex release
move bootloader_and_crc32.hex tmp move bootloader_and_len_and_crc32.hex tmp move bootloader_tmp.bin tmp
pause
|
|
|
|
|
May 22 2009, 10:56
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Artem @ May 22 2009, 09:12)  Вот перечитал документация на линкер, и не могу понять как такое можно сделать. Может что-то пропустил... Как это описать линкеру? ... P.S. mcu - ATMega16. Непонятно, что же там непонятно  Вот пример для 32 меги. -HFFFF -h(CODE)0-6FFD ... -Z(CODE)CHECKSUM#6FFF ... С другой стороны, эта функция линкера не очень удобна - нельзя установить установить заглушки на неиспользуемые прерывания, и длина кода, подлежащего контролю, всегда максимальна.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
May 22 2009, 12:44
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(zltigo @ May 22 2009, 14:10)  Если почитаете документацию относительно ключа -J линкера  Спасибо... Как бы это объять необъятное...  Кстати, я эту инструкцию и забыл привести в качестве примера: Код /* Расчет контрольной суммы только по адресному пространству ОСНОВНОЙ программы (без бутлоадера) */ -J2,sum,,,,,0,=(CODE)0-6FFD
--------------------
Уходя, оставьте свет...
|
|
|
|
|
May 25 2009, 03:27
|
Участник

Группа: Свой
Сообщений: 72
Регистрация: 4-02-05
Пользователь №: 2 424

|
Всем спасибо за ответы! Я так и сделал - заполнил неиспользуемую память RETI, считаю CRC от начала и до конца flash. Вот как сделано сейчас: Код -Z(CODE)INTVEC=0-53 /* 20 Interrupt vectors * 4 bytes each */
/* заполняем неиспользуемую память RETI */ -H1895 -h(CODE)0-37FD
/* Определяем сегменты */ -Z(CODE)TINY_F=54-FF -Z(CODE)NEAR_F,SWITCH,INITTAB,DIFUNCT=54-37FD -Z(CODE)CODE=54-37FD -Z(CODE)TINY_ID,NEAR_ID=54-37FD /*прилинковываем сегмент CRC */ -Z(CODE)CHECKSUM=37FE-37FF /* считаем CRC */ -J2,crc16,,,CHECKSUM,2=(CODE)00-37FD Просто приложение занимает только примерно половину флэшки, вот и хотел прилинковывать сегмент CRC в самый конец приложения, а не в конец флэшки(области приложения). Как прилинковать CRC в конец приложения, я понял. Но как определить из бутлодера адреc расположения CRC, вот это я не знаю... Ведь бутлодер то отдельная программа и не знает об приложении ничего. Вот и хотел расположить в конец области приложения АДРЕС расположения CRC.
|
|
|
|
|
May 25 2009, 06:03
|
Участник

Группа: Свой
Сообщений: 72
Регистрация: 4-02-05
Пользователь №: 2 424

|
Т.е создать сегмент по фиксированному адресу в заголовке приложения? А как линкеру то сказать, чтоб он положил именно адрес CRC, а не величину?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|