跳转到内容
新建笔记

STM32CubeIDE 代码覆盖率

在 STM32 平台进行代码覆盖率测试,核心思路是“让 MCU 在运行中把打点信息实时送到 PC,再由 PC 端工具生成报告”。目前最常用、最省心的两条技术路线如下(均无需昂贵 trace 硬件,普通 ST-Link/J-Link 即可):


  1. 基于 STM32CubeIDE 的免费方案(GCC + gcov)

  1. 编译阶段 在 CubeIDE 里给整个工程打开以下编译选项: -fprofile-arcs -ftest-coverage -g -O0 链接阶段再追加: -lgcov --coverage 这样生成的固件里会嵌入 gcov 打点代码。

  2. 下载运行 用 ST-Link 把程序烧进板子,让业务代码全速跑一遍(测试用例、手动按键均可)。 跑完后不要复位,保持 MCU 不断电——因为覆盖率数据还躺在 RAM/flash 里。

  3. 把数据拖回 PC CubeIDE 自带 “GDB Hardware Debugging” 启动脚本,在调试器里执行两条命令即可把 .gcda 文件拉回主机:

    (gdb) dump gcov
    (gdb) quit

    如果习惯命令行,也可直接用 arm-none-eabi-gdb -ex "dump gcov" -ex "quit" 完成。

  4. 生成网页报告 在工程根目录执行:

    gcovr --html-details -o coverage.html

    浏览器打开 coverage.html 即可看到行覆盖、分支覆盖、函数覆盖,还能逐行染色。

    该流程在 ST 官方论坛有完整步骤贴,可直接照做。


  1. 基于 IAR EW + J-Link 的商用方案

  1. 打开 IAR 的 “Code Coverage” 插件(Workbench 菜单 Tools → Code Coverage)。
  2. 重新全编译,下载到板子。
  3. 运行测试用例,IAR 调试会话里会实时把已执行基本块标为绿色。
  4. 测试结束点击 “Generate Report” 即可导出 HTML/CSV 报告,支持函数级、模块级、汇编级粒度。 若配合 J-Link 的 Unlimited Flash Breakpoints,还能在 Release 版(开 -O2)上统计,不影响性能。

  1. 提升覆盖率的通用技巧

  • 把 HAL 层、启动文件、库文件排除在统计之外,只关注应用代码。
  • 用单元测试框架(如 CMocka、Unity)在 PC 上先跑一遍,再上板子补跑硬件相关路径。
  • 对中断、错误处理等“难触发”代码,用 __attribute__((weak)) 插桩或 debugger 强制改寄存器触发。
  • 将覆盖率检查加入 CI:每次 push 自动跑脚本,低于阈值(如 90%)即红灯。

一句话总结 “CubeIDE + gcovr”零成本,适合个人和中小团队;“IAR + J-Link”报告更细、支持优化级代码,适合对性能/认证要求高的项目。两种路线都无需额外 trace 硬件,普通下载器就能搞定。


来源:CSDN 原文,首次发布于 2025-11-27。