RealMonitor是ARM架构下专为实时系统设计的调试解决方案,由RMHost(主机端组件)和RMTarget(目标端组件)构成。这套系统最显著的特点是实现了"非停止调试"(Nonstop Debug),允许开发者在目标程序持续运行(包括中断服务)的同时,执行断点调试、内存查看等操作。
系统采用三层架构设计:
关键通信路径如下:
code复制调试器 <--RDI 1.5.1rt--> RMHost.dll <--RealMonitor协议--> JTAG单元 <--DCC通道--> RMTarget
相比传统JTAG调试,RealMonitor在以下场景表现突出:
典型应用案例包括:
主机环境:
目标板要求:
bash复制# Multi-ICE特殊配置流程:
1. 启动Multi-ICE服务器
2. 执行File > Auto-Configure生成Autoconf.cfg
3. 复制配置文件并重命名(防止被覆盖)
4. 每次使用时通过File > Load Configuration...加载
重要提示:绝对不要使用Auto-configure选项连接RMHost,这会导致目标板复位
初始连接:
实时连接切换:
mermaid复制graph TD
A[运行中的程序] --> B[Options > Configure Interface]
B --> C[General tab选择ATTACH模式]
C --> D[Configure Target切换至RealMonitor.dll]
D --> E[配置JTAG控制器参数]
高级配置项:
后台访问特性:
c复制// RMTarget构建选项示例
#define RM_OPT_READWORDS // 启用字读取
#define RM_OPT_WRITEHALFWORD // 启用半字写入
原子性保障:
动态断点设置:
armasm复制; 可能出现的竞态条件
Original_ISR:
STMFD sp!, {r0-r12, lr} ; 断点设置过程中可能执行到此
... ; 导致不完整的上下文保存
最佳实践:
代码剖析配置:
xml复制<!-- AXD配置文件示例 -->
<Profiling>
<Interval value="1000"/> <!-- 单位:微秒 -->
</Profiling>
数据分析方法:
实现原理:
典型应用:
c复制// 目标端日志输出示例
void DebugPrint(const char* msg) {
RM_DataLogging_Send(msg, strlen(msg));
}
配置要点:
常见问题处理:
code复制Semihosting write call interrupted (data will be lost)
解决方案:增加输出缓冲区或降低调试中断频率
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 连接超时 | JTAG时钟频率过高 | 降低TCK频率至1MHz以下 |
| 内存访问失败 | RMTarget未启用对应访问选项 | 重新编译RMTarget |
| 寄存器显示为零 | 寄存器访问被禁用 | 检查RM_RegisterAccess配置 |
通信优化:
目标端优化:
c复制// 最小化RMTarget内存占用
#define RM_OPT_MINIMAL_FOOTPRINT
#define RM_HEAP_SIZE 512 // 根据需求调整
主机端优化:
code复制[AXD Debugger] ←→ [RMHost] ←→ [TDT Controller] ←ETM→ [Target]
在实际项目中,我曾遇到ETM追踪数据与源代码行号错位的问题。通过以下步骤解决: