嵌入式跟踪宏单元(ETM)是ARM CoreSight调试架构的核心组件,采用ETMv4架构规范实现。在Cortex-A57处理器中,ETM通过硬件级指令流追踪机制,为开发者提供非侵入式的实时调试能力。其典型应用场景包括:
ETM的架构优势体现在三个方面:
偏移地址:0x010,32位可读写寄存器,控制ETM的基础追踪行为。关键字段解析:
| 位域 | 名称 | 功能描述 | 典型配置 |
|---|---|---|---|
| [12] | RS | 返回栈使能 | 1(启用函数调用跟踪) |
| [11] | TS | 全局时间戳 | 1(添加时间信息) |
| [7] | VMID | 虚拟机ID追踪 | 虚拟化场景设为1 |
| [6] | CID | 上下文ID追踪 | 多任务调试设为1 |
| [4] | CCI | 指令周期计数 | 性能分析设为1 |
| [3] | BB | 分支广播模式 | 1(减少trace数据量) |
注意:修改TRCCONFIGR前必须确保ETM处于禁用状态(TRCPRGCTLR[0]=0),否则写入无效。
偏移地址:0x018,提供实现定义的特殊控制功能。关键位功能:
DBGFLUSHOVERRIDE[8]:调试状态下的FIFO刷新控制
CLKENOVERRIDE[6]:时钟门控控制
FLUSHOVERRIDE[5]:调试接口禁用时的行为
c复制// 典型配置示例:保持调试期间的trace连续性
void configure_etm_aux(void) {
volatile uint32_t *trcauxctlr = (uint32_t *)0x80020018;
*trcauxctlr = (1 << 8) | // DBGFLUSHOVERRIDE
(1 << 5); // FLUSHOVERRIDE
}
bash复制# 解锁ETM寄存器访问
echo 1 > /sys/kernel/debug/etm/enable
c复制// 配置地址比较器(只追踪0x80000000-0x80010000区域)
*(volatile uint32_t *)0x80020400 = 0x80000000; // ACVR0
*(volatile uint32_t *)0x80020404 = 0x80010000; // ACVR1
*(volatile uint32_t *)0x80020480 = 0x1; // ACATR0启用范围匹配
bash复制# 设置TRCCONFIGR并启用ETM
echo 0x1F01 > /sys/kernel/debug/etm/config # 启用所有基础功能
echo 1 > /sys/kernel/debug/etm/start
问题1:trace数据不完整
问题2:时间戳不同步
bash复制# 校准时间戳
echo 100 > /sys/kernel/debug/etm/sync_period # 设置同步包间隔
echo 1 > /sys/kernel/debug/etm/ts_enable # 强制时间戳插入
问题3:多核交叉触发失效
c复制*(volatile uint32_t *)0x80030020 = 0x1; // 使能核间触发通道
分支广播优化:
智能过滤配置:
c复制// 组合使用地址比较和上下文过滤
*(volatile uint32_t *)0x80020680 = 0x3; // CIDCCTLR0:匹配当前上下文
*(volatile uint32_t *)0x80020600 = get_current_pid(); // 设置当前进程ID
c复制// 核间触发配置示例
void configure_cross_core_trigger(void) {
// 核0配置
*(volatile uint32_t *)0x80030040 = 0x1 << 4; // 通道4输出
*(volatile uint32_t *)0x80030080 = 0x1 << 4; // 映射到触发线
// 核1配置
*(volatile uint32_t *)0x90030044 = 0x1 << 4; // 通道4输入
*(volatile uint32_t *)0x90030084 = 0x1 << 4; // 触发ETM捕获
}
| 寄存器名 | 偏移地址 | 关键功能 | 访问权限 |
|---|---|---|---|
| TRCPRGCTLR | 0x004 | 全局使能控制 | RW |
| TRCIDR2 | 0x188 | 获取FIFO深度等实现参数 | RO |
| TRCACVRn | 0x400-4B8 | 地址比较器设置 | RW |
| TRCCNTVR0 | 0x160 | 计数器当前值读取 | RW |
| TRCOSLAR | 0x300 | 解锁ETM寄存器 | WO |
在实际项目调试中,建议结合DS-5调试器的Trace窗口进行可视化分析,可自动解析ETM生成的压缩trace流。对于Linux内核调试,可通过perf工具获取用户态和内核态的混合trace:
bash复制perf record -e cs_etm/@80020000.etm/ --user --kernel -o perf.data ./target_app