|
|
  |
Самопрограммирование ARM, Прошивка FLASH |
|
|
|
Nov 27 2009, 12:17
|
Частый гость
 
Группа: Участник
Сообщений: 79
Регистрация: 26-04-09
Из: Москва
Пользователь №: 48 283

|
Помогите новичку Пишу bootloader для LPC 2478 под KEIL. Проблема стара, как мир - загружаю bootloader в начало флэш. . Основная программа компилируется отдельно. Бинарник основной программы заливаю через USB во флэш по заранее известному адресу. Прыгаю на этот адрес: MOV PC, #0x6000. Прога не заводится. Отдельно основная программа работает. Переход по заказанному адресу тоже происходит (проверял дебагером). При переходе на Основную программу видимо начинает выполняться Startup.s основной программы, а там все адреса от 0x0, а не от моих 0x6000. Делать Remap и выполнять основную прогу из RAM, по-моему, глупость. Вот я и мучаюсь. Сморел ветки: "прыгнуть на другой адрес ROM" http://electronix.ru/forum/index.php?showt...rt=#entry410209"Опять про загрузчик" http://electronix.ru/forum/index.php?showt...rt=#entry416511 "Самопрограммирование ARM" http://electronix.ru/forum/index.php?showt...rt=#entry385320 И многие другие, но по причине крайне малого опыта, почти ничего не понимаю. Ну ещё это можно назввать глупостью, наверное... Короче, помогите,пожалуйста. Что нужно сделать, чтобы передать управление на залитую через USB, прогу??? Заранее благодарен!!!
|
|
|
|
|
Nov 27 2009, 13:58
|

Местный
  
Группа: Свой
Сообщений: 481
Регистрация: 1-08-05
Пользователь №: 7 267

|
Дык самое простое - взять, например, "lpc24xx_usb_bootloader; AN10764 (LPC24xx USB bootloader)" с этой странички: http://www.nxp.com/pip/LPC2478_1.htmlи посмотреть...
|
|
|
|
|
Nov 28 2009, 10:20
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 11-07-08
Пользователь №: 38 870

|
Цитата(zltigo @ Mar 24 2008, 11:12)  Не лучшая, это точно.
Затереть вероятно и RAM тратится впустую, только вот на РЕМАПИРОВАНУЮ таблицу NULL не указывает. RAM тратится??? :-))) При объемах 32кБ, например, что значат 64 байта??? Не надо грешить против истины :-))) Размещение в RAM иногда наилучшее решение, особенно когда ресурсов немного. Приведу пример. Записываешь маленький загрузчик в начале флэш , который загружает с какого-то внешнего источника (датафлэш или UART, например) программу загрузчик под любые нужды(USB, SD Card и т.п.) в RAM. Старт загрузчика... При этом загрузчик в начале флэш получается очень маленький (можно вписаться в 4кБ). При работе загрузчика по барабану как RAM тратится. Ничего не затрешь. Или такой пример. У меня стоит датафлэш со всякого рода картинками и загрузка этих картинок так и сделана -- с SD карты загрузчик записывается в RAM и записывает картинки на датафлэш. Экономия флэш около 6 кБ.
|
|
|
|
|
Nov 28 2009, 12:27
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Step_ARM @ Nov 28 2009, 13:20)  RAM тратится??? :-))) При объемах 32кБ, например, что значат 64 байта??? Проблема не в том, что тратится, а в том, что тратится без всякой надобности. 32K RAM, говорите у Вас? Тогда сколько у Вас Flash? - сотни К- полмега и при этом Вы в качестве весомого аргумента пытаетесь представить "Экономия флэш около 6 кБ" Так вот, Ваши слова Цитата Не надо грешить против истины :-))) К Вам и относятся. Цитата Размещение в RAM иногда наилучшее решение, особенно когда ресурсов немного. Иногда имеют право быть ЛЮБЫЕ решения. Но львиная доля из возможных - ну очень иногда. Кроме того, причем тут грузить или не грузить нечто в RAM, если я говорил только о том, что размещение таблицы векторов в RAM можно не использовать никогда и не испытывать при этом никаких проблем ни с чем.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 28 2009, 21:00
|
Частый гость
 
Группа: Участник
Сообщений: 79
Регистрация: 26-04-09
Из: Москва
Пользователь №: 48 283

|
Цитата(goodwin @ Nov 27 2009, 16:58)  Дык самое простое - взять, например, "lpc24xx_usb_bootloader; AN10764 (LPC24xx USB bootloader)" 1.Я, правда, не понимаю, как реализован в этом примере запуск загруженной программы. а) загрузили прогу через какой-то интерфейс во flash; б) Скопировали вектора в начало RAM; в) Установили REMAP; г) Дальше-то как и что? Как заставить выполняться загруженную программу? 2. Тут вот в этой же ветке уважаемый zltigo предлагает в RAM вообще ничего не копировать. И мне эта идея очень нравится. Но вот опять же не пойму, как запустить прогу?
|
|
|
|
|
Nov 29 2009, 20:33
|
Частый гость
 
Группа: Участник
Сообщений: 79
Регистрация: 26-04-09
Из: Москва
Пользователь №: 48 283

|
Цитата(zltigo @ Nov 29 2009, 02:32)  Ну неужели не понятно, что в Вас проблемы НЕ с передаче управления, а в собственно программе. Понятно... Я вот как представляю суть этой проблемы... В загружаемой программе у меня все адреса функций считаются от 0x0, но эта самая программа загружается bootloader'ом, не в нулевой адрес. Она начинается у меня с 0x6000. Прога прыгает на адрес 0x6000, но после выполнения первой же инструкции опять возвращается в bootloader, так опять же эта инструкция оперирует адресом, который отсчитан от 0х0, а не от 0х6000. Вот что с этим делать, я и спрашиваю уважаемых форумчан, так как сам не допетриваю.
|
|
|
|
|
Nov 30 2009, 04:07
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 11-07-08
Пользователь №: 38 870

|
Цитата(zltigo @ Nov 28 2009, 15:27)  32K RAM, говорите у Вас? Тогда сколько у Вас Flash? - сотни К- полмега и при этом Вы в качестве весомого аргумента пытаетесь представить "Экономия флэш около 6 кБ" Это Вам, уважаемый zltigo, позволяют ставить камни с сотнями кБ... А мне со скрипом разрешают ставить LPC. У меня же 32 кБ RAM и 128кБ flash. Программа не дописана, а уже 120 кБ занято. А надо-то чуть-чуть дописать. В этом случае 6кБ флэш--это весомый аргумент... Хватит, чтобы навести красоту:-))).
|
|
|
|
|
Nov 30 2009, 08:14
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Цитата Неудивительно, что ничего не работает. В проге обычно есть загрузка в регистр прямых адресов констант/функций и прочего. Если прога компилируется для работы с адреса 0, то она НЕ БУДЕТ работать на адресе 0х6000. Короче, прога должна работать на своём адресе. Для этого её нужно перекомпилировать (перелинковать) на другой адрес. Берётся скрипт линкера и в нём правится адрес начала флэш на нужный 0х6000. Потом перелинковка и всё. Прошивку можно заливать по адресу 0х6000. Пытался запустить приложение скомпилированное для адреса 0х0000 с произвольного адреса, не получилось даже с правкой бинарника в некоторых местах. Различия в приложениях не велики, думаю при желании можно выявить закономерности. Непонятно почему в приложении используются абсолютные адреса, а не относительные и можно ли это исправить.
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Nov 30 2009, 08:26
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Цитата Самому написать компилятор Угу первое что приходит на ум. Может как-то менее трудозатратное.
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Nov 30 2009, 08:57
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Цитата А потребность-то в чём? Нужа такая прошивка, которую можно грузить по любому адресу флэша (ну типа туда, где в данный момент свободно) и там же её выполнять? Ну вобщем да, или есть уже готовая прошивка без исходников которую нет возможности запустить с нулевого адреса. А так бы прерывания "отремапил" прыгнул куда надо и всё.
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|