Artem 0 22 мая, 2009 Опубликовано 22 мая, 2009 · Жалоба Доброго времени суток. Понадобилось добавить bootloader в рабочий проект, и просчитывать при загрузке CRC приложения. Проблема в следующем: Я хочу сделать так - чтобы линкер во время сборки приложения, считал CRC используемой памяти, последним сементом располагал значение CRC. А по фиксированному адресу в конце ROM, расположил указатель на значение CRC. После ресета, попадаем в бутлодер, который из фиксированного адреса считывает адрес значения CRC, затем просчитывает CRC до этого адреса (т.е. до значения). Вот перечитал документация на линкер, и не могу понять как такое можно сделать. Может что-то пропустил... Как это описать линкеру? С линкером экспериментов раньше не проводил, видать пришло время учиться... Заранее спасибо. P.S. mcu - ATMega16. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 22 мая, 2009 Опубликовано 22 мая, 2009 · Жалоба А кто мешает написать внешнюю утилитку, которая будет добавлять некий нужный вам заголовок к загружаемому модулю. А bootloader уже этой информацией будет пользоваться? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vesago 0 22 мая, 2009 Опубликовано 22 мая, 2009 · Жалоба Есть термоядерная утилита 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 22 мая, 2009 Опубликовано 22 мая, 2009 · Жалоба Вот перечитал документация на линкер, и не могу понять как такое можно сделать. Может что-то пропустил... Как это описать линкеру? ... P.S. mcu - ATMega16. Непонятно, что же там непонятно :) Вот пример для 32 меги. -HFFFF -h(CODE)0-6FFD ... -Z(CODE)CHECKSUM#6FFF ... С другой стороны, эта функция линкера не очень удобна - нельзя установить установить заглушки на неиспользуемые прерывания, и длина кода, подлежащего контролю, всегда максимальна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 22 мая, 2009 Опубликовано 22 мая, 2009 · Жалоба Если почитаете документацию относительно ключа -J линкера :), то можете считать любые зоны и любое их количество Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 22 мая, 2009 Опубликовано 22 мая, 2009 · Жалоба Если почитаете документацию относительно ключа -J линкера :) Спасибо... Как бы это объять необъятное... :) Кстати, я эту инструкцию и забыл привести в качестве примера: /* Расчет контрольной суммы только по адресному пространству ОСНОВНОЙ программы (без бутлоадера) */ -J2,sum,,,,,0,=(CODE)0-6FFD Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artem 0 25 мая, 2009 Опубликовано 25 мая, 2009 · Жалоба Всем спасибо за ответы! Я так и сделал - заполнил неиспользуемую память 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 0 25 мая, 2009 Опубликовано 25 мая, 2009 · Жалоба Но как определить из бутлодера адреc расположения CRC, вот это я не знаю... Ведь бутлодер то отдельная программа и не знает об приложении ничего. Вот и хотел расположить в конец области приложения АДРЕС расположения CRC. Этот АДРЕС нужно разместить в заголовке приложения по заранее определенному смещению. Уж об этом бутлоадеру знать можно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artem 0 25 мая, 2009 Опубликовано 25 мая, 2009 · Жалоба Т.е создать сегмент по фиксированному адресу в заголовке приложения? А как линкеру то сказать, чтоб он положил именно адрес CRC, а не величину? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 25 мая, 2009 Опубликовано 25 мая, 2009 · Жалоба А как линкеру то сказать, чтоб он положил именно адрес CRC, а не величину?Линкеру надо сказать, куда положить этот сегмент. А компилятору (ассемблеру) сказать, чтобы положил туда адрес начала сегмента CHECKSUM. Для этого у ассемблера есть макрос SFB() Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
meister 0 26 мая, 2009 Опубликовано 26 мая, 2009 · Жалоба Как это описать линкеру? С линкером экспериментов раньше не проводил, видать пришло время учиться... Лучше не заниматься ерундой и написать свою считалку-криптовалку или найти готовую, с линкером можно доиграться :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 26 мая, 2009 Опубликовано 26 мая, 2009 · Жалоба и написать свою считалку-криптовалку или найти готовую... Т.е. поменять "шило на мыло" в тщетной надежде на то, что "мыло" будет "лучше" и само все сделает без изучения и приложения рук, как надо и всегда. Ерундой, говорите, не заниматься :(? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
meister 0 26 мая, 2009 Опубликовано 26 мая, 2009 · Жалоба Ерундой, говорите, не заниматься :( ? OK. Решение проблемы в последних постах скриптом линкера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться