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

 
 
> самописный бутлоадер для m128, самописный бутлоадер для m128
IVN2013
сообщение Dec 25 2013, 21:32
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 12-08-13
Пользователь №: 77 889



Доброго времени суток! После написания простенького бутлоадера на ассемблере для m8515 начал писать бутлоадер на си++
в atmel studio 6 для m128. До этого использовал stk500, теперь работаю с jtag ice. С си++ дела раньше не имел. Возник ряд вопросов. Не понимаю
как перейти в область бутлоадера, для написания его части кода, пробовал "jmp адрес"" или объявлял "bootloader section;" но при пошаговой отладке по
jtag просматривал память и не видел чтобы дальнейший код шел в области лоадера. Подскажите пожалуйста что может быть не так и как лучше осуществить этот переход. Или он произошел но не отображается?

И еще подойдет ли boot_page_fill(address, data); для ввода данных в память а boot_page_erase ( address ) чтобы стирать страницы? Если можно бросьте какой нить образец или ссылку на ресурс где это обсуждается!



Заранее спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
IVN2013
сообщение Jan 12 2014, 22:08
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 12-08-13
Пользователь №: 77 889



Большое спасибо за ответ! С утра буду опять мучать контроллер.
В данной ситуации меня попросили сделать именно так, чтобы грузилась основная программа, поэтому тут мне выбирать не приходится.

По поводу опций линкера не совсем понял что значит параметр ".text" в примере -Wl,--section-start=.text=0x30000 ?, нашел относительно этого пример на http://www.nongnu.org/avr-libc/user-manual...#faq_reloc_code ,
там приводится пример: -Wl,--section-start=.bootloader=0x1E000, т.е. указывается ".bootloader".


Относительно отдельного определения положения функций, по той же ссылке, приводится следующее:
First, the code should be put into a new named section. This is done with a section attribute: __attribute__ ((section (".bootloader")))

In this example, .bootloader is the name of the new section. This attribute needs to be placed after the prototype of any function to force the function into the new section.
void boot(void) __attribute__ ((section (".bootloader")));
и далее To relocate the section to a fixed address the linker flag --section-start is used. This option can be passed to the linker using the -Wl compiler option:
-Wl,--section-start=.bootloader=0x1E000

Не пойму - что здесь такое - "атрибут" ? , и здесь ".bootloader" это произвольное название секции которое указываем в опции линкера: -Wl,--section-start=.bootloader=0x1E000 ?
Т.е. в любом случае нужно указывать название и адрес области в линкере? Что - то начинаю совсем запутываться )

Цитата(_Артём_ @ Jan 12 2014, 19:02) *
Только зачем макрос BOOTLOADER_SECTION? Не лучше ли всю программу сместить с помощью опций линкера?


Даже не знаю, может быть и лучше. Дело в том, что попросили сделать так чтобы старт был именно из application части.
Возможно при этом будет удобнее залить тестовую программу в application часть, для отладки и отдельно часть бутлоадера. А для этого нужно раскидывать код по отдельности.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jan 13 2014, 08:39
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(IVN2013 @ Jan 13 2014, 02:08) *
Даже не знаю, может быть и лучше. Дело в том, что попросили сделать так чтобы старт был именно из application части.
Возможно при этом будет удобнее залить тестовую программу в application часть, для отладки и отдельно часть бутлоадера. А для этого нужно раскидывать код по отдельности.


Это очень нестандартное решение, которое потом приведёт к сбоям. Изначально у Вас есть и приложение и загрузчик. Процессор стартует из секции приложения, потом переходит на загрузчик, после чего начинается обновление секции приложения. Тут происходит сбой, секция приложения работает некорректно, переход на загрузчик не осуществляется, у Вас в руках кирпич.
Сделайте так как делают все. По фуз-битам определите запуск из секции загрузчика, расположите там минимальный загрузчик, способный выполнить функции обновления приложения, проверки секции приложения и запуск приложения на исполнение.
Тут главная задача - написать загрузчик максимально безбаговый, но при этом выполняющий возложенные на него функции. Обновить загрузчик в мегах без перепрошивки процессора врятли получится (с некоторой степенью риска такая задача возможна на ARM).
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 13 2014, 08:54
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(mempfis_ @ Jan 13 2014, 10:39) *
Это очень нестандартное решение, которое потом приведёт к сбоям. Изначально у Вас есть и приложение и загрузчик. Процессор стартует из секции приложения, потом переходит на загрузчик, после чего начинается обновление секции приложения. Тут происходит сбой, секция приложения работает некорректно, переход на загрузчик не осуществляется, у Вас в руках кирпич.


Кстати, да, вы соверщенно правильно акцентировали на этом моменте внимание. Полностью согласен.

Сначала должен стартовать загрузчик, потом приложение. И никак иначе.




Цитата(mempfis_ @ Jan 13 2014, 10:39) *
Обновить загрузчик в мегах без перепрошивки процессора врятли получится (с некоторой степенью риска такая задача возможна на ARM).


Обновить можно, но проще написать без глюков. sm.gif


Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 27th July 2025 - 04:04
Рейтинг@Mail.ru


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