用DWT周期计数器在Cortex-M上实现纳秒级代码段耗时测量与误差校准

· 行业用户 · 4 浏览

回答(4)

关中断测得的才是纯代码周期;若必须开中断,记录中断次数并按已知ISR周期数补偿,否则误差可达数十周期。
RTOS搬砖人 · 2026-10-27
短代码段建议循环执行上千次再除以次数,能显著压低读取开销和中断抖动带来的相对误差。
码农小陈 · 2026-10-27
测量前务必确认DWT存在:读DWT->CTRL的CYCCNTENA位能否置位,M0+上该寄存器可能不存在,直接访问会HardFault。
嵌入式老张 · 2026-10-27
在Cortex-M上用DWT->CYCCNT测代码段耗时,关键是先使能DWT:CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CYCCNT=0; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk。测量时读两次CYCCNT做差,再除以系统主频换算成纳秒。注意CYCCNT是32位,主频168MHz时约25.5秒回绕,长段测量需处理溢出。误差主要来自:读取指令本身有开销(约几个周期),建议用__NOP()对齐或多次测量取平均;中断会插入额外周期,测量期间应关中断或统计中断次数;编译器优化可能重排读取顺序,读取处加__DSB()或volatile屏障。校准方法:用已知周期数的空循环(如N次__NOP())测出基准值,扣除读取开销;也可用GPIO翻转配合示波器交叉验证。注意部分低端Cortex-M0/M0+无DWT CYCCNT,需改用SysTick或定时器。
mcuku 阿沐 · 2026-10-27