依赖FreeRTOS的项目中使用Ceedling开展单元测试的报错问题
问题根因
FreeRTOS头文件强制要求FreeRTOSConfig.h优先于FreeRTOS.h引入,FreeRTOS.h优先于队列、任务、列表等组件头引入。你之前的配置存在三个核心问题:
- 没有将
FreeRTOSConfig.h加入前置包含列表,只加了FreeRTOS.h - 错误将FreeRTOS源码路径加入了工程source搜索路径,Ceedling会尝试编译FreeRTOS源码而非只生成mock
- CMock全局前置包含的优先级低于预处理阶段的头引入校验,无法覆盖CMock生成mock时的头解析场景
解决方案
1. 修正project.yml路径配置
删除source路径下的所有FreeRTOS源码路径,仅保留你自己的业务源码路径,将FreeRTOSConfig.h所在路径加入test搜索路径:
:paths: :test: - +:test/** - -:test/support - ../ - ../build/_deps/rtos.freertos-src/portable/GCC/ARM_CM4F - ../build/_deps/rtos.freertos-src/include - ../debug/ - [替换为你存放FreeRTOSConfig.h的目录路径] :source: - src/** :support: - test/support :libraries: []
2. 新增编译器强制前置包含参数
在test编译器参数中添加-include指令,强制所有编译场景下优先引入这两个头,从根源解决顺序问题:
:tools: :test_compiler: :arguments: - -include FreeRTOSConfig.h - -include FreeRTOS.h
3. 调整CMock配置(双重保险)
针对FreeRTOS组件头单独配置前置包含,确保CMock生成mock时头顺序正确:
:cmock: :mock_prefix: mock_ :when_no_prototypes: :warn :enforce_strict_ordering: TRUE :plugins: - :ignore - :callback :treat_as: uint8: HEX8 uint16: HEX16 uint32: UINT32 int8: INT8 bool: UINT8 :specific: :queue.h: :includes_h_pre_orig_header: - FreeRTOSConfig.h - FreeRTOS.h :task.h: :includes_h_pre_orig_header: - FreeRTOSConfig.h - FreeRTOS.h :list.h: :includes_h_pre_orig_header: - FreeRTOSConfig.h - FreeRTOS.h
4. 清理测试用例冗余代码
Ceedling会自动完成mock的初始化和校验,删除setUp和tearDown函数里的手动Init/Verify调用,避免重复调用导致异常。
验证
执行ceedling clean清理历史构建缓存,再重新运行测试即可。
内容的提问来源于stack exchange,提问作者VIPPER
相关产品推荐
相关产品推荐

