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

LPC23XX. Запуск программы в RAM

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

Наверняка кто-нибудь делал это? Подскажет кто-нибудь как это сделать?

Изменено пользователем Step_ARM

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


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

Если Вам нужно загрузить одну такую программу, или несколько однотипных, то можно линковать её статически на определенные адреса в памяти к определенной версии программы во флеше. Похоже на работу с загрузчиком во флеш...

Иначе придется использовать Dynamic Linking, точно как программы на ПК загружаются. Посмотрите также ELF, есть его спецификация для ARM. Для ARM7 имхо сложновато будет.

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


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

Я может чего-то не понимаю...

Если взять обычную программу объемом к примеру 3-4кБ, указать при ините режим работы в оперативке, скомпилить ее с указанием адресов в памяти 0х40000040(для таблицы векторов).

Указать точку входа -- адрес 0х40000040.

Разве так не будет работать?

Как же тогда работает программа загрузчик через JTAG она ведь грузится в оперативку?

Дело в том , что мне не важно что произойдет с программой на флэш.

Всвязи с этим еще возникает вопрос -- как программно запустить исполняемую программу сначала т.е. с нулевого адреса флэш?

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


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

Всвязи с этим еще возникает вопрос -- как программно запустить исполняемую программу сначала т.е. с нулевого адреса флэш?

 

MOV pc, #0;

 

((void (*)(void))0)();

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


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

MOV pc, #0;

 

((void (*)(void))0)();

Действительно

start=(void (*)(void))START_ADDR;

start();

запускает программу заново.

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


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

Действительно

start=(void (*)(void))START_ADDR;

start();

запускает программу заново.

 

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

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


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

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

Я делал не с ресета, с адреса фактически исполняемого кода-- нормально. Прога заново все инитит и все...

Но от темы мы все-таки уклонились -- читай [1] и [3].

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


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

Так по теме все просто!

Делаете программу для RAM, можно и отлаживать прямо в RAM ( среды разработки это позволяют, с помощью макросов при старте отладки инитится RAM, remap...).

Потом полученных hex файл, конвертируете в нужный вам формат...

А бутлоадер ( или другая ваша программа) инитит RAM, remap.... грузит файл в память и запускает. ( По принципу как и отладка прямо в рам).

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


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

Так по теме все просто!

Делаете программу для 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 памяти).

Если да , то какие надо дать настройки линкеру... (ИАР)

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


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

1. Записать на внешний носитель эту прогу (с таблицей векторов или без нее?)

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

 

2. Прочитать из основной программы(кот. на флэш) прогу с внешнего носителя в память с адреса (0х40000000 или 0х40000040?)

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

Конечно писать с адреса 0x40000000 ( то что отремаплено все равно надо сохранить)

 

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

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

 

4. Запустить

start=(void (*)(void))0x40000040(или0х40000000);

start();

если ремап ( свои обработчики ) то на 0 и переходить.

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

 

 

И еще возможно ли запустить такую загруженную снаружи программу в старших адресах (например, в Ethernet или USB памяти).

Если да , то какие надо дать настройки линкеру... (ИАР)

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

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

а настройки линкеру примерно такие же как и для обычной отладки в РАМ.

 

IMHO все эти вопросы у вас возникли потому что вы пользуетесь визуальными настройками а не XCL/ICF файлами. Стоит вам посмотреть как работает стартап, написать свои XCL файлы... Пройти программу пошагам не от main, а от перовй инструкции все эти вопросы отпадут сами собой.

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


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

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 байта исполняемой программы должны быть вида:

_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. Пить пиво
Можно и коньячку.

 

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

 

Удачи.

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


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

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

Например вывод на графический дисплей уже не помещается.

 

Как запустить в RAM , используя всю оперативку 8кБ + USB(8кБ) +Ethernet (16кБ)???

В файле конфигурации IAR есть только начало и конец RAM. Как же определить еще куски памяти ведь они идут с отступом?

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


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

У LPC23XX основной памяти 8кБ, USB_RAM -- 8кБ, Ethernet RAM -- 16кБ. Между ними резервные области памяти.

Возможна ли в IAR настройка xcl при которой будет использоваться вся память с отключенными резервными сегментами?

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


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

У 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 так не умеет.

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


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

Возможна ли в IAR настройка xcl при которой будет использоваться вся память с отключенными резервными сегментами?

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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