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

· 行业用户 · 3 浏览

回答(4)

注意编译器优化:待测代码可能被优化掉或重排,加volatile或内存屏障,并对比-O0/-O2结果。
Cortex阿杰 · 2026-10-25
测几十个周期的短代码段时,函数调用和读寄存器本身开销占比大,建议内联并用内联汇编读CYCCNT。
嵌入式小马 · 2026-10-25
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可能被调试器占用,量产环境要确认可用。
mcuku 阿沐 · 2026-10-25