CoreSight ETM11(Embedded Trace Macrocell)是ARMv6架构处理器配套的实时指令跟踪模块,采用哈佛架构设计,可同时捕获处理器流水线中的指令流和数据流。TM920作为其具体实现型号,在ARM1136J(F)-S、ARM1156T2(F)-S和ARM1176JZ(F)-S等处理器中提供周期精确的调试能力。该模块通过AMBA Trace Bus(ATB)输出压缩后的跟踪数据包,支持包括:
关键提示:ETM11的跟踪数据流采用分层编码策略,通过I-Sync(指令同步)和D-Sync(数据同步)包维持解码同步,当使用循环缓冲区存储时,建议将同步频率寄存器(0x78)设置为至少每512字节生成同步包。
ETM11采用三级触发逻辑:
地址比较器:8对单地址/范围比较器,可配置为:
计数器资源:2个32位递减计数器,可配置为:
c复制// 典型计数器配置示例
ETM_CNT_LD_REG(0) = 0x00010000; // 重载值
ETM_CNT_VAL_REG(0) = 0x00010000; // 初始值
ETM_CNT_CTRL_REG(0) |= 0x1; // 启用计数器
序列器状态机:4状态(IDLE, ACTIVE, HALT, FIFOFULL)控制跟踪启停
在BE-32大端模式下(如345449号勘误),非对齐数据访问的地址位[1:0]会错误报告。其根本原因在于ETM11的地址计算单元未正确处理BE-32模式下的字节序转换:
code复制理论地址映射:
BE-32模式访问0x1000-0x1003字节时:
字节[3] -> 数据总线[31:24]
字节[2] -> 数据总线[23:16]
字节[1] -> 数据总线[15:8]
字节[0] -> 数据总线[7:0]
ETM11错误实现:
直接使用小端地址映射,导致跟踪数据关联错误
当STREXD指令执行失败时,ETM11应生成两个数据包(各32位)并分别附加Store-Failed标记。但若通过ViewData功能仅选择跟踪高位字(如地址0x1004),硬件状态机错误地维持了低位字(0x1000)的跟踪状态,导致生成重复的Store-Failed包。
| 处理器型号 | 受影响版本 | 修复版本 |
|---|---|---|
| ARM1176JZ(F)-S | r0p0-r1p0 | r1p1 |
| ARM1136J(F)-S rev1 | r0p0-r1p0 | r1p1 |
assembly复制; 推荐替换方案(需保证原子性):
TRY_STREXD:
STREXD R4, R2, [R1] ; 原始指令
CMP R4, #0 ; 检查执行状态
BNE TRY_STREXD ; 失败重试
MCR p15, 0, <Rd>, c13, c0, 1)ETM11的上下文ID影子寄存器更新逻辑存在单周期延迟,而状态机错误地将非周期性I-Sync的生成优先级置于寄存器更新之前。该问题不影响周期性I-Sync(由同步计数器触发)。
c复制ETM_SYNC_FREQ = 0x200; // 每512字节同步
assembly复制MCR p14, 0, R0, c0, c4, 0 ; 手动触发I-Sync
在BE-32大端模式下,当配置地址范围比较器监控非字对齐区域(如0x1000-0x100E)时:
| 方案 | 优点 | 缺点 |
|---|---|---|
| 强制字对齐监控区域 | 完全规避问题 | 监控粒度变粗 |
| 软件地址转换 | 保持精细监控 | 增加工具链处理复杂度 |
| 禁用BE-32模式 | 一劳永逸 | 影响遗留代码兼容性 |
code复制[ETM11] -- ATB --> [Funnel] -- ATB --> [TPIU] --> Trace Port
/
[其他跟踪源] ------
| 参数 | 推荐值 | 说明 |
|---|---|---|
| ATB数据宽度 | 32-bit | 平衡带宽与引脚数量 |
| FIFO深度 | 64字节 | 根据最长中断延迟确定 |
| 时钟比例(CLK:ATCLK) | 1:1 | 避免跨时钟域问题 |
bash复制# 使用ARM DS-5命令
trace status --etm 0 --clock
code复制1. 配置比较器
2. 设置计数器(如需要)
3. 定义序列器跳转
4. 启用TraceEnable事件
c复制// 在CoreSight配置寄存器中
CS_LAR = 0xC5ACCE55; // 解锁
CS_CTRL |= (1 << 12); // 启用触发路由
ETM11通过ETMPWRDOWN(控制寄存器bit[0])支持时钟门控,但需注意:
推荐流程:
mermaid复制sequenceDiagram
调试工具->>ETM: 设置编程位(bit[10])
ETM-->>调试工具: 状态寄存器确认
调试工具->>ETM: 配置寄存器组
调试工具->>ETM: 清除编程位
ETM->>处理器: 开始跟踪
WFI指令处理:在363115号勘误影响下,进入低功耗模式前应主动停止ETM:
c复制void EnterLowPower(void) {
ETM_CTRL |= (1 << 10); // 设置编程位
while(!(ETM_STATUS & 2)); // 等待FIFO空
__WFI();
ETM_Reinit(); // 唤醒后重新初始化
}
多核同步:在MPCore系统中,建议采用以下时序:
code复制Core0: 发出同步事件
Core1-3: 等待同步信号
所有核心: 同时启用ETM跟踪
数据跟踪过滤:使用ViewData时,建议组合设置:
c复制// 只监控特定地址范围的写操作
ETM_VIEWDATA_CTRL =
(1 << 0) | // 启用包含过滤
(3 << 4); // 仅匹配写操作
通过深入理解ETM11的微架构特性和勘误影响,开发者可以构建更可靠的调试基础设施。建议在量产前使用ETM校验固件(如ARM提供的ETM Validation Suite)进行全面验证。