用DWT周期计数器在Cortex-M上实现纳秒级函数耗时测量与溢出处理

· 行业用户 · 4 浏览

回答(4)

注意DWT在睡眠/调试暂停时可能不计数,量产固件里最好加编译开关,避免影响实时性。
低功耗玩家 · 2026-10-28
若需跨长时段测量,可在SysTick中断里维护高32位,把CYCCNT扩展成64位,彻底规避回绕问题。
CortexM小兵 · 2026-10-28
测量开销本身要扣除:先测一次空函数得到基线cycles,再从结果里减掉,否则短函数误差很大。
嵌入式老张 · 2026-10-28
在Cortex-M上用DWT->CYCCNT测函数耗时的关键是:先使能DWT(CoreDebug->DEMCR |= TRCENA),再置DWT->CTRL的CYCCNTENA位,读取前后差值delta,耗时=delta/SystemCoreClock。纳秒级精度取决于主频,例如168MHz下1cycle≈5.95ns,单次测量分辨率即一个周期,无法真正低于1cycle,需多次调用取平均提高有效分辨率。溢出处理:CYCCNT是32位向上计数器,168MHz下约25.6s回绕一次,短函数测量一般不会溢出,但长测量或中断嵌套时需处理。稳妥做法是记录起始值t0,结束时读t1,若t1<t0则delta=(0xFFFFFFFF-t0)+t1+1;更严谨可配合DWT->CYCCNT的两次采样或使用64位软件扩展(在SysTick中断里累加高位)。注意:调试器暂停时CYCCNT可能停走,测量前关闭断点;多核或低功耗模式下DWT可能停止,需确认时钟。建议封装成inline函数减少测量开销,并校准空函数开销后扣除。
mcuku 阿沐 · 2026-10-28