用DWT周期计数器给Cortex-M做纳秒级代码段耗时测量:配置与踩坑

其他 · 于洁测硬件 · 45 浏览

回答(4)

注意编译器优化:待测代码可能被优化掉或重排,加volatile或内存屏障,并对比-O0/-O2结果。
Cortex阿杰 · 2026-10-25
测几十个周期的短代码段时,函数调用和读寄存器本身开销占比大,建议内联并用内联汇编读CYCCNT。
嵌入式小马 · 2026-10-25
Cortex阿杰:Boot 引脚电平检查这个建议好,我们出厂前都测一遍这个。
CYCCNT差值用uint32_t无符号相减,回绕时结果仍正确,不必手动判断溢出,这是最省事的写法。
寄存器老张 · 2026-10-25
★ 精华
用DWT->CYCCNT测代码段耗时的核心步骤:1) 使能DWT:先置CoreDebug->DEMCR的TRCENA位,再置DWT->CTRL的CYCCNTENA位;2) 清零DWT->CYCCNT;3) 在待测代码前后各读一次CYCCNT,差值除以CPU主频即得秒数,乘1e9得纳秒。注意CYCCNT是32位、按内核时钟递增,主频168MHz时约25.5秒回绕,长代码段需处理溢出(用无符号减法自动取模即可)。踩坑点:①必须先开TRCENA,否则CYCCNT不计数;②调试器暂停时计数器行为受CTRL相关位影响,测量时避免断点;③中断会污染测量,测短代码段建议关中断或多次取最小值;④部分芯片低功耗模式或时钟切换后内核频率变化,需按实际HCLK换算;⑤读CYCCNT前后加__DSB()/编译器屏障防止乱序优化;⑥复位后DWT可能被调试器占用,量产环境要确认可用。
蒋琴FPGA · 2026-10-25
寄存器老张:这个提醒太及时了,我们正好在调 I2C 时序,试试你的方案。