Cortex-M中的DWT(Data Watchpoint and Trace,数据观察点与跟踪单元)
Cortex-M中的DWT(Data Watchpoint and Trace,数据观察点与跟踪单元)
一句话概括
DWT (Data Watchpoint and Trace) 是 数据观察点与跟踪单元,它是 Cortex-M 处理器内核中的一个调试组件,主要用于提供高级的调试、性能分析和实时系统跟踪功能。
详细解释
1. 全称与定位
- 全称: Data Watchpoint and Trace
- 定位: 它是 ARM Cortex-M 处理器中嵌入式跟踪宏单元(ETM) 和调试访问端口(DAP) 等共同构成的调试系统的一部分。DWT 位于处理器内核内部,因此它可以访问到非常核心的信号和数据。
2. 主要功能
DWT 的功能可以大致分为三类:
a) 数据观察点
这是其名称的直接体现。你可以配置 DWT 的比较器,使其在特定内存地址被访问(读取、写入或两者)时触发一个事件。
- 触发的事件可以是:
- 调试中断: 就像设置一个硬件断点,当地址被访问时,处理器会暂停,进入调试状态。
- ETM 触发: 启动或停止更详细的指令跟踪流。
- 数据地址匹配: 用于其他调试功能。
- 应用场景: 当某个关键变量被意外修改时,通过设置数据观察点,可以快速定位到修改它的代码。
b) 系统性能分析
这是 DWT 一个极其有用的功能,它内置了多个计数器,可以无干扰地(即不需要修改代码)监控处理器的运行状况。
- 主要计数器包括:
- CYCCNT: 周期计数器。这是最常用的一个计数器,它记录从启动开始经过的处理器时钟周期数。常用于:
- 精确的性能剖析: 在代码段开始和结束时读取
CYCCNT
,相减即可得到该段代码执行的确切时钟周期数。 - 高精度延时: 实现比
SysTick
定时器更精确的微秒或纳秒级延时函数。
- 精确的性能剖析: 在代码段开始和结束时读取
- CPICNT: 指令折叠次数计数器。记录由于分支预测成功而节省的指令周期数。
- EXCCNT: 异常开销计数器。记录处理异常所花费的周期数。
- SLEEPCNT: 睡眠周期计数器。记录处理器在睡眠模式下的周期数。
- LSUCNT: 加载/存储单元计数器。记录加载和存储指令的周期数。
- FOLDCNT: 指令折叠计数器。记录被折叠的指令数量。
- CYCCNT: 周期计数器。这是最常用的一个计数器,它记录从启动开始经过的处理器时钟周期数。常用于:
c) 程序流跟踪
DWT 可以与 ITM 或 ETM 协同工作,提供程序执行流的信息。
- PC 采样: DWT 可以定期将程序计数器(PC)的值通过跟踪接口(如 SWO)发送出去。调试主机(如 Keil MDK, IAR EWARM)可以接收这些数据并重建函数的调用历史和执行时间分布图,这就是所谓的性能分析功能。
如何使用 DWT(以 CYCCNT 为例)
在 Cortex-M3/M4/M7 等处理器上,使用 DWT 进行性能分析非常普遍。以下是一个典型的步骤:
-
启用 DWT:
首先需要解锁调试功能,允许使用 DWT 和 ITM。#define DEMCR_TRCENA (1 << 24) // Debug Exception and Monitor Control Register 的 TRCENA 位// 启用 DWT 和 ITM 的跟踪功能 CoreDebug->DEMCR |= DEMCR_TRCENA;
-
启用 CYCCNT 计数器:
在 DWT 控制寄存器中使能周期计数器。#define DWT_CTRL_CYCCNTENA (1 << 0) // DWT Control Register 的 CYCCNTENA 位// 启用周期计数器 DWT->CTRL |= DWT_CTRL_CYCCNTENA;
-
复位并读取计数器:
计数器是 32 位无符号整数,会不断累加直至溢出后回绕。// 复位计数器(可选) DWT->CYCCNT = 0;// 在代码段开始前读取 uint32_t start_cycle = DWT->CYCCNT;// ... 要测量的代码段 ...// 在代码段结束后读取 uint32_t end_cycle = DWT->CYCCNT;// 计算消耗的周期数 uint32_t cycles_taken = end_cycle - start_cycle;
总结
特性 | 描述 |
---|---|
名称 | 数据观察点与跟踪单元 |
核心功能 | 调试、性能分析、实时跟踪 |
关键特性 | 1. 硬件数据观察点(监控内存访问) 2. 性能计数器(如 CYCCNT ,用于精确计时和分析)3. 程序流跟踪支持(PC 采样) |
开发者价值 | 提供了一种非侵入式的手段来剖析代码性能、定位复杂的内存访问错误,是进行嵌入式系统优化的强大工具。 |
注意事项 | 并非所有 Cortex-M 型号都实现完整的 DWT 功能(例如,Cortex-M0/M0+ 的功能非常有限)。需要查阅具体芯片的数据手册。 |
总而言之,DWT 是 Cortex-M 处理器为嵌入式开发者和调试器提供的一个功能强大且高效的“内窥镜”,让你能清晰地看到内核内部正在发生的事情。