如何使用STM32 CubeIDE定位慢代码位置及统计函数执行耗时
STM32 CubeIDE性能排查与耗时统计方案
在STM32 CubeIDE中完全可以实现慢代码定位、单函数执行耗时统计,常用实现方案如下:
方法1:SysTick计数统计(无需额外硬件,实现简便)
- CubeIDE默认生成的工程通常会配置SysTick定时器为1ms中断,全局计数变量为
uwTick,如果需要更高统计精度,可以自行将SysTick时钟源设为内核时钟,调整计数周期到1us级别 - 统计代码模板:
// 记录起始计数 uint32_t start_tick = uwTick; // 执行目标测试函数 TargetTestFunction(); // 计算耗时(单位和SysTick计数周期一致,默认1ms) uint32_t exec_cost = uwTick - start_tick;
- 注意如果被测函数耗时超过SysTick的计数溢出周期,需要额外添加溢出判断逻辑避免统计错误
方法2:DWT数据观察点计数(高精度,适合短耗时函数)
Cortex-M3/M4/M7等内核自带DWT模块,可以实现微秒甚至纳秒级的耗时统计,无需占用额外外设资源:
- 首先初始化DWT模块:
// 启用DWT外设时钟 CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // 清空计数寄存器 DWT->CYCCNT = 0; // 启动内核 cycle 计数 DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
- 耗时统计逻辑:
uint32_t start_cnt = DWT->CYCCNT; TargetTestFunction(); uint32_t end_cnt = DWT->CYCCNT; // 换算为微秒,SystemCoreClock为内核运行频率(单位Hz) uint32_t cost_us = (end_cnt - start_cnt) / (SystemCoreClock / 1000000);
- 注意Cortex-M0/M0+内核无DWT模块,无法使用该方案
方法3:IDE内置性能分析工具(可视化定位慢代码)
- 进入调试模式后,打开
Analysis分类下的Performance Counters视图,启用后可以实时统计各段代码的执行占比、调用次数,直接定位运行缓慢的代码位置 - 若芯片支持SWO Trace功能,且硬件已引出SWO引脚,可配置启用Trace统计,生成完整的函数调用耗时报表,自动按耗时排序,快速识别耗时最长的函数
统计注意事项
- 统计耗时建议暂时关闭无关中断,避免中断抢占被测函数导致统计结果偏大
- 多次统计取平均值可以排除偶然误差,结果更准确
内容的提问来源于stack exchange,提问作者yeuop
相关产品推荐
相关产品推荐

