Перейти к содержанию
    

Самопрограммирование ARM

Я такую проблему решал..

Некоторые проблемы нужно не пытаться "решать" их нужно просто самому себе НЕ создавать.

Это даже не говоря о том, что в данном случае "решаемой" проблемы не существует в принципе - ну какая разнича - попытается штатный загрузчик запустить чего нибудь недопрошитое или не попытается запустить? Все равно результат один - средствами штатного загрузчика перешивать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите новичку

Пишу bootloader для LPC 2478 под KEIL.

 

Проблема стара, как мир - загружаю bootloader в начало флэш. . Основная программа компилируется отдельно. Бинарник основной программы заливаю через USB во флэш по заранее известному адресу. Прыгаю на этот адрес: MOV PC, #0x6000. Прога не заводится. Отдельно основная программа работает. Переход по заказанному адресу тоже происходит (проверял дебагером). При переходе на Основную программу видимо начинает выполняться Startup.s основной программы, а там все адреса от 0x0, а не от моих 0x6000. Делать Remap и выполнять основную прогу из RAM, по-моему, глупость. Вот я и мучаюсь.

 

Сморел ветки:

"прыгнуть на другой адрес ROM"

http://electronix.ru/forum/index.php?showt...rt=&do=findComment&comment=410209

"Опять про загрузчик"

http://electronix.ru/forum/index.php?showt...rt=&do=findComment&comment=416511

"Самопрограммирование ARM"

http://electronix.ru/forum/index.php?showt...rt=&do=findComment&comment=385320

И многие другие, но по причине крайне малого опыта, почти ничего не понимаю. Ну ещё это можно назввать глупостью, наверное... Короче, помогите,пожалуйста.

Что нужно сделать, чтобы передать управление на залитую через USB, прогу???

 

Заранее благодарен!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык самое простое - взять, например, "lpc24xx_usb_bootloader; AN10764 (LPC24xx USB bootloader)"

с этой странички: http://www.nxp.com/pip/LPC2478_1.html

и посмотреть...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не лучшая, это точно.

 

Затереть вероятно и RAM тратится впустую, только вот на РЕМАПИРОВАНУЮ таблицу NULL не указывает.

RAM тратится??? :-))) При объемах 32кБ, например, что значат 64 байта???

Не надо грешить против истины :-)))

Размещение в RAM иногда наилучшее решение, особенно когда ресурсов немного.

 

Приведу пример. Записываешь маленький загрузчик в начале флэш , который загружает с какого-то внешнего источника (датафлэш или UART, например) программу загрузчик под любые нужды(USB, SD Card и т.п.) в RAM. Старт загрузчика...

При этом загрузчик в начале флэш получается очень маленький (можно вписаться в 4кБ).

При работе загрузчика по барабану как RAM тратится. Ничего не затрешь.

 

Или такой пример. У меня стоит датафлэш со всякого рода картинками и загрузка этих картинок так и сделана -- с SD карты загрузчик записывается в RAM и записывает картинки на датафлэш. Экономия флэш около 6 кБ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

RAM тратится??? :-))) При объемах 32кБ, например, что значат 64 байта???

Проблема не в том, что тратится, а в том, что тратится без всякой надобности.

32K RAM, говорите у Вас? Тогда сколько у Вас Flash? - сотни К- полмега и при этом Вы в качестве весомого аргумента пытаетесь представить "Экономия флэш около 6 кБ"

Так вот, Ваши слова

Не надо грешить против истины :-)))

К Вам и относятся.

Размещение в RAM иногда наилучшее решение, особенно когда ресурсов немного.

Иногда имеют право быть ЛЮБЫЕ решения. Но львиная доля из возможных - ну очень иногда. Кроме того, причем тут грузить или не грузить нечто в RAM, если я говорил только о том, что размещение таблицы векторов в RAM можно не использовать никогда и не испытывать при этом никаких проблем ни с чем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык самое простое - взять, например, "lpc24xx_usb_bootloader; AN10764 (LPC24xx USB bootloader)"

1.Я, правда, не понимаю, как реализован в этом примере запуск загруженной программы.

а) загрузили прогу через какой-то интерфейс во flash;

б) Скопировали вектора в начало RAM;

в) Установили REMAP;

г) Дальше-то как и что? Как заставить выполняться загруженную программу?

 

2. Тут вот в этой же ветке уважаемый zltigo предлагает в RAM вообще ничего не копировать. И мне эта идея очень нравится. Но вот опять же не пойму, как запустить прогу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

г) Дальше-то как и что? Как заставить выполняться загруженную программу?

Jump/Call. Любым способом http://electronix.ru/forum/index.php?showtopic=35580

Спрашиваете одно и то-же постоянно, уже где-то утверждали, что под отладчиком переход видите. Ну неужели не понятно, что в Вас проблемы НЕ с передаче управления, а в собственно программе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну неужели не понятно, что в Вас проблемы НЕ с передаче управления, а в собственно программе.

Понятно... Я вот как представляю суть этой проблемы...

В загружаемой программе у меня все адреса функций считаются от 0x0, но эта самая программа загружается bootloader'ом, не в нулевой адрес. Она начинается у меня с 0x6000. Прога прыгает на адрес 0x6000, но после выполнения первой же инструкции опять возвращается в bootloader, так опять же эта инструкция оперирует адресом, который отсчитан от 0х0, а не от 0х6000. Вот что с этим делать, я и спрашиваю уважаемых форумчан, так как сам не допетриваю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32K RAM, говорите у Вас? Тогда сколько у Вас Flash? - сотни К- полмега и при этом Вы в качестве весомого аргумента пытаетесь представить "Экономия флэш около 6 кБ"

 

Это Вам, уважаемый zltigo, позволяют ставить камни с сотнями кБ... А мне со скрипом разрешают ставить LPC.

У меня же 32 кБ RAM и 128кБ flash. Программа не дописана, а уже 120 кБ занято. А надо-то чуть-чуть дописать. В этом случае 6кБ флэш--это весомый аргумент...

Хватит, чтобы навести красоту:-))).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В загружаемой программе у меня все адреса функций считаются от 0x0, но эта самая программа загружается bootloader'ом, не в нулевой адрес. Она начинается у меня с 0x6000.

Неудивительно, что ничего не работает. В проге обычно есть загрузка в регистр прямых адресов констант/функций и прочего. Если прога компилируется для работы с адреса 0, то она НЕ БУДЕТ работать на адресе 0х6000. Короче, прога должна работать на своём адресе. Для этого её нужно перекомпилировать (перелинковать) на другой адрес. Берётся скрипт линкера и в нём правится адрес начала флэш на нужный 0х6000. Потом перелинковка и всё. Прошивку можно заливать по адресу 0х6000.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неудивительно, что ничего не работает. В проге обычно есть загрузка в регистр прямых адресов констант/функций и прочего. Если прога компилируется для работы с адреса 0, то она НЕ БУДЕТ работать на адресе 0х6000. Короче, прога должна работать на своём адресе. Для этого её нужно перекомпилировать (перелинковать) на другой адрес. Берётся скрипт линкера и в нём правится адрес начала флэш на нужный 0х6000. Потом перелинковка и всё. Прошивку можно заливать по адресу 0х6000.

Пытался запустить приложение скомпилированное для адреса 0х0000 с произвольного адреса, не получилось даже с правкой бинарника в некоторых местах. Различия в приложениях не велики, думаю при желании можно выявить закономерности. Непонятно почему в приложении используются абсолютные адреса, а не относительные и можно ли это исправить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Непонятно почему в приложении используются абсолютные адреса, а не относительные и можно ли это исправить.

Ну вообще-то, можно. Самому написать компилятор :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Самому написать компилятор

Угу первое что приходит на ум. Может как-то менее трудозатратное.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Угу первое что приходит на ум. Может как-то менее трудозатратное.

А потребность-то в чём? Нужа такая прошивка, которую можно грузить по любому адресу флэша (ну типа туда, где в данный момент свободно) и там же её выполнять?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А потребность-то в чём? Нужа такая прошивка, которую можно грузить по любому адресу флэша (ну типа туда, где в данный момент свободно) и там же её выполнять?

Ну вобщем да, или есть уже готовая прошивка без исходников которую нет возможности запустить с нулевого адреса. А так бы прерывания "отремапил" прыгнул куда надо и всё.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...