Cortex-M中特别实用的DWT计数器
内容提要
DWT(Data Watchpoint and Trace)是Cortex-M处理器中用于系统调试和跟踪的外设。它包含一些可用于性能分析的剩余计数器,其中最常用的是CYCCNT寄存器来测量任务执行所需的周期数。使用DWT可以方便地进行性能分析和调试,优化代码和系统性能。使用DWT的步骤是先使能DWT外设,清零CYCCNT寄存器,然后使能CYCCNT寄存器。
延伸解读
CYCCNT的精度与溢出限制
CYCCNT是一个32位向上计数器,记录内核时钟周期数。以72MHz内核时钟为例,其精度约为14纳秒,足以覆盖微秒级的程序运行时间测量。但计数器最长只能记录约59.65秒,之后会溢出清零并重新开始计数。因此,在测量长时间任务时,需注意溢出问题,或通过多次读取并处理差值来扩展测量范围。
使能DWT的三个关键寄存器
使用DWT的CYCCNT功能需操作三个寄存器:首先通过DEMCR寄存器的位24使能DWT外设,然后向DWT_CYCCNT地址写入0清零计数器,最后将DWT控制寄存器的位0(CYCCNTENA)写1以启动计数。顺序不能颠倒,且清零必须在使能CYCCNT之前完成,否则可能影响计数准确性。
代码示例中的潜在问题
文章提供的示例代码中,stop_timer函数使用“*DWT_CONTROL = *DWT_CONTROL | 0”来停止计数器,但按位或0并不会改变寄存器值,因此无法真正停止计数。正确做法应是清除CYCCNTENA位(如与~1进行按位与)。读者在参考示例时需留意此类细节,避免调试时出现意外行为。
Q&A
Cortex-M中的DWT是什么?主要用来做什么?
DWT(Data Watchpoint and Trace)是Cortex-M处理器中用于系统调试和跟踪的外设。它包含一些可用于性能分析的计数器,最常用的是CYCCNT寄存器,用于测量任务执行所需的周期数,方便进行性能分析和调试,优化代码和系统性能。
CYCCNT寄存器有什么特点?计数精度和最大记录时间是多少?
CYCCNT是一个32位的向上计数器,记录内核时钟运行的周期数,精度非常高。例如内核时钟为72MHz时,精度为1/72M≈14ns。最大记录时间为2的32次方/72000000≈59.65秒,溢出后会清零重新开始计数。
使用DWT的CYCCNT需要操作哪些寄存器?各自的作用是什么?
需要操作三个寄存器:DEMCR(地址0xE000EDFC)的位24用于使能DWT外设;DWT_CYCCNT(地址0xE0001004)用于存储周期计数值,使用前需清零;DWT_CTRL(地址0xE0001000)的位0(CYCCNTENA)用于使能CYCCNT计数器。
如何一步步启用DWT的CYCCNT计数器?
步骤为:1. 使能DWT外设,向DEMCR寄存器的位24写1;2. 将DWT_CYCCNT寄存器清零(向地址0xE0001004写0);3. 使能CYCCNT计数器,向DWT_CTRL寄存器的位0(CYCCNTENA)写1。
能否提供一个使用DWT测量代码执行周期的简单示例?
可以。示例代码:先调用reset_timer()使能DWT并清零CYCCNT;然后start_timer()启动计数;执行待测函数;stop_timer()停止计数;最后通过getCycles()读取CYCCNT值得到周期数。也可在测量前后读取计数值并相减得到差值。
CYCCNT计数器溢出后会怎样?如何计算最大记录时间?
CYCCNT溢出后会清零并重新开始向上计数。最大记录时间计算公式为2的32次方除以内核时钟频率。例如72MHz时钟下,最大记录时间约为59.65秒。