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

如何用CMake为多组测试设置不同的预编译宏定义

在Zephyr中用CMake实现CppUTest多宏值测试方案

核心思路

通过创建多个独立的测试目标,每个目标对应不同的Flash页大小宏定义,实现同一套测试代码在不同宏值下的编译与运行。目标级别的编译定义优先级高于全局选项,能有效覆盖Zephyr设备树生成的宏。

具体实现

1. 用CMake函数批量生成测试目标

编写可复用的CMake函数,自动创建对应不同页大小的测试目标,避免重复代码:

# 定义函数:生成指定页大小的Flash测试目标
# 参数1:基础测试名称;参数2:Flash页大小(2048/4096)
function(add_flash_page_test BASE_TEST_NAME PAGE_SIZE)
    # 创建CppUTest测试目标
    add_cpputest(${BASE_TEST_NAME}_${PAGE_SIZE}
        SOURCES test_flash_buffer.cpp  # 你的测试源文件
        # 可添加其他依赖源文件,比如被测试的业务代码文件
        # SOURCES ../src/flash_buffer.c
    )

    # 强制设置目标的编译宏,覆盖设备树生成的宏
    target_compile_definitions(${BASE_TEST_NAME}_${PAGE_SIZE} PRIVATE
        DT_N_NODELABEL_flashexternal_P_user_bytes_per_page=${PAGE_SIZE}
    )

    # 若测试依赖Zephyr核心库,需链接对应接口(根据实际情况调整)
    target_link_libraries(${BASE_TEST_NAME}_${PAGE_SIZE} PRIVATE
        zephyr::zephyr
        zephyr::ztest  # 如果用Zephyr的ztest框架,可添加此依赖
    )
endfunction()

# 生成两个测试目标,分别对应2048和4096字节的页大小
add_flash_page_test(flash_buffer_test 2048)
add_flash_page_test(flash_buffer_test 4096)

2. 验证测试代码的宏引用

确保测试代码或被测试的业务代码直接使用目标宏:

// 业务代码或测试代码中引用宏定义缓冲区大小
#define BUFFER_LENGTH DT_N_NODELABEL_flashexternal_P_user_bytes_per_page
uint8_t buffer[BUFFER_LENGTH];

3. 编译与运行测试

  • 编译所有测试目标:west build
  • 运行单个测试目标(以2048页大小为例):west build -t run flash_buffer_test_2048
  • 若为主机端单元测试(非嵌入式目标),直接运行生成的可执行文件:./build/zephyr/flash_buffer_test_2048

为什么之前的方法没生效?

  • 修改CMAKE_CXX_FLAGS属于全局设置,Zephyr构建系统可能会追加或覆盖这些选项,优先级低于目标级别的target_compile_definitions。
  • TEST_INCLUDE_FILES主要用于添加头文件路径,无法直接覆盖预编译宏;add_compile_options同样是全局生效,容易被目标级配置覆盖。

内容的提问来源于stack exchange,提问作者Joris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:35:58