找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

6219

积分

0

好友

786

主题
发表于 前天 06:49 | 查看: 0| 回复: 0

本文将围绕 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」,并指定自定义的散列文件。如下图所示:

Keil MDK Linker选项卡配置自定义散列文件

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,并把它设为当前目标。如下图所示:

μVision工具栏新建ram调试目标

Manage Project Items创建ram调试目标

2.3 配置下载算法

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

Cortex-M Target Driver Setup配置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。如下图所示:

Debug选项卡选择ram.ini初始化脚本

2.5 设置 Debug Pack

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

Cortex-M Target Driver Setup Pack选项卡设置调试包

完成以上配置后,点击调试按钮,Keil 就会将程序下载到 RAM 中,并从 main 开始运行。你可以像平常一样设置断点、查看变量,体验高速调试的流畅感。

03 小结

本文介绍了在 Keil MDK 中实现内存调试的完整流程,核心步骤包括:

  1. 修改散列文件,将程序链接到 RAM 地址;
  2. 新建调试配置,避免影响原有 Flash 调试;
  3. 配置下载算法,确保能正确写入 RAM;
  4. 编写并选择 ram.ini,初始化 SP、PC 和向量表;
  5. 设置 Debug Pack,保证调试器识别芯片。

这种方法特别适合开发调试阶段,能显著提高效率、减少 Flash 损耗。但需要注意:RAM 掉电后程序会丢失,正式发布时仍需烧录到 Flash。另外,RAM 大小有限,链接时要注意空间是否足够,向量表偏移寄存器(VTOR)也要正确设置。

希望本文能帮助你在嵌入式开发中更灵活地使用 Keil 进行内存调试。更多嵌入式实战经验,欢迎来云栈社区交流。




上一篇:Linux驱动开发of_函数速查:设备树节点、属性读取与地址映射
下一篇:Linux platform 总线匹配与绑定机制:从注册入口到 probe 的完整路径
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-10-2 23:47 , Processed in 1.434672 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表