本文将围绕 Keil MDK 环境,面向需要快速调试、减少 Flash 擦写、或直接在 RAM 中运行程序的嵌入式开发工程师,通过图文步骤逐步实现「内存调试」。整个流程以 FreeRTOS 工程为例,实操性强,适合开发调试阶段快速验证。
01 内存调试的使用场景
在嵌入式开发中,程序通常被烧录到 MCU 的 Flash 中运行。但这种做法在以下几种场景下并不方便:
- Flash 擦写次数有限:频繁烧录会缩短芯片寿命;
- FreeRTOS 等系统:有时希望将整个工程链接到 RAM,方便调试和快速验证;
- 调试迭代慢:每次修改都要重新烧录;
- 某些程序需要在 RAM 中运行:例如 BootLoader 跳转前的临时程序、或对速度要求极高的代码。
本文的思路是:修改链接脚本,把程序链接地址指定为 RAM,再配合 Keil 的调试配置,让程序直接在内存中运行和调试。这样不仅速度快,还能避免 Flash 损耗。
02 内存调试的步骤
2.1 修改链接脚本
首先,修改工程的分散加载文件(散列文件),将程序的加载地址和执行地址都指向 RAM 区域。以 STM32 为例,RAM 起始地址通常为 0x20000000。
2.1.1 配置工程使用散列文件
在 Keil 中打开工程选项,选择「Linker」选项卡,取消勾选「Use Memory Layout from Target Dialog」,并指定自定义的散列文件。如下图所示:

2.1.2 散列文件内容示例
LR_IROM1 0x20000000 0x00010000 { ; load region size_region
ER_IROM1 0x20000000 0x00010000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
.ANY (+RW +ZI)
}
}
这段脚本将加载区域和执行区域都设置在 0x20000000,大小为 0x10000(64KB)。请根据你实际使用芯片的 RAM 地址和大小调整。
2.2 创建新的调试配置
为了不影响原有的 Flash 调试配置,建议新建一个独立的调试目标。在 Keil 的工具栏或工程管理器中,新建一个名为 ram 的 Target,并把它设为当前目标。如下图所示:


2.3 配置下载算法
在调试配置中,需要确保下载算法正确。由于程序要下载到 RAM,通常使用芯片内部的 RAM 下载算法。在「Utilities」选项卡中点击 Settings,进入下载算法配置界面,将起始地址设为 0x20008000,并将编程算法区域改为 RAM 的基地址与大小。如下图所示:

2.4 配置初始化脚本
这是关键一步:通过初始化脚本,手动设置堆栈指针(SP)、程序计数器(PC),并重定向向量表,然后加载程序并运行到 main。
2.4.1 编写 ram.ini 文件
在工程目录下(例如 01_FreeRTOS_Template\MDK-ARM\ram.ini)新建文件,内容如下:
FUNC void Setup (void) {
SP = _RDWORD(0x20000000); // Setup Stack Pointer
PC = _RDWORD(0x20000004); // Setup Program Counter
_WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register
}
LOAD F103_Moduel\F103_Moduel.axf INCREMENTAL // Download
Setup(); // Setup for Running
g, main
注意:F103_Moduel\F103_Moduel.axf 需替换为你实际的 axf 文件路径。
2.4.2 在 Keil 中选择该脚本
在 Debug 配置的「Initialization File」字段中,选择刚刚编写的 ram.ini。如下图所示:

2.5 设置 Debug Pack
最后,确保 Debug Pack 设置正确。在调试器驱动的「Pack」选项卡中,选择适合你芯片的调试包,例如 Keil.STM32F1xx_DFP.2.3.0。如下图所示:

完成以上配置后,点击调试按钮,Keil 就会将程序下载到 RAM 中,并从 main 开始运行。你可以像平常一样设置断点、查看变量,体验高速调试的流畅感。
03 小结
本文介绍了在 Keil MDK 中实现内存调试的完整流程,核心步骤包括:
- 修改散列文件,将程序链接到 RAM 地址;
- 新建调试配置,避免影响原有 Flash 调试;
- 配置下载算法,确保能正确写入 RAM;
- 编写并选择
ram.ini,初始化 SP、PC 和向量表;
- 设置 Debug Pack,保证调试器识别芯片。
这种方法特别适合开发调试阶段,能显著提高效率、减少 Flash 损耗。但需要注意:RAM 掉电后程序会丢失,正式发布时仍需烧录到 Flash。另外,RAM 大小有限,链接时要注意空间是否足够,向量表偏移寄存器(VTOR)也要正确设置。
希望本文能帮助你在嵌入式开发中更灵活地使用 Keil 进行内存调试。更多嵌入式实战经验,欢迎来云栈社区交流。