Keil MDK设置部分程序在RAM执行的方法:ramfunc
2025-03-10 来源:jianshu
前言
嵌入式软件,如bootloader,空间受限,但有操作(编程)内部flash的需求,遇到的主要问题就是:
内部的RAM不够大,flash 编程需要多次执行
bootloader需要更新自己,但程序执行的位置需要擦除重新编程
部分MCU,程序在flash中执行,不支持边执行边擦写
这就需要引入程序在RAM中执行的话题
ramfunc
让程序加载到RAM中并在RAM中执行,即上电后程序(或一些函数),代码的执行位置位于RAM中。
本质上,RAM掉电,数据会丢失。这个程序代码(Code)本身依旧是存放在Flash中,这样掉电保存,开机后自动加载(load)到RAM里,这样这个函数的【执行体】在RAM里,调用时,就在RAM中执行了
如上面提到的bootloader自身的更新,升级代码在RAM中执行,可以实现自己更新自己,也就是通过Flash编程,允许擦除并更新程序存放Code的Flash区域。
设置方法
这里使用Keil MDK,如果使用gcc,可能需要调整一下
首先需要修改链接(link)的脚本:一般为 xxx.sct
启用:Scatter file

2022-03-27_101930.png
选项:Linker

2022-03-27_102032.png
默认的 链接脚本

2022-03-27_102101.png
在RAM的段:注意开地址,如RAM的地址为:0x20000000开始,增加:
*.o (.ramfunc),如下:
RW_IRAM1 0x20000000 0x00018000 { ; RW data
.ANY (+RW +ZI)
*.o (.ramfunc)
}这样等于在RAM中有了一个内存段,段名为:.ramfunc,也就是为某些函数可以放在这个段下

2022-03-27_102140.png
定义好了RAM段,没有使用

2022-03-27_102356.png
这个内存段定义好,还需要把想要放在RAM中执行的函数,定义为:ramfunc,如下
#define RAMFUNC __attribute__ ((section ('.ramfunc')))这样,RAMFUNC 前缀定义的函数,就会放在RAM中了

2022-03-27_102510.png
默认在Flash中

2022-03-27_102834.png
函数使用:ramfunc

2022-03-27_102958.png
增加 RAMFUNC的声明

2022-03-27_103014.png
函数在RAM中了

2022-03-27_103131.png
小结
RAM有个初始化的过程,定义了:*.o (.ramfunc),上电初始化后,会加载这部分的代码到RAM中
函数的执行体放在RAM中(RAM地址空间),执行就是在RAM中执行了
像STM32这种芯片,程序可以直接在Flash中执行,也可以在RAM中执行
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- STM32的项目创建——基于Keil MDK环境
- Keil5安装+STM32CubeMX安装+VSCode辅助开发教程
- STM32 KEIL if满足条件却无法进入
- LVGL8.3学习记录(四)-KEIL&Stm32 LVGL显示移植配置
- 新手入门proteus与keil5软件仿真stm32的手把手超简单教程
- 使用Makefile在Windows环境下编译STM32F103C8T6标准库工程,脱离Keil的指南
- Keil环境下配置GCC编译器以开发STM32 C语言项目:探讨C语言特性及第23条指南
- STM32 HAL开发环境搭建指南:Keil MDK-ARM、STM32F1xx DFP与ST-Link工具链配置详解,结合STM32CubeMX使
- STM32与Keil uVision5工程中文件后缀的详细作用解析
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析
- 意法半导体中国本地造STM32微控制器启动规模量产
- 蓝牙信道探测技术原理与开发套件实践




