Наконец-то добрались руки до написания бутлоадера по AT91SAM7.
В общем я сейчас опишу алгоритм как я это собираюсь сделать, а вы если можно ответьте правильно ли я размышляю и если есть ошибки укажите на них.
Итак ограничения для firmware. В настройках линкера должно быть указано следующее:
Код
-DBOOTSIZE=8000
-Z(CONST)INTRAMSTART_REMAP=00000000
-Z(CONST)INTRAMEND_REMAP=0000FFFF
-Z(CONST)INTRAMSTART=00200000
-DROMSTART=(00100000+BOOTSIZE)
-DROMEND=0013FFFF
-DINTVECSIZE=100
-DRAMSTART=(00000000+INTVECSIZE)
-DRAMEND=0000FFFF
-Z(CODE)INTVEC=ROMSTART-(ROMSTART+INTVECSIZE)
Итак. Загрузчик размещается во флеши по адресу 0. Пользовательская программа по адресу 0х8000.
Загрузчик хочу зделать и через USART и через USB. Но пока не в этом суть.
Загрузчик либо проверяет уже существующую прошивку и если она корректна то стартует с неё, или же если пришла из вне команда о перепрошивке начинает перепрошивать пользовательскую программу. Загрузка будет производиться постранично. Так как не может одновпременно производиться и запись и чтение с флеша функция записи должна быть с идентификатором __ramfunc. У меня вопрос встречный. Что делать с обработчиком прерывания, можно ли ему назначить идентификатор __ramfunc? Или же прерывания необходимо останавливать на время выполнения записи в флеш?
Итак по адресу 0х8000 записана новая пользовательская программа. Далее производиться копирование векторов прерывания пользовательской программы в ОЗУ с адреса 0х8000 флеша в адрес 0 в ОЗУ. И далее производиться команда remap (теперь по нулевым адресам зеркалируеться ОЗУ и пользовательская программа может выполнять свои обработчики исключительных ситуаций). Ну и естественно нулевой вектор сброса необходимо оставить старый, что бы при сбросе мы попадали в бутлоадер.
Укажите на существующие неточности и ошибки в том алгоритме что я привел. В общем любые ваши коментарии. Завтра уже планирую закодировать все выше написаное.