数据观察点与跟踪单元
本章介绍数据观察点与跟踪(DWT)单元。
1. 关于 DWT¶
DWT 是一个调试单元,为处理器提供观察点和系统性能分析(profiling)。如果处理器实现时包含了 DWT 和 ITM 跟踪,还可以提供数据跟踪。有关 ITM 的详细信息,请参见插桩跟踪宏单元一章。
2. DWT 功能描述¶
完整的 DWT 包含四个比较器,可将它们配置为:
- 硬件观察点。
- ETM 触发。
- PC 采样器事件触发。
- 数据地址采样器事件触发。
第一个比较器 DWT_COMP0 还可以与时钟周期计数器 CYCCNT 进行比较。第二个比较器 DWT_COMP1 还可以用作数据比较器。
精简 DWT 包含两个比较器,可用作观察点或触发器。这些比较器支持数据匹配。
如果实现了 DWT,则它包含以下计数器:
- 时钟周期,CYCCNT。
- 折叠指令(folded instructions)。
- 加载存储单元(LSU)操作。
- 睡眠周期。
- CPI,即除第一个周期之外的所有指令周期。
- 中断开销。
注意: 每次计数器溢出时都会产生一个事件。
可以将 DWT 配置为在定义的间隔生成 PC 采样,并生成中断事件信息。
DWT 为 ITM 提供周期性的协议同步请求。
3. DWT 编程模型¶
下表给出了 DWT 寄存器。根据处理器的具体实现,其中某些寄存器可能不存在。配置为不存在的寄存器读为零。
| 地址 | 名称 | 类型 | 复位值 | 描述 |
|---|---|---|---|---|
| 0xE0001000 | DWT_CTRL | RW | 见注 a | 控制寄存器 |
| 0xE0001004 | DWT_CYCCNT | RW | 0x00000000 | 周期计数寄存器 |
| 0xE0001008 | DWT_CPICNT | RW | - | CPI 计数寄存器 |
| 0xE000100C | DWT_EXCCNT | RW | - | 异常开销计数寄存器 |
| 0xE0001010 | DWT_SLEEPCNT | RW | - | 睡眠计数寄存器 |
| 0xE0001014 | DWT_LSUCNT | RW | - | LSU 计数寄存器 |
| 0xE0001018 | DWT_FOLDCNT | RW | - | 折叠指令计数寄存器 |
| 0xE000101C | DWT_PCSR | RO | - | 程序计数器采样寄存器 |
| 0xE0001020 | DWT_COMP0 | RW | - | 比较器寄存器 0 |
| 0xE0001024 | DWT_MASK0 | RW | - | 掩码寄存器 0 |
| 0xE0001028 | DWT_FUNCTION0 | RW | 0x00000000 | 功能寄存器 0 |
| 0xE0001030 | DWT_COMP1 | RW | - | 比较器寄存器 1 |
| 0xE0001034 | DWT_MASK1 | RW | - | 掩码寄存器 1 |
| 0xE0001038 | DWT_FUNCTION1 | RW | 0x00000000ᵇ | 功能寄存器 1 |
| 0xE0001040 | DWT_COMP2 | RW | - | 比较器寄存器 2 |
| 0xE0001044 | DWT_MASK2 | RW | - | 掩码寄存器 2 |
| 0xE0001048 | DWT_FUNCTION2 | RW | 0x00000000 | 功能寄存器 2 |
| 0xE0001050 | DWT_COMP3 | RW | - | 比较器寄存器 3 |
| 0xE0001054 | DWT_MASK3 | RW | - | 掩码寄存器 3 |
| 0xE0001058 | DWT_FUNCTION3 | RW | 0x00000000 | 功能寄存器 3 |
| 0xE0001FB0 | DWT_LAR | WO | - | 锁定访问寄存器 |
| 0xE0001FB4 | DWT_LSR | RO | 未知 | 锁定状态寄存器 |
| 0xE0001FD0 | PID4 | RO | 0x00000004 | 外设标识寄存器 |
| 0xE0001FD4 | PID5 | RO | 0x00000000 | |
| 0xE0001FD8 | PID6 | RO | 0x00000000 | |
| 0xE0001FDC | PID7 | RO | 0x00000000 | |
| 0xE0001FE0 | PID0 | RO | 0x00000002 | |
| 0xE0001FE4 | PID1 | RO | 0x000000B0 | |
| 0xE0001FE8 | PID2 | RO | 0x0000000B | |
| 0xE0001FEC | PID3 | RO | 0x00000000 | |
| 0xE0001FF0 | CID0 | RO | 0x0000000D | 组件标识寄存器 |
| 0xE0001FF4 | CID1 | RO | 0x000000E0 | |
| 0xE0001FF8 | CID2 | RO | 0x00000005 | |
| 0xE0001FFC | CID3 | RO | 0x000000B1 |
DWT 寄存器在 Arm®v7-M 架构参考手册中描述。
注意:
- 周期匹配功能仅在比较器 0 中可用。
- 数据匹配功能仅在比较器 1 中可用。
- 仅对不产生 MPU 或总线故障的访问采样数据值。无论是否存在故障都会采样 PC。仅对突发的第一个地址采样 PC。
- 如果在 DWT_FUNCTION1 中也置位了 DATAVMATCH,则 DWT_FUNCTION1 寄存器中的 FUNCTION 字段会被 DATAVADDR0 和 DATAVADDR1 指定的比较器覆盖。此时 DATAVADDR0 和 DATAVADDR1 指定的比较器只能为比较器 1 的数据匹配执行地址比较器匹配。
- Arm 不建议对观察点使用 PC 匹配,因为观察点相对于引起它的事件是异步的。它主要用于保护和触发 ETM。
a. 可能的复位值为:0x40000000 表示带跟踪的完整 DWT;0x48000000 表示不带跟踪的完整 DWT;0x20000000 表示带跟踪的精简 DWT;0x28000000 表示不带跟踪的精简 DWT。 b. 如果处理器配置为最小调试,DWT_FUNCTION1[9] 始终为 RAZ;如果配置为完整调试,DWT_FUNCTION1[9] 始终为 RA0。DWT_FUNCTION1 寄存器中其他所有位复位为 0。