|
LPC23XX. Запуск программы в RAM |
|
|
|
May 25 2009, 05:14
|

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

|
Если Вам нужно загрузить одну такую программу, или несколько однотипных, то можно линковать её статически на определенные адреса в памяти к определенной версии программы во флеше. Похоже на работу с загрузчиком во флеш... Иначе придется использовать Dynamic Linking, точно как программы на ПК загружаются. Посмотрите также ELF, есть его спецификация для ARM. Для ARM7 имхо сложновато будет.
|
|
|
|
|
May 25 2009, 07:16
|

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

|
Цитата(Step_ARM @ May 25 2009, 11:07)  Всвязи с этим еще возникает вопрос -- как программно запустить исполняемую программу сначала т.е. с нулевого адреса флэш? Код MOV pc, #0; Код ((void (*)(void))0)();
|
|
|
|
|
May 25 2009, 07:23
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 11-07-08
Пользователь №: 38 870

|
Цитата(meister @ May 25 2009, 11:16)  Код MOV pc, #0; Код ((void (*)(void))0)(); Действительно start=(void (*)(void))START_ADDR; start(); запускает программу заново.
|
|
|
|
|
May 25 2009, 08:36
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 11-07-08
Пользователь №: 38 870

|
Цитата(KRS @ May 25 2009, 12:02)  Опасный способ, потому что обычно, когда проц начинает исполнять программу с Reset Vectora он вышел из ресета ( переферрия выключена...). IMHO лучше использовать программный сброс! ( Например при помощи watchdog или другие механизмы бывают...) Я делал не с ресета, с адреса фактически исполняемого кода-- нормально. Прога заново все инитит и все... Но от темы мы все-таки уклонились -- читай [1] и [3].
|
|
|
|
|
May 25 2009, 11:05
|
Частый гость
 
Группа: Участник
Сообщений: 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 памяти). Если да , то какие надо дать настройки линкеру... (ИАР)
|
|
|
|
|
May 25 2009, 16:30
|

Профессионал
    
Группа: Модераторы
Сообщений: 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, а от перовй инструкции все эти вопросы отпадут сами собой.
|
|
|
|
|
May 26 2009, 03:05
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
May 27 2009, 07:48
|

Местный
  
Группа: Участник
Сообщений: 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 так не умеет.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|