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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> LPC23XX. Запуск программы в RAM
Step_ARM
сообщение May 25 2009, 04:28
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 11-07-08
Пользователь №: 38 870



Задача следующая. Надо Загрузить с внешнего носителя (датафлэш ,SD) программу в RAM и запустить в RAM из программы на флэш.
Наверняка кто-нибудь делал это? Подскажет кто-нибудь как это сделать?

Сообщение отредактировал Step_ARM - May 25 2009, 04:28
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение May 25 2009, 05:14
Сообщение #2


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Если Вам нужно загрузить одну такую программу, или несколько однотипных, то можно линковать её статически на определенные адреса в памяти к определенной версии программы во флеше. Похоже на работу с загрузчиком во флеш...
Иначе придется использовать Dynamic Linking, точно как программы на ПК загружаются. Посмотрите также ELF, есть его спецификация для ARM. Для ARM7 имхо сложновато будет.
Go to the top of the page
 
+Quote Post
Step_ARM
сообщение May 25 2009, 07:07
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 11-07-08
Пользователь №: 38 870



Я может чего-то не понимаю...
Если взять обычную программу объемом к примеру 3-4кБ, указать при ините режим работы в оперативке, скомпилить ее с указанием адресов в памяти 0х40000040(для таблицы векторов).
Указать точку входа -- адрес 0х40000040.
Разве так не будет работать?
Как же тогда работает программа загрузчик через JTAG она ведь грузится в оперативку?
Дело в том , что мне не важно что произойдет с программой на флэш.
Всвязи с этим еще возникает вопрос -- как программно запустить исполняемую программу сначала т.е. с нулевого адреса флэш?
Go to the top of the page
 
+Quote Post
meister
сообщение May 25 2009, 07:16
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(Step_ARM @ May 25 2009, 11:07) *
Всвязи с этим еще возникает вопрос -- как программно запустить исполняемую программу сначала т.е. с нулевого адреса флэш?


Код
MOV pc, #0;


Код
((void (*)(void))0)();
Go to the top of the page
 
+Quote Post
Step_ARM
сообщение May 25 2009, 07:23
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 11-07-08
Пользователь №: 38 870



Цитата(meister @ May 25 2009, 11:16) *
Код
MOV pc, #0;


Код
((void (*)(void))0)();

Действительно
start=(void (*)(void))START_ADDR;
start();
запускает программу заново.
Go to the top of the page
 
+Quote Post
KRS
сообщение May 25 2009, 08:02
Сообщение #6


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Step_ARM @ May 25 2009, 11:23) *
Действительно
start=(void (*)(void))START_ADDR;
start();
запускает программу заново.


Опасный способ, потому что обычно, когда проц начинает исполнять программу с Reset Vectora он вышел из ресета ( переферрия выключена...). IMHO лучше использовать программный сброс! ( Например при помощи watchdog или другие механизмы бывают...)
Go to the top of the page
 
+Quote Post
Step_ARM
сообщение May 25 2009, 08:36
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 11-07-08
Пользователь №: 38 870



Цитата(KRS @ May 25 2009, 12:02) *
Опасный способ, потому что обычно, когда проц начинает исполнять программу с Reset Vectora он вышел из ресета ( переферрия выключена...). IMHO лучше использовать программный сброс! ( Например при помощи watchdog или другие механизмы бывают...)

Я делал не с ресета, с адреса фактически исполняемого кода-- нормально. Прога заново все инитит и все...
Но от темы мы все-таки уклонились -- читай [1] и [3].
Go to the top of the page
 
+Quote Post
KRS
сообщение May 25 2009, 08:42
Сообщение #8


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Так по теме все просто!
Делаете программу для RAM, можно и отлаживать прямо в RAM ( среды разработки это позволяют, с помощью макросов при старте отладки инитится RAM, remap...).
Потом полученных hex файл, конвертируете в нужный вам формат...
А бутлоадер ( или другая ваша программа) инитит RAM, remap.... грузит файл в память и запускает. ( По принципу как и отладка прямо в рам).
Go to the top of the page
 
+Quote Post
Step_ARM
сообщение May 25 2009, 11:05
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 11-07-08
Пользователь №: 38 870



Цитата(KRS @ May 25 2009, 12:42) *
Так по теме все просто!
Делаете программу для RAM, можно и отлаживать прямо в RAM ( среды разработки это позволяют, с помощью макросов при старте отладки инитится RAM, remap...).
Потом полученных hex файл, конвертируете в нужный вам формат...
А бутлоадер ( или другая ваша программа) инитит RAM, remap.... грузит файл в память и запускает. ( По принципу как и отладка прямо в рам).

Ну наверное не все так просто... Сделал я программу для RAM. В дебаггере запускается, выводит на индикатор сообщение. Смотрю память -- действительно прога там висит и флэш нетронута.
Далее мои действия:
1. Записать на внешний носитель эту прогу (с таблицей векторов или без нее?)
2. Прочитать из основной программы(кот. на флэш) прогу с внешнего носителя в память с адреса (0х40000000 или 0х40000040?)
3. Настроить -- MEMMAP=0x02
4. Запустить
start=(void (*)(void))0x40000040(или0х40000000);
start();
5. Пить пиво
Так или нет?

И еще возможно ли запустить такую загруженную снаружи программу в старших адресах (например, в Ethernet или USB памяти).
Если да , то какие надо дать настройки линкеру... (ИАР)
Go to the top of the page
 
+Quote Post
KRS
сообщение May 25 2009, 16:30
Сообщение #10


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Step_ARM @ May 25 2009, 15:05) *
1. Записать на внешний носитель эту прогу (с таблицей векторов или без нее?)

это зависиит от вашей реализации. для ARM7 можно сделать стандартный код обработчика который в итоге (или сразу) переходит на обработчик заданный в VIC

Цитата(Step_ARM @ May 25 2009, 15:05) *
2. Прочитать из основной программы(кот. на флэш) прогу с внешнего носителя в память с адреса (0х40000000 или 0х40000040?)

Насколько я понял у вас LPC? ( это у них ремап на 64 байта)
Конечно писать с адреса 0x40000000 ( то что отремаплено все равно надо сохранить)

Цитата(Step_ARM @ May 25 2009, 15:05) *
3. Настроить -- MEMMAP=0x02

Если у вас не стандартные обработчики в загрузчике то да!

Цитата(Step_ARM @ May 25 2009, 15:05) *
4. Запустить
start=(void (*)(void))0x40000040(или0х40000000);
start();

если ремап ( свои обработчики ) то на 0 и переходить.
если стандартные (в загрузчике) - то логичнее точку входа сделать в начале RAM


Цитата(Step_ARM @ May 25 2009, 15:05) *
И еще возможно ли запустить такую загруженную снаружи программу в старших адресах (например, в Ethernet или USB памяти).
Если да , то какие надо дать настройки линкеру... (ИАР)

Не пробовал, но должно работать - только надо этоу память обычно проинитить ( включить устройство...)
НО НЕ РАЗУМНО там размещать код - это память медленнее и к тому же там может работать DMA что ценно иногда для данных
а настройки линкеру примерно такие же как и для обычной отладки в РАМ.

IMHO все эти вопросы у вас возникли потому что вы пользуетесь визуальными настройками а не XCL/ICF файлами. Стоит вам посмотреть как работает стартап, написать свои XCL файлы... Пройти программу пошагам не от main, а от перовй инструкции все эти вопросы отпадут сами собой.
Go to the top of the page
 
+Quote Post
Troll
сообщение May 26 2009, 03:05
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 104
Регистрация: 30-06-05
Из: С-Петербург
Пользователь №: 6 406



Цитата
1. Записать на внешний носитель эту прогу (с таблицей векторов или без нее?)
Забыли шаг 0. Необходимо собрать (слинковать) исполняемую программу с адреса 0х40000000 в бинарник(если конечно хотите просто копировать в RAM без всяких преобразований). Естественно таблица векторов исполняемой программы должна быть в этом бинарнике и располагаться вначале.
После этого записать бинарник на внешний носитель (датафлэш ,SD).

Цитата
Прочитать из основной программы(кот. на флэш) прогу с внешнего носителя в память с адреса (0х40000000 или 0х40000040?)
Как считали данные с внеш. носителя: отключить прерывания, скопировать данные в RAM с адреса 0х40000000. При этом загрузчик, который записан во флэш контроллера, должен быть собран так, чтобы переменные загрузчика не располагались по адресам 0х40000000 - (0х40000000+Длина исполняемой программы) иначе при копировании загрузчик похерит сам себя.

Цитата
3. Настроить -- MEMMAP=0x02
Да.

Цитата
4. Запустить
start=(void (*)(void))0x40000040(или0х40000000);
start();
с адреса 0х40000000 или 0х0, если сделали ремап на ОЗУ, то это уже одни и теже адреса.

первые 64 байта исполняемой программы должны быть вида:
CODE
_exception_vectors:
LDR PC, ResetAddr /* Reset */
LDR PC, UndefAddr /* Undefined instruction */
LDR PC, SWIAddr /* Software interrupt */
LDR PC, PAbortAddr /* Prefetch abort */
LDR PC, DAbortAddr /* Data abort */
NOP /* Reserved */
LDR PC, IRQAddr /* IRQ interrupt */
LDR PC, FIQAddr /* FIQ interrupt */
ResetAddr:
.word ResetHandler
UndefAddr:
.word UndefHandler
SWIAddr:
.word SWIHandler
PAbortAddr:
.word PAbortHandler
DAbortAddr:
.word DAbortHandler
NOP
IRQAddr:
.word IRQHandler
FIQAddr:
.word FIQHandler

Цитата
5. Пить пиво
Можно и коньячку.

При использовании загрузчиков, одна из основных загвоздок, это правильно слинковать загрузчик и исполняемую программу. И правильно скопировать таблицу векторов исполняемой программы в ОЗУ (здесь тоже возможно несколько вариантов).

Удачи.


--------------------
Hemos Pasado
Go to the top of the page
 
+Quote Post
Step_ARM
сообщение May 27 2009, 05:56
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 11-07-08
Пользователь №: 38 870



Ну что ж... Заработало все прекрасно. Проблема только одна осталась. В LPC2364 всего 8кБ основной памяти. Это очень немного. Да и стеки всякие жрут уж больно много памяти.
Например вывод на графический дисплей уже не помещается.

Как запустить в RAM , используя всю оперативку 8кБ + USB(8кБ) +Ethernet (16кБ)???
В файле конфигурации IAR есть только начало и конец RAM. Как же определить еще куски памяти ведь они идут с отступом?
Go to the top of the page
 
+Quote Post
Step_ARM
сообщение May 27 2009, 07:34
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 11-07-08
Пользователь №: 38 870



У LPC23XX основной памяти 8кБ, USB_RAM -- 8кБ, Ethernet RAM -- 16кБ. Между ними резервные области памяти.
Возможна ли в IAR настройка xcl при которой будет использоваться вся память с отключенными резервными сегментами?
Go to the top of the page
 
+Quote Post
meister
сообщение May 27 2009, 07:48
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(Step_ARM @ May 27 2009, 11:34) *
У LPC23XX основной памяти 8кБ, USB_RAM -- 8кБ, Ethernet RAM -- 16кБ. Между ними резервные области памяти.
Возможна ли в IAR настройка xcl при которой будет использоваться вся память с отключенными резервными сегментами?


Код
To alocate specific areas of memory to SEGA and SEGB:

-Z(CODE)SEGA,SEGB=100-1FF,400-6FF,1000

In this example SEGA will be placed between address 100 and 1FF, if it fits in that amount of space. If it does not, XLINK will try the range 400-6FF. If none of this ranges are large enough to hold SEGA, it will start at 1000. SEGB will be placed, according to the same rules, after segment SEGA.


Но не думайте, что можно помесить половину unsigled long в одном диапазоне адресов, а вторую половину - в другом, ARM7 так не умеет.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 27 2009, 08:06
Сообщение #15


Гуру
******

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



Цитата(Step_ARM @ May 27 2009, 10:34) *
Возможна ли в IAR настройка xcl при которой будет использоваться вся память с отключенными резервными сегментами?

Для этого достаточно хотя-бы бегло почитать описание линкера идущее в комплекте с IAR. А не плодить кросспосты.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th June 2025 - 11:59
Рейтинг@Mail.ru


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