24192

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

Дата последнего изменения: 12.03.2020 14:48:47

Flash-память процессора имеет ограниченный ресурс порядка 10000 циклов перезаписи. По этой или иным причинам иногда возникает необходимость разместить программу целиком в ОЗУ-памяти микроконтроллера. Рассмотрим, как это можно реализовать средствами Keil, на примере программы мигания светодиодами - Hello World - светодиод. на примере микроконтроллера 1986ВЕ1Т.

Первым шагом нужно прошить и запустить в микроконтроллере проект "HelloWorld" и убедиться, что светодиод мигает.

Вторым шагом - сделать копию проекта и назвать ее, например, HelloWorld_RAM, чтобы не испортить исходный проект. Кроме этого в новом проекте нужно уменьшить в два раза значение задержек, определяющих период мигания светодиодом. Теперь мигание будет происходить в 2 раза чаще. Таким образом, при загрузке из Flash мигание будет в 2 раза медленней, чем при выполнении программы из ОЗУ. Таким образом можно будет узнать, какая программа работает в текущий момент.

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

Важно понимать, что все данные, функции, адреса переходов в программе должны находится по адресам в ОЗУ. Поэтому в закладке Options - Target в разделе IROM1 вместо диапазонов памяти Flash необходимо указать адреса ОЗУ. Для этого ту память ОЗУ, которая в обычном проекте целиком была определена в IRAM1 (Internal RAM1), поделим на две части и одну половину отдадим под раздел IROM1 (рисунок 1).

 Рисунок 1 - Options for Target. Вкладка 'Target' для микроконтроллера 1986ВЕ92

В МК 1986ВЕ1Т(3Т) уже имеется две области памяти ОЗУ IRAM1 и IRAM2, поэтому можно одну из них целиком выделить под IROM1. Однако, для этого подходит только память IRAM2, адреса которой начинаются с 0x20100000. Только к этой памяти имеет доступ шина AHB_Lite, поэтому код из этой памяти может исполняться (рисунок 2).

 Рисунок 2 - Options for Target. Вкладка 'Target' для микроконтроллера 1986ВЕ1Т

Далее в опциях проекта переходим в закладку Linker. В ней необходимо выбрать опцию Use Memory Layout from Target Dialog (рисунок 3).

 Рисунок 3 - Options for Target. Вкладка 'Linker'

В закладке Debug необходимо подключить в опции "Initialization File" - файл инициализации. Для этого нужно зайти в папку проекта и создать текстовый файл Setup.ini. Листинг этого файла приведен ниже:

FUNC void Setup (unsigned int region) {
region &= 0xFFFFF000;
SP = _RDWORD(region); // Setup Stack Pointer
PC = _RDWORD(region + 4); // Setup Program Counter
_WDWORD(0xE000ED08, region); // Setup Vector Table Offset Register
}
Setup(0x20000000);

В файле Setup.ini функция Setup() указывает отладчику, как инициализировать необходимые регистры в зависимости от стартового адреса программы. Функция Setup() должна быть вызвана с адресом, который был указан в IROM1, то есть Setup(0x20000000) (рисунки 1 и 2). Подключим созданный файл Setup.ini (рисунок 4).

 Рисунок 4 - Options for Target. Вкладка 'Debug' 

Во вкладке Debug->Settings нужно установить те же настройки, которые были использованы при работе с Flash. Настройки при использовании программатора ULINK2 приведены на рисунке 5.

 Рисунок 5 - Настройки программатора ULINK2

Во вкладке FlashDownload необходимо выбирать опцию "Do not Erase" и удалить алгоритм программирования. Таким образом Keil не сможет изменить записанную в Flash программу при запуске текущего проекта в ОЗУ (рисунок 6).

 Рисунок 6 - Настройки алгоритма программирования. 'Do not Erase'

Последняя вкладка - Utilites. Выключим использование драйвера для программирования Flash выбором Use External Tool for Flash Programming (рисунок 7).

 Рисунок 7 - Options for Target. Вкладка 'Utilities'

Теперь можно переходить к испытаниям.

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

Для запуска программы переходим в режим отладки Ctrl+F5. В этот момент программа загружается в ОЗУ. Затем осуществляем запуск, F5. Наблюдаем мигание светодиода. В окне ассемблера видим, что исполняемая программа располагается в адресах ОЗУ, с 0х20000000 и т.д.

В режиме исполнения из ОЗУ нельзя поставить точку останова. Keil выводит сообщение Keil: "Cannot set breakpoint(s) …". Чтобы этого не возникало, перед запуском программы нужно поставить первую точку останова. Затем когда процессор остановится на ней, можно поставить следующую и так далее. Если запуск F5 уже состоялся, то необходимо в тулбаре нажать кнопку стоп и в остановленном режиме поставить точки останова там, где это необходимо.

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


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

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

Standard Peripherals Library + software pack для Keil MDK 5
Standard Peripherals Library + software pack для Keil MDK 5
ОФИЦИАЛЬНАЯ СБОРКА
Standard Peripherals Library – библиотека для микроконтроллеров.

Теги

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