Перейти к содержанию
    

Контроль CRC программы из BootLoader

Доброго времени суток. Понадобилось добавить bootloader в рабочий проект, и просчитывать при загрузке CRC приложения. Проблема в следующем: Я хочу сделать так - чтобы линкер во время сборки приложения, считал CRC используемой памяти, последним сементом располагал значение CRC. А по фиксированному адресу в конце ROM, расположил указатель на значение CRC. После ресета, попадаем в бутлодер, который из фиксированного адреса считывает адрес значения CRC, затем просчитывает CRC до этого адреса (т.е. до значения). Вот перечитал документация на линкер, и не могу понять как такое можно сделать. Может что-то пропустил... Как это описать линкеру? С линкером экспериментов раньше не проводил, видать пришло время учиться... Заранее спасибо.

P.S. mcu - ATMega16.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть термоядерная утилита 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот перечитал документация на линкер, и не могу понять как такое можно сделать. Может что-то пропустил... Как это описать линкеру? ...

P.S. mcu - ATMega16.

Непонятно, что же там непонятно :)

Вот пример для 32 меги.

 

-HFFFF

-h(CODE)0-6FFD

...

-Z(CODE)CHECKSUM#6FFF

...

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если почитаете документацию относительно ключа -J линкера :)

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо за ответы! Я так и сделал - заполнил неиспользуемую память 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но как определить из бутлодера адреc расположения CRC, вот это я не знаю... Ведь бутлодер то отдельная программа и не знает об приложении ничего. Вот и хотел расположить в конец области приложения АДРЕС расположения CRC.

Этот АДРЕС нужно разместить в заголовке приложения по заранее определенному смещению. Уж об этом бутлоадеру знать можно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.е создать сегмент по фиксированному адресу в заголовке приложения? А как линкеру то сказать, чтоб он положил именно адрес CRC, а не величину?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как линкеру то сказать, чтоб он положил именно адрес CRC, а не величину?
Линкеру надо сказать, куда положить этот сегмент. А компилятору (ассемблеру) сказать, чтобы положил туда адрес начала сегмента CHECKSUM. Для этого у ассемблера есть макрос SFB()

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как это описать линкеру? С линкером экспериментов раньше не проводил, видать пришло время учиться...

 

Лучше не заниматься ерундой и написать свою считалку-криптовалку или найти готовую, с линкером можно доиграться :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и написать свою считалку-криптовалку или найти готовую...

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

Ерундой, говорите, не заниматься :(?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ерундой, говорите, не заниматься :( ?

 

OK. Решение проблемы в последних постах скриптом линкера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...