Есть плата с Atmega48. Необходимо по приходу соответствующей команды из вне, в моем случае по SPI произвести обновление кода. В Atmega48 нет секции бутлоадера и нет фуза для перехода при сбросе в эту секцию, поэтому как я понимаю секцию в этом контроллере необходимо создавать искусственно программным путем. С этим я сталкиваюсь впервые. Я только, что перечитал апноуты, темы на нашем форуме и в голове у меня обрисовался общий алгоритм решения моей проблемы. Сейчас я озвучу его, а вы если вам не трудно укажите где я говорю не правильно, ну в целом выскажите любые замечания.
В общем "загрузчик" создаю отдельным проектом. В мейк-файле к этому проекту дописываю две строчки: BOOTLOADER_ADDRESS = 0x00С00 и LDFLAGS += -Wl,--section-start=.text=$(BOOTLOADER_ADDRESS)
Я правильно выбрал адрес? 0x00С00? Как я понял в атмеге48 4 килобайта памяти, поэтому под бутлоадер можно отнести килобайт в конце этой памяти.
Итак далее. Моя основная программа работает, и по интерфейсу SPI получает ту самую команду перепрошивки. Я в коде своей программы пишу следующее: void (*funboot)( void ) = 0x0C00; funboot();
так я попадаю в бутлоадер. В теле программы бутлоадера я принимаю данные по SPI и с помощью команд SPM перепрошиваю программу, параллельно проверяя чексум, если все хорошо, то допустим бутяю с помощью собаки или просто перехожу по нулевому адрес.
Тоесть первый раз, я проект бутлоадера прошиваю по адрессу 0xC00. Далее я прошиваю программатором первую версию моей программы по нулевому адресу, в которой заложен механизм перехода по адрессу бутлоадера. Затем новые прошивки которые будут поступать тоже будут с этим механизмом.
Вот так я вижу решение проблемы. Я правильно описал алгоритм? В чем и где именно я не прав? Какие будут замечания?
Заранее благодарен за помощь.
Сообщение отредактировал piz2383 - Jun 27 2009, 21:51
|