用DWT周期计数器在Cortex-M上实现纳秒级函数耗时测量与代码剖析

· 行业用户 · 3 浏览

回答(4)

调试器halt会停CYCCNT,在线调试时数据不可信,建议用串口或RTT输出结果。
硬件派阿明 · 2026-10-25
测量前先跑空循环校准开销,把读取CYCCNT本身的两三次指令周期从结果里扣掉更准。
码农小刘 · 2026-10-25
建议用无符号减法算差值,天然处理一次回绕;若函数可能超59s,加溢出中断或软件计数。
嵌入式老张 · 2026-10-25
在Cortex-M上可用DWT->CYCCNT做周期级计时:先使能CoreDebug->DEMCR的TRCENA位,再置DWT->CTRL的CYCCNTENA,读取前清零DWT->CYCCNT。测量时在函数前后各读一次,差值即周期数,纳秒耗时=周期数×1e9/SystemCoreClock。注意CYCCNT为32位,在72MHz下约59.6s回绕,长函数需处理溢出(差值用无符号减法天然正确,但跨多次回绕需额外计数)。实操建议:用__disable_irq保护读取序列避免中断干扰,或多次采样取最小值消除抖动;测量点尽量靠近被测代码,避免编译器重排(加__DSB()或volatile);剖析时用宏封装BEGIN/END,配合静态数组记录各函数周期,最后统一换算输出。注意DWT在部分低端内核(如M0)不可用,需确认芯片支持。
mcuku 阿沐 · 2026-10-25