ARM嵌入式跟踪宏单元(ETM)的组件识别系统由四个32位寄存器组成,采用独特的分布式存储设计。这种设计在芯片验证和系统集成阶段具有关键作用:
实际工程中读取组件ID时,需要按从高到低的顺序依次读取ComponentID3到ComponentID0,然后拼接各寄存器的有效位。
表1展示了ComponentID寄存器的详细位定义:
| 寄存器名 | 偏移地址 | 位域 | 典型值 | 功能描述 |
|---|---|---|---|---|
| ComponentID3 | 0xFFC | [7:0] | 0xB1 | 组件ID的[31:24]位(厂商标识) |
| ComponentID2 | 0xFF8 | [7:0] | 0x05 | 组件ID的[23:16]位(设备大类) |
| ComponentID1 | 0xFF4 | [7:4] | 0x9 | 组件ID的[15:12]位(子类编号) |
| [3:0] | 0x0 | 组件ID的[11:8]位(修订版本) | ||
| ComponentID0 | 0xFF0 | [7:0] | 0x0D | 组件ID的[7:0]位(实例编号) |
典型应用场景:
以下是通过JTAG接口读取组件ID的典型操作流程:
c复制// 示例:组件ID读取代码
uint32_t read_component_id() {
uint32_t id3 = read_reg(0xFFC) & 0xFF;
uint32_t id2 = read_reg(0xFF8) & 0xFF;
uint32_t id1 = read_reg(0xFF4) & 0xFF;
uint32_t id0 = read_reg(0xFF0) & 0xFF;
return (id3 << 24) | (id2 << 16) | (id1 << 8) | id0;
}
集成测试寄存器的访问需要特定的初始化序列:
警告:测试模式会中断正常跟踪功能,建议仅在开发阶段使用
表2列出了主要的写操作测试寄存器:
| 寄存器名 | 偏移地址 | 位域 | 控制信号 | 功能描述 |
|---|---|---|---|---|
| ITMISCOUT | 0xEDC | [1:0] | EXTOUT[1:0] | 控制外部输出信号 |
| ITTRIGGER | 0xEE8 | [0] | TRIGGER | 产生触发信号 |
| ITATBDATA0 | 0xEEC | [4:0] | ATDATAM[31,23...] | 设置ATB数据线 |
| ITATBCTR0 | 0xEF8 | [9:8] | ATBYTESM[1:0] | 控制ATB字节使能信号 |
| ITATBCTR1 | 0xEF4 | [6:0] | ATIDM[6:0] | 设置ATB ID信号 |
表3展示了主要的读操作测试寄存器:
| 寄存器名 | 偏移地址 | 位域 | 监测信号 | 状态指示 |
|---|---|---|---|---|
| ITMISCIN | 0xEE0 | [3:0] | EXTIN[3:0] | 外部输入信号状态 |
| [4] | DBGACK | 调试应答信号状态 | ||
| ITATBCTR2 | 0xEF0 | [0] | ATREADYM | ATB就绪信号 |
| [1] | AFVALIDM | ATB地址有效信号 |
场景:验证EXTOUT信号通路是否正常
bash复制# 设置Integration Mode Control Register
mmw 0xE00 0x1 0x1
bash复制# 通过ITMISCOUT设置EXTOUT[1:0]=0b01
mmw 0xEDC 0x1 0x1
bash复制# 读取ITMISCIN检查EXTIN状态
mrd 0xEE0
bash复制# 清除Integration Mode Control Register
mmw 0xE00 0x1 0x0
常见问题排查:
CTI作为调试子系统的中枢,实现以下关键功能:
图1展示了CTI的典型连接拓扑:
code复制[CPU Core] <-Debug-> [CTI] <-Trigger-> [ETM]
↑ ↓
[PMU] <------------- [Cross Trigger]
典型配置流程:
c复制// 生成通道0的触发脉冲
write_reg(CTIAPPPULSE, 0x1);
场景:当ETM触发事件发生时产生中断
bash复制# 设置ETM触发条件
etm_configure_trigger
bash复制# 映射ETM TRIGGER到通道0
mmw CTIINEN2 0x1 0x1
# 映射通道0到nCTIIRQ输出
mmw CTIOUTEN8 0x1 0x1
bash复制# 强制产生测试触发
mmw CTIAPPSET 0x1 0x1
# 检查中断状态
cat /proc/interrupts
性能优化技巧:
ETM通过扩展外部输入选择器访问PMU事件,具体映射关系如表4所示:
| PMU事件号 | ETM事件号1 | ETM事件号2 | 典型事件类型 |
|---|---|---|---|
| 0x01 | 0x1 | - | 指令执行 |
| 0x04 | 0x5 | - | 数据缓存访问 |
| 0x09 | 0xB | 0xA | 双发射指令 |
| 0x17 | 0x18 | 0x32 | 分支预测错误 |
场景:统计特定代码段内的缓存未命中次数
bash复制# 设置事件类型为缓存未命中
pmu_configure_event 0x04
bash复制# 定义目标地址范围
etm_set_address_range 0x80000000 0x8000FFFF
bash复制# 配置外部输出为PMU事件与地址范围的逻辑与
etm_configure_external_output AND
bash复制# 同时启用PMU和ETM
pmu_start
etm_start
数据分析方法:
ETM与CTI的跨时钟域同步需要特殊处理:
实现示例:
verilog复制// Verilog同步器示例
module sync_clk1_to_clk2(
input clk1,
input clk2,
input async_in,
output sync_out
);
reg [1:0] sync_reg;
always @(posedge clk2) begin
sync_reg <= {sync_reg[0], async_in};
end
assign sync_out = sync_reg[1];
endmodule
ETM地址比较器的精确匹配位(exact match bit)对调试有重要影响:
典型配置:
bash复制# 设置比较器0为精确匹配模式
etm_set_comparator 0 --exact-match --address=0x80001000
表5列出了ETM调试中的典型问题及对策:
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| 跟踪数据不完整 | FIFO溢出 | 降低跟踪频率或增大FIFO深度 |
| 触发信号未生效 | 比较器配置错误 | 检查exact match位设置 |
| 组件ID读取异常 | 电源域未上电 | 确认ETM供电正常 |
| 跨核触发不同步 | CTI时钟不同步 | 调整CTI时钟源或插入同步器 |
| 性能计数器数值异常 | PMU事件映射错误 | 核对ETM与PMU的事件映射表 |
ETM在低功耗状态下需特殊处理:
空闲状态进入序列:
唤醒恢复流程:
WFI处理:
c复制// 典型低功耗序列
etm_stop_tracing();
while(!(etm_get_status() & IDLE_STATE));
enter_low_power();
/* 唤醒后 */
etm_restore_config();
etm_start_tracing();
在实际项目中验证ETM功能时,建议先通过组件ID寄存器确认硬件版本,再根据具体版本特性调整调试策略。对于复杂的多核调试场景,合理配置CTI的触发路由可以显著提高调试效率。