文档详情

KEIL中让程序在RAM中运行的办法.pdf

发布:2024-12-23约7.36千字共9页下载文档
文本预览下载声明

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()

显示全部
相似文档