======Запуск программы в ОЗУ из IAR====== В продолжение статьи [[https://startmilandr.ru/doku.php/prog:start:run_ram_keil|Запуск программы в ОЗУ из Keil]] здесь мы рассмотрим, как запустить программу из ОЗУ в среде IAR. Для этих целей будем использовать МК 1986ВЕ92У и стандартный пример "Hello world", который можно скачать с [[https://github.com/StartMilandr/IAR_CODE|GitHub]]. Сделаем копию этого проекта и назовем HelloWorld_RAM. Чтобы в дальнейшем понимать, откуда у нас запускается программа, в проекте HelloWorld_RAM уменьшим в два раза значение задержек, определяющих период мигания светодиодом. #define LED_PERIOD 500000 Таким образом, при загрузке из Flash у нас мигание будет в 2 раза медленнее, чем при выполнении программы из ОЗУ. Так мы узнаем, какая программа в текущий момент работает. =====Настройка проекта===== Чтобы расположить все данные и функции программы по адресам в ОЗУ зайдём в опции проекта, нажав сочетание клавиш Alt+F7, либо через тулбар Project->Options . {{prog:iar:iar_ram1.png}} Здесь мы переходим во вкладку Debugger->Setup и убираем галочку "Use macro file(s)". Device description file оставляем неизменным, т.к. он используется отладчиком для отображения содержимого периферийных регистров. Во вкладке Debugger->Download убираем все галочки, потому что прошивать Flash память мы не будем. {{prog:iar:iar_ram2.png}} Теперь переходим в настройках проекта во вкладку Linker. Именно здесь и настраивается загрузка программы по адресам ОЗУ. Для начала сделаем копию конфигурационного файла MDR32F1.icf. Я сохранил его в папку с проектом и переименовал в MDR32F1_RAM.icf. В разделе Linker configuration file выбираем наш конфигурационный файл и кликаем на кнопку "Edit...". {{prog:iar:iar_ram3.png}} В поле .intvec start выбирается, где будет располагаться таблица векторов прерываний. ОЗУ располагается по адресам 0x20000000-0x20007FFF, поэтому прописываем значение 0x20000000. {{prog:iar:iar_ram4.png}} Во вкладке Memory Regions в разделе ROM вместо диапазонов памяти Flash, необходимо указать адреса ОЗУ. Для этого ту память ОЗУ, которая в обычном проекте целиком была определена в RAM поделим на две части и одну половину отдадим под раздел ROM. Таким образом у нас получается: ROM : start (0x20000000), end (0x20000000+0x00004000-1) RAM : start (0x20004000), end (0x20004000+0x00004000-1) {{prog:iar:iar_ram5.png}} Во вкладке Stack/Heap Sizes указываются размер стека и кучи. Эти значения мы менять не будем. По сути, на этом настройка проекта завершена. Для настройки мы воспользовались встроенным в IAR редактором *.icf файлов, хотя можно было и отредактировать его вручную, открыв, например, в блокноте. {{prog:iar:iar_ram6.png}} =====Запуск программы===== Сначала лучше прошить МК обычным проектом Hello world, чтобы понять, изменится ли при прошивке программы в ОЗУ период мигания светодиодов. Для загрузки программы в ОЗУ выбираем Project->Download and Debug. После этого осуществляем запуск, F5. Наблюдаем мигание светодиода. Открыв окно дисассемблера (в тулбаре View->Disassembly) видим, что наша программа располагается в адресах ОЗУ, начиная с 0х20000000. {{prog:iar:iar_ram7.png}} По нажатию кнопки Reset период мигания светодиода изменился, потому что программа теперь исполняется из Flash. Это объяснимо, ведь загрузку и запуск новой программы в ОЗУ выполнил отладчик через JTAG. А при возникновении Reset запуск произошел штатным режимом.