当前位置:首页 > 嵌入式 > 嵌入式分享
[导读]嵌入式C代码的单元测试长期被忽视——因为交叉编译环境复杂、目标板资源有限、覆盖率数据难收集。但代码覆盖率是衡量测试充分性的硬指标,尤其在汽车、医疗等安全关键领域,覆盖率达标是必过的门槛。GCOV是GCC内置的覆盖率工具,配合交叉编译链和lcov,可以在嵌入式项目上落地覆盖率测试。本文以ARM Cortex-M裸机项目为例,展示完整流程。


嵌入式C代码的单元测试长期被忽视——因为交叉编译环境复杂、目标板资源有限、覆盖率数据难收集。但代码覆盖率是衡量测试充分性的硬指标,尤其在汽车、医疗等安全关键领域,覆盖率达标是必过的门槛。GCOV是GCC内置的覆盖率工具,配合交叉编译链和lcov,可以在嵌入式项目上落地覆盖率测试。本文以ARM Cortex-M裸机项目为例,展示完整流程。

一、编译阶段:开启GCOV选项

在Makefile或CMake中添加编译和链接选项,让编译器插入覆盖率计数代码。

CFLAGS += -fprofile-arcs -ftest-coverage

LDFLAGS += -lgcov -coverage

-ftest-coverage:生成.gcno文件(包含代码块和行号信息)

-fprofile-arcs:生成.gcda文件(运行时记录执行次数)

-lgcov:链接GCOV运行时库

编译后每个源文件会生成对应的.gcno文件,例如main.gcno、sensor.gcno。

二、运行阶段:在目标板上收集数据

由于嵌入式目标板通常没有文件系统,.gcda文件无法直接写入Flash或RAM。有两种方案:

方案1:将覆盖率数据通过UART导出

在测试程序结束时,调用GCOV的__gcov_flush()函数,将缓冲区中的数据通过自定义的串口输出函数发送到PC。

#include <gcov.h>


void send_gcov_data(void) {

   extern void __gcov_flush(void);

   __gcov_flush();  // 将覆盖率数据写入内存缓冲区

   // 将缓冲区数据通过UART发送到PC

   uint8_t *buf = (uint8_t *)__gcov_buffer_start;

   uint32_t len = __gcov_buffer_len;

   for (uint32_t i = 0; i < len; i++) {

       uart_putc(buf[i]);

   }

}

PC端接收后保存为.gcda文件,放在与.gcno相同的目录下。

方案2:使用RAM磁盘或SD卡

如果目标板有足够的RAM或SD卡,可以直接将.gcda写入文件系统。例如在RT-Thread上挂载RAMFS,测试结束后调用gcov_exit()自动写入。

三、生成报告:lcov与gcovr

将.gcno和.gcda文件拷贝到PC的同一目录,运行以下命令生成HTML报告:

# 生成.info文件

lcov --capture --directory . --output-file coverage.info

# 过滤掉系统头文件和测试框架

lcov --remove coverage.info '/usr/include/*' '*/test/*' -o filtered.info

# 生成HTML报告

genhtml filtered.info --output-directory coverage_report

打开coverage_report/index.html即可看到每个文件的覆盖率和行级详情。

四、嵌入式环境注意事项

优化级别:-O0或-Og下覆盖率最准确,-O2可能合并代码块导致行覆盖不准。

内存占用:GCOV会为每个源文件分配计数数组,对于大型项目可能占用数KB RAM,需评估目标板余量。

多任务环境:在RTOS中,__gcov_flush()需要在所有测试任务结束后调用,确保计数完整。

五、三个翻车高发点

忘记链接-lgcov:编译通过但链接时报undefined reference to __gcov_init,加上-lgcov即可。

交叉编译链不支持GCOV:某些精简版工具链(如arm-none-eabi-gcc)默认不带GCOV库,需重新编译工具链或使用--coverage选项。

.gcda文件版本不匹配:.gcda与.gcno必须由同一版本的GCC生成,否则lcov解析失败。确保PC和目标板的GCC版本一致。

GCOV让嵌入式C代码的覆盖率测试不再是纸上谈兵。通过交叉编译选项和串口导出,即使是裸机项目也能获得精确的行覆盖和分支覆盖数据。将覆盖率纳入CI流程,每次提交自动运行并生成报告,是提升代码质量的坚实一步。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭