KEIL中让程序在RAM中运行的办法.pdf
KEIL中如何让程序在RAM中运行
前言
最近老是遇到使用KEIL时需要将部分或者全部程序放到RAM中运行的问题。故此花了不少时间搜索资料和几番尝试,现将
其总结在本篇文章中,也是为大家以后的工作节省时间罢。本文中会介绍通过STM32F411Nucleo的一个例子来介绍几种让
程序在RAM中运行的方法。在该例子中,通过调用ToggleLED函数来翻转LED2亮灭。接下来,我们将通过多种方法将这
段代码放在RAM中运行。
ToggleLED函数从Flash中执行的情况
我们先来看看ToggleLED函数从Flash中执行的情况。下面是ToggleLED函数和它的调用情况。在main函数的while(1)
里调用ToggleLED。
voidToggleLED(void)
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
/*Inserta100msdelay*/
HAL_Delay(100);
}
intmain(void)
{
……
/*##-3-TogglePA05IOinaninfiniteloop#################################*/
while(1)
{
ToggleLED();
}
}
Linker的配置为,见下图:
Flash起始地址:0
RAM起始地址:0
编译后从map文件可以看到,ToggleLED以及其中调用到的HAL_GPIO_TogglePin和HAL_Delay函数的地址都在FLASH
中。
将翻转LED的程序放到SRAM中执行
方法一:通过#pragmaarmsectioncode=“RAMCODE”和#pragmaarmsection。参考Example1代码。
这种方式,可以同时将多个函数放到指定的section。具体方法如下:
1.修改.sct文件,自定义一个叫做RAMCODE的section,放在RW_IRAM1执行区域,地址范围00。
LR_IROM100{;loadregionsize_region
ER_IROM100{;loadaddress=executionaddress
*.o(RESET,+First)
*(InRoot$$Sections)
.ANY(+RO)
}
RW_IRAM100{;RWdata
*.o(RAMCODE)
.ANY(+RW+ZI)
}
}
2.在工程中使用前面修改的.sct文件
3.以#pragmaarmsectioncode=“RAMCODE”开头,以#pragmaarmsection结尾。将所有需要放到RAMCODEsection的
函数包括进来。编译时,编译器会自动将这些函数放到RAMCODE所在0开始的区域。
#pragmaarmsectioncode=RAMCODE
voidToggleLED(void)
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
/*Inserta100msdelay*/
HAL_Delay(100);
}
voidHAL_GPIO_TogglePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin)
{
/*Checktheparameters*/
assert_param(IS_GPIO_PIN(GPIO_Pin));
GPIOx-ODR^=GPIO_Pin;
}
uint32_tHAL_GetTick(void)
{
returntick;
}
voidHAL_Delay(__IOuint32_tDelay)
{
uint32_ttickstart=0;
tickstart=HAL_GetTick();
while((HAL_GetTick()