[keil] 将函数定义到RAM运行,和定义无初始化变量(软复位,变量不清空)

[keil] 将函数定义到RAM运行,和定义无初始化变量(软复位,变量不清空)

keil链接文件

一、将函数定义到RAM运行二、定义无初始化变量(软复位,变量不清空)**总结**

先打开Keil工程配置,选择linker链接文件,取消自动生成,并编辑sct。

如上图,定义一个RAMFUNC区域,如果需要无初始化变量,则定义红框内容。

LR_IROM1 0x00000000 0x00017000 { ; load region size_region

ER_IROM1 0x00000000 0x00017000 { ; load address = execution address

*.o (RESET, +First)

*(InRoot$$Sections)

.ANY (+RO)

.ANY (+XO)

}

RW_IRAM1 0x1FFFF000 0x00003F00 { ; RW data

.ANY (+RW +ZI)

*.o (.ramfunc)

}

RW_IRAM2 0x20002F00 UNINIT 0x00000100 {

.ANY (.uninit)

}

}

示例芯片的RAM为0x4000 byte,这里拆分为两组,第一组[RW_IRAM1]复位清零,第二组[RW_IRAM1]复位保持。LR_IROM1定义Flash大小区域。如果是APP工程,则填写APP区域大小。

复位保持:仅非掉电复位有效,硬件复位还是无法保持。一般用于跳转boot传递信息,或者存储单次运行数据。

一、将函数定义到RAM运行

/******************************************************************

* 函数名称:McuFlashDoCommand

* 出口参数:0 指令操作失败,1 指令操作成功

* 函数说明:启动FLASH指令 __attribute__((used, section("atcmd")))

******************************************************************/

uint8_t __attribute__((used, section(".ramfunc"))) McuFlashDoCommand(void) {

uint8_t ret = 1;

/* Clear CCIF to launch command */

FTMRE->FSTAT = FTMRE_FSTAT_CCIF_MASK;

while (!(FTMRE->FSTAT & FTMRE_FSTAT_CCIF_MASK));

while ((FTMRE->FSTAT & FTMRE_FSTAT_MGBUSY_MASK));

/* Check if an error is occurred */

if (FTMRE->FSTAT & (FTMRE_FSTAT_FPVIOL_MASK | FTMRE_FSTAT_ACCERR_MASK))

ret = 0;

return ret;

}

二、定义无初始化变量(软复位,变量不清空)

注:uninit只有256byte(根据上述链接文件定义),如果定义的大小超出范围,整个uninit地址都会移动到普通RAM区域

boot_info_t g_boot_info __attribute__((used, section(".uninit")));

总结

在ROM区执行和RAM区执行的区别在于,前者是只有当代码需要的时候,Cache才会从flash中搬出来运行,而后者是在上电初始化的时候就已经全部搬过去了,所以在运行的时候函数已经在RAM中了,并且这段代码会一直占用这个RAM不会被释放,类似于一个全局变量。前者如果超出了Cache的大小,可能会被释放掉,等下次执行的时候需要重新搬。

相关推荐

DDM是什么意思-DDM的英文全称
365APP

DDM是什么意思-DDM的英文全称

📅 08-18 👁️ 2751
android车机必备软件
365bet滚球网站

android车机必备软件

📅 08-21 👁️ 5074
如何增强照片中的倒影效果?
365bet滚球网站

如何增强照片中的倒影效果?

📅 08-30 👁️ 1491
马力到瓦特转换计算器
365bet滚球网站

马力到瓦特转换计算器

📅 07-28 👁️ 2522