Инструменты пользователя

Инструменты сайта


prog:spec:ram_iar

Запуск программы в ОЗУ из IAR

В продолжение статьи Запуск программы в ОЗУ из Keil здесь мы рассмотрим, как запустить программу из ОЗУ в среде IAR. Для этих целей будем использовать МК 1986ВЕ92У и стандартный пример "Hello world", который можно скачать с GitHub.

Сделаем копию этого проекта и назовем HelloWorld_RAM. Чтобы в дальнейшем понимать, откуда у нас запускается программа, в проекте HelloWorld_RAM уменьшим в два раза значение задержек, определяющих период мигания светодиодом.

#define LED_PERIOD      500000

Таким образом, при загрузке из Flash у нас мигание будет в 2 раза медленнее, чем при выполнении программы из ОЗУ. Так мы узнаем, какая программа в текущий момент работает.

Настройка проекта

Чтобы расположить все данные и функции программы по адресам в ОЗУ зайдём в опции проекта, нажав сочетание клавиш Alt+F7, либо через тулбар Project→Options .

Здесь мы переходим во вкладку Debugger→Setup и убираем галочку "Use macro file(s)". Device description file оставляем неизменным, т.к. он используется отладчиком для отображения содержимого периферийных регистров. Во вкладке Debugger→Download убираем все галочки, потому что прошивать Flash память мы не будем.

Теперь переходим в настройках проекта во вкладку Linker. Именно здесь и настраивается загрузка программы по адресам ОЗУ. Для начала сделаем копию конфигурационного файла MDR32F1.icf. Я сохранил его в папку с проектом и переименовал в MDR32F1_RAM.icf. В разделе Linker configuration file выбираем наш конфигурационный файл и кликаем на кнопку "Edit…".

В поле .intvec start выбирается, где будет располагаться таблица векторов прерываний. ОЗУ располагается по адресам 0x20000000-0x20007FFF, поэтому прописываем значение 0x20000000.

Во вкладке Memory Regions в разделе ROM вместо диапазонов памяти Flash, необходимо указать адреса ОЗУ. Для этого ту память ОЗУ, которая в обычном проекте целиком была определена в RAM поделим на две части и одну половину отдадим под раздел ROM. Таким образом у нас получается:

 ROM : start (0x20000000), end (0x20000000+0x00004000-1)
 RAM : start (0x20004000), end (0x20004000+0x00004000-1)

Во вкладке Stack/Heap Sizes указываются размер стека и кучи. Эти значения мы менять не будем. По сути, на этом настройка проекта завершена. Для настройки мы воспользовались встроенным в IAR редактором *.icf файлов, хотя можно было и отредактировать его вручную, открыв, например, в блокноте.

Запуск программы

Сначала лучше прошить МК обычным проектом Hello world, чтобы понять, изменится ли при прошивке программы в ОЗУ период мигания светодиодов. Для загрузки программы в ОЗУ выбираем Project→Download and Debug. После этого осуществляем запуск, F5. Наблюдаем мигание светодиода. Открыв окно дисассемблера (в тулбаре View→Disassembly) видим, что наша программа располагается в адресах ОЗУ, начиная с 0х20000000.

По нажатию кнопки Reset период мигания светодиода изменился, потому что программа теперь исполняется из Flash. Это объяснимо, ведь загрузку и запуск новой программы в ОЗУ выполнил отладчик через JTAG. А при возникновении Reset запуск произошел штатным режимом.

prog/spec/ram_iar.txt · Последнее изменение: 2022/04/03 23:09 (внешнее изменение)