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")));