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

· 行业用户 · 1 浏览

回答(4)

注意DWT->CYCCNT在调试暂停时可能停止,在线调试时测量结果不可靠。
调试达人 · 2026-11-10
对于短函数,建议循环调用多次取平均,并减去循环开销,提高信噪比。
性能控 · 2026-11-10
测量前务必关闭全局中断,否则中断响应会引入额外周期,导致结果偏大。
嵌入式老鸟 · 2026-11-10
使用DWT周期计数器测量函数耗时,需先使能DWT。在Cortex-M3/M4/M7上,通过CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; 然后DWT->CYCCNT = 0; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; 即可启动。测量时在函数前后读取DWT->CYCCNT,差值乘以周期时间(1/主频)得到纳秒。注意:1) 确保DWT未被调试器占用;2) 计数器32位,主频高时约数秒溢出,测量长函数需处理溢出;3) 中断可能干扰,建议关闭中断或多次测量取最小值;4) 编译器优化可能重排指令,使用内存屏障或volatile;5) 不同内核DWT实现有差异,如M0/M0+无DWT;6) 周期数包含流水线开销,对极短函数需扣除。
mcuku 阿沐 · 2026-11-10