реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Контроль CRC программы из BootLoader, Помогите победить линкер пожалста
Artem
сообщение May 22 2009, 06:12
Сообщение #1


Участник
*

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



Доброго времени суток. Понадобилось добавить bootloader в рабочий проект, и просчитывать при загрузке CRC приложения. Проблема в следующем: Я хочу сделать так - чтобы линкер во время сборки приложения, считал CRC используемой памяти, последним сементом располагал значение CRC. А по фиксированному адресу в конце ROM, расположил указатель на значение CRC. После ресета, попадаем в бутлодер, который из фиксированного адреса считывает адрес значения CRC, затем просчитывает CRC до этого адреса (т.е. до значения). Вот перечитал документация на линкер, и не могу понять как такое можно сделать. Может что-то пропустил... Как это описать линкеру? С линкером экспериментов раньше не проводил, видать пришло время учиться... Заранее спасибо.
P.S. mcu - ATMega16.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 22 2009, 10:29
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



А кто мешает написать внешнюю утилитку, которая будет добавлять некий нужный вам заголовок к загружаемому модулю. А bootloader уже этой информацией будет пользоваться?
Go to the top of the page
 
+Quote Post
vesago
сообщение May 22 2009, 10:46
Сообщение #3


Тутэйшы
****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение May 22 2009, 10:56
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Artem @ May 22 2009, 09:12) *
Вот перечитал документация на линкер, и не могу понять как такое можно сделать. Может что-то пропустил... Как это описать линкеру? ...
P.S. mcu - ATMega16.

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

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

С другой стороны, эта функция линкера не очень удобна - нельзя установить установить заглушки на неиспользуемые прерывания, и длина кода, подлежащего контролю, всегда максимальна.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 22 2009, 11:10
Сообщение #5


Гуру
******

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



Цитата(Dog Pawlowa @ May 22 2009, 13:56) *

Если почитаете документацию относительно ключа -J линкера smile.gif, то можете считать любые зоны и любое их количество


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение May 22 2009, 12:44
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



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

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

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

Код
/* Расчет контрольной суммы только по адресному пространству ОСНОВНОЙ программы (без бутлоадера) */
-J2,sum,,,,,0,=(CODE)0-6FFD


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Artem
сообщение May 25 2009, 03:27
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение May 25 2009, 05:23
Сообщение #8


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(Artem @ May 25 2009, 06:27) *
Но как определить из бутлодера адреc расположения CRC, вот это я не знаю... Ведь бутлодер то отдельная программа и не знает об приложении ничего. Вот и хотел расположить в конец области приложения АДРЕС расположения CRC.

Этот АДРЕС нужно разместить в заголовке приложения по заранее определенному смещению. Уж об этом бутлоадеру знать можно.
Go to the top of the page
 
+Quote Post
Artem
сообщение May 25 2009, 06:03
Сообщение #9


Участник
*

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



Т.е создать сегмент по фиксированному адресу в заголовке приложения? А как линкеру то сказать, чтоб он положил именно адрес CRC, а не величину?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 25 2009, 07:47
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Artem @ May 25 2009, 09:03) *
А как линкеру то сказать, чтоб он положил именно адрес CRC, а не величину?
Линкеру надо сказать, куда положить этот сегмент. А компилятору (ассемблеру) сказать, чтобы положил туда адрес начала сегмента CHECKSUM. Для этого у ассемблера есть макрос SFB()


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
meister
сообщение May 26 2009, 08:42
Сообщение #11


Местный
***

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



Цитата(Artem @ May 22 2009, 10:12) *
Как это описать линкеру? С линкером экспериментов раньше не проводил, видать пришло время учиться...


Лучше не заниматься ерундой и написать свою считалку-криптовалку или найти готовую, с линкером можно доиграться sad.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 26 2009, 09:24
Сообщение #12


Гуру
******

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



Цитата(meister @ May 26 2009, 11:42) *
и написать свою считалку-криптовалку или найти готовую...

Т.е. поменять "шило на мыло" в тщетной надежде на то, что "мыло" будет "лучше" и само все сделает без изучения и приложения рук, как надо и всегда.
Ерундой, говорите, не заниматься sad.gif?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
meister
сообщение May 26 2009, 09:35
Сообщение #13


Местный
***

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



Цитата(zltigo @ May 26 2009, 13:24) *
Ерундой, говорите, не заниматься sad.gif ?


OK. Решение проблемы в последних постах скриптом линкера.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01489 секунд с 7
ELECTRONIX ©2004-2016