You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

依赖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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 05:15:03