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

 
 
> bootloader для Atmega48
piz2383
сообщение Jun 27 2009, 21:47
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 26-06-09
Пользователь №: 50 675



Есть плата с 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
piz2383
сообщение Jul 6 2009, 20:18
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 26-06-09
Пользователь №: 50 675



Спасибо всем, комментарии учтены. Буду реализовывать, так что программа по нулевому адресу располагаться, а бутлоадер по адресу С00. Вектор перехода на бутлоадер буду задавать в своей пользовательской программе, это будет мелким ограничением. Кстати как это сделать на асме понимаю, а вот на Си, не очень. WINAVR как я понял сам вектора настраивает, и нулевой вектор он устанавливает на main. А как на Си написать, так что бы нулевой вектор все таки был на адресс C00?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 7 2009, 08:34
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(piz2383 @ Jul 6 2009, 23:18) *
А как на Си написать, так что бы нулевой вектор все таки был на адресс C00?
Это Вам зачем? Поскольку Вы ввели загрузчик искусственно, то и поддержку "двух" нулевых векторов прийдется обеспечивать Вам самому. Сам я делам следующим образом:
1. Загрузчик распологается в верхних адресах. Нулевой вертор автоматически (в программе на Си) содержит команду jmp на начало загрузчика.
2. При старте по подаче питания управление передаётся загрузчику.
3. Загрузчик определяет (например, по к-либо ноге) загружать ему в память приложение или передать уже загруженному приложению управление.
4. Если загружать приложение, то загрузчик считывает и записывает в память приложение, при этом "защищает" нулевой вектор - иначе он (загрузчик) не получит управление никогда. Загрузчик должен контролировать - куда производится запись прикладной программы и команду по нулевому адресу не заносить, но "выкусить" из команды и запомнить (записать) у себя адрес перехода (начало приложения) для последующего старта приложения.
5. Если загружать приложение не нужно - передаётся управление на начало приложения по ранее сохранённому адресу.
Go to the top of the page
 
+Quote Post
piz2383
сообщение Jul 7 2009, 09:08
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 26-06-09
Пользователь №: 50 675



Цитата(Палыч @ Jul 7 2009, 11:34) *
1. Загрузчик распологается в верхних адресах. Нулевой вертор автоматически (в программе на Си) содержит команду jmp на начало загрузчика.
2. При старте по подаче питания управление передаётся загрузчику.

Я все-равно не понял. Как нулевой вектор сделать так, что бы он ссылался на бутлоадер.
По-порядку. В общем я в мейк-файле как и оговаривось дописал "BOOTLOADER_ADDRESS = 0x00С00 и LDFLAGS += -Wl,--section-start=.text=$(BOOTLOADER_ADDRESS)"
После этого hex-файл сгенерировался следующего вида: с адресса 0 до С00 у меня FF-ки, а уже вектора прерываний размещены по адрессу C00, а далее программа (нулевой вектор храниn jmp на адресс С00+N). А мне же нужно сделать что бы вектора прерываний размещались с 0 до-ого N-го адресса (сколько там прерываний), нулевой хранил jmp на C00. Как это сделать?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- piz2383   bootloader для Atmega48   Jun 27 2009, 21:47
- - Сергей Борщ   Да, все совершенно правильно. Первую рабочую прогр...   Jun 27 2009, 23:32
- - piz2383   Ещё вот такой вопрос. У нас нет фуза для перехода ...   Jun 28 2009, 06:24
|- - smac   Цитата(piz2383 @ Jun 28 2009, 10:24) Ещё ...   Jun 28 2009, 13:29
|- - head_sk   Цитата(smac @ Jun 28 2009, 16:29) Наверно...   Jul 6 2009, 05:43
|- - Сергей Борщ   Цитата(head_sk @ Jul 6 2009, 08:43) Мне в...   Jul 6 2009, 07:19
- - piz2383   В общем начал реализовывать все выше сказанное... ...   Jun 29 2009, 00:02
|- - SysRq   Цитата(piz2383 @ Jun 29 2009, 04:02) В по...   Jun 29 2009, 08:14
|- - piz2383   Цитата(SysRq @ Jun 29 2009, 11:14) Считай...   Jun 29 2009, 09:35
|- - dimka76   Цитата(piz2383 @ Jun 29 2009, 13:35) Код ...   Jun 29 2009, 10:32
|- - SysRq   Цитата(piz2383 @ Jun 29 2009, 13:35) ...и...   Jun 29 2009, 10:57
- - piz2383   В симуляторе все отлично. И главное если прошить д...   Jun 29 2009, 10:55
|- - dimka76   Цитата(piz2383 @ Jun 29 2009, 14:55) То в...   Jun 30 2009, 04:55
- - head_sk   А почему нельзя просто таблицу векторов прерывания...   Jul 6 2009, 16:48
|- - Сергей Борщ   Цитата(head_sk @ Jul 6 2009, 19:48) А поч...   Jul 6 2009, 18:25
|- - Сергей Борщ   Цитата(piz2383 @ Jul 7 2009, 12:08) А мне...   Jul 7 2009, 09:45
|- - Палыч   BOOTLOADER_ADDRESS - это, как я понимаю, секция дл...   Jul 7 2009, 09:45
- - XVR   Подкрутить файл скрипта линкера (*.ld). Там настра...   Jul 7 2009, 08:05


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 07:39
Рейтинг@Mail.ru


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