24212

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

Дата последнего изменения: 29.11.2023 17:12:19
Материал из настоящей статьи, относящийся к микросхеме К1986ВЕ92QI, распространяется в том числе на микроконтроллеры К1986ВЕ92FI, К1986ВЕ92F1I и К1986ВЕ94GI

В данной статье рассмотрен алгоритм запуска программы из памяти ОЗУ в среде IAR. Для этих целей использовался МК К1986ВЕ92QI и стандартный пример "Hello world", собранный для среды IAR. Архив workspace с проектами "HelloWorld" и "HelloWorld_RAM" доступен в конце статьи. Важно отметить, что в составе архива идёт также библиотека SPL (SPL из установочного пака версии 1.0 - при наличии более новой версии установочного пака можно произвести актуализацию SPL самостоятельно), так как проекты подключают стандартные библиотечные файлы на микроконтроллер 

Создание проекта

Для демонстрации запуска программы из Flash-памяти и памяти ОЗУ сделаем два проекта "HelloWorld" и "HelloWorld_RAM", соответственно. В проект "HelloWorld_RAM" необходимо внести изменения, чтобы он отличался от стандартного проекта "HelloWorld". Для этого уменьшим в 4 раза значение задержек, определяющих период мигания светодиодом, как показано в фрагменте кода 1.

Фрагмент кода 1 - Макроопределение, определяющее период мигания светодиодом

#define LED_PERIOD 250000

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

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

После запуска проекта "HelloWorld_RAM" в среде IAR выполним его настройку. 

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

Рисунок 1 - Переход в опции проекта через панель инструментов

В открывшемся окне переходим во вкладку "Debugger→Setup" и выбираем требуемый отладчик. Во вкладке "Debugger→Download" убираем все галочки, потому что загрузка программы во Flash-память выполняться не будет (рисунок 2).

Рисунок 2 - Настройка параметров отладки во вкладке "Debugger"

Переходим в настройках проекта во вкладку "Linker". Именно здесь настраивается расположение программы в памяти ОЗУ. Можно сделать копию конфигурационного файла "MDR32F9Q2I.icf" и сохранить в директории проекта. В поле "Linker configuration file" выбираем новый конфигурационный файл "MDR32F9Q2I.icf" и нажимаем на кнопку "Edit…", как показано на рисунке 3.

Рисунок 3 - Открытие конфигурационного файла компоновщика

Во вкладке "Memory Regions" в обоих разделах ROM и RAM необходимо указать память ОЗУ, которая располагается по адресам 0x20000000-0x20007FFF. Для этого весь объём ОЗУ, который в обычном проекте целиком определён для раздела RAM, разделим на две части, при этом одну часть выделим для раздела ROM, а другую для раздела RAM. Таким образом получится конфигурация, приведённая на рисунке 4 и в фрагменте кода 2.

Фрагмент кода 2 - Диапазон адресов, выделенных для разделов ROM и RAM в конфигурационном файле компоновщика

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

Рисунок 4 - Настройка разделов ROM и RAM в конфигурационном файле компоновщика

В поле ".intvec start" вкладки "Vector Table" выбирается, где будет располагаться таблица векторов прерываний. Так как раздел ROM занимает область ОЗУ 0x20000000-0x20003FFF, то в поле ".intvec start" указываем значение 0x20000000, как показано на рисунке 5.

Рисунок 5 - Настройка таблицы векторов прерываний в конфигурационном файле компоновщика

Во вкладке "Stack/Heap Sizes" указываются размер стека и кучи. Эти значения оставим по умолчанию.

На этом настройка проекта завершена. Для настройки был использован встроенный в среду IAR редактор *.icf файлов, при этом данный файл может быть отредактирован вручную при помощи любого текстового редактора, например, блокнота (рисунок 6).

Рисунок 6 - Редактирование конфигурационного файла компоновщика в блокноте

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

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

Рисунок 7 - Запуск сессии отладки через панель инструментов, вкладка "Project→Download and Debug"

Если после закрытия отладочной сессии нажать кнопку "Reset" на отладочной плате, то период мигания светодиода изменится, потому что после сброса произойдёт штатный запуск МК и программа будет исполнятся из Flash-памяти.


Сохранить статью в PDF

Файлы для скачивания

Программное обеспечение

Теги

Была ли статья полезной?