Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Контроль CRC программы из BootLoader
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Artem
Доброго времени суток. Понадобилось добавить bootloader в рабочий проект, и просчитывать при загрузке CRC приложения. Проблема в следующем: Я хочу сделать так - чтобы линкер во время сборки приложения, считал CRC используемой памяти, последним сементом располагал значение CRC. А по фиксированному адресу в конце ROM, расположил указатель на значение CRC. После ресета, попадаем в бутлодер, который из фиксированного адреса считывает адрес значения CRC, затем просчитывает CRC до этого адреса (т.е. до значения). Вот перечитал документация на линкер, и не могу понять как такое можно сделать. Может что-то пропустил... Как это описать линкеру? С линкером экспериментов раньше не проводил, видать пришло время учиться... Заранее спасибо.
P.S. mcu - ATMega16.
sergeeff
А кто мешает написать внешнюю утилитку, которая будет добавлять некий нужный вам заголовок к загружаемому модулю. А bootloader уже этой информацией будет пользоваться?
vesago
Есть термоядерная утилита 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
Dog Pawlowa
Цитата(Artem @ May 22 2009, 09:12) *
Вот перечитал документация на линкер, и не могу понять как такое можно сделать. Может что-то пропустил... Как это описать линкеру? ...
P.S. mcu - ATMega16.

Непонятно, что же там непонятно smile.gif
Вот пример для 32 меги.

-HFFFF
-h(CODE)0-6FFD
...
-Z(CODE)CHECKSUM#6FFF
...

С другой стороны, эта функция линкера не очень удобна - нельзя установить установить заглушки на неиспользуемые прерывания, и длина кода, подлежащего контролю, всегда максимальна.
zltigo
Цитата(Dog Pawlowa @ May 22 2009, 13:56) *

Если почитаете документацию относительно ключа -J линкера smile.gif, то можете считать любые зоны и любое их количество
Dog Pawlowa
Цитата(zltigo @ May 22 2009, 14:10) *
Если почитаете документацию относительно ключа -J линкера smile.gif

Спасибо... Как бы это объять необъятное... smile.gif

Кстати, я эту инструкцию и забыл привести в качестве примера:

Код
/* Расчет контрольной суммы только по адресному пространству ОСНОВНОЙ программы (без бутлоадера) */
-J2,sum,,,,,0,=(CODE)0-6FFD
Artem
Всем спасибо за ответы! Я так и сделал - заполнил неиспользуемую память 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.
HARMHARM
Цитата(Artem @ May 25 2009, 06:27) *
Но как определить из бутлодера адреc расположения CRC, вот это я не знаю... Ведь бутлодер то отдельная программа и не знает об приложении ничего. Вот и хотел расположить в конец области приложения АДРЕС расположения CRC.

Этот АДРЕС нужно разместить в заголовке приложения по заранее определенному смещению. Уж об этом бутлоадеру знать можно.
Artem
Т.е создать сегмент по фиксированному адресу в заголовке приложения? А как линкеру то сказать, чтоб он положил именно адрес CRC, а не величину?
Сергей Борщ
Цитата(Artem @ May 25 2009, 09:03) *
А как линкеру то сказать, чтоб он положил именно адрес CRC, а не величину?
Линкеру надо сказать, куда положить этот сегмент. А компилятору (ассемблеру) сказать, чтобы положил туда адрес начала сегмента CHECKSUM. Для этого у ассемблера есть макрос SFB()
meister
Цитата(Artem @ May 22 2009, 10:12) *
Как это описать линкеру? С линкером экспериментов раньше не проводил, видать пришло время учиться...


Лучше не заниматься ерундой и написать свою считалку-криптовалку или найти готовую, с линкером можно доиграться sad.gif
zltigo
Цитата(meister @ May 26 2009, 11:42) *
и написать свою считалку-криптовалку или найти готовую...

Т.е. поменять "шило на мыло" в тщетной надежде на то, что "мыло" будет "лучше" и само все сделает без изучения и приложения рук, как надо и всегда.
Ерундой, говорите, не заниматься sad.gif?
meister
Цитата(zltigo @ May 26 2009, 13:24) *
Ерундой, говорите, не заниматься sad.gif ?


OK. Решение проблемы в последних постах скриптом линкера.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.