如何使用arm-none-eabi-gcc + cmake设置cmocka示例?

4
我正在开发基于stm32f4xx系统的固件。为此,我建立了一个基于ARM的arm-none-eabi-gcc工具链和cmake的工具链。这个工具链可以在Ubuntu上使用。我可以进行交叉编译和调试(通过openocd + eclipse IDE)。现在我想为我的代码添加一些功能测试。我查看了一下,貌似cmocka是嵌入式软件测试的好工具。
现在我正在寻找一个示例/模板,将测试集成到cmake构建中。
假设在myfunc.c中有一个简单的函数。
#include "myFunc.h"

int buffer[10];

void myFunc(int i, int val) {
    buffer[i] = val;
}

如果我理解正确,我可以在一个单独的C文件中进行测试,比如"test.c"。
#include "myFunc.h"
#include <cmocka.h>

// function success
static void test_myFunc_positive() {
    for(int i = 0; i < 10; i++) {
        myFunc(i,i);
    }
}

static void test_myFunc_outofbounds() {
    myFunc(100,44);
}


int main(void) {
    const struct CMUnitTest tests[] = {
        cmocka_unit_test(test_myFunc_positive),
        cmocka_unit_test(test_myFunc_outofbounds),
    };
    return cmocka_run_group_tests(tests, NULL, NULL);
}

通常我运行
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE="cmake/STM32Toolchain.cmake"

我的问题包含一些子问题: 1.) 我安装了libcmocka-dev。这是为我的主机系统而安装的。我需要为我的arm-none-eabi-gcc编译器安装cmocka吗? 2.) 如何设置cmake来选择cmocka库,构建测试并在主机系统上运行它?我认为我的工具链文件需要被忽略。


1
我认为目标不需要运行cmoka,我们通常使用cmoka编写a.c和相应的a_test.c,这个单元测试只在主机上运行。 - How Chen
1
你是对的。这并非必须的。但通常很难将测试代码分离出来,以使其能够在主机上编译。因此,在目标测试中是一个严肃的场景。 - eDeviser
在这方面有什么进展吗?我也有一个使用Cmake、arm-none-eabi-gcc和基于STM32f4xx的系统的项目。我尝试将cmocka作为子目录添加并将其添加到我的cmake文件中,但似乎会陷入认为它正在编译具有Linux类似功能的Linux系统。 - CivFan
1个回答

1

您的源代码看起来很好。以下是如何使用cmocka的方法。

我建议您也交叉编译 cmocka的源代码。实际上,我是这样做的:

  1. cmocka.c添加到您的源文件中
  2. 将'cmocka.h'和cmocka_pbc.hcmocka_private.h添加到您的包含目录中。
  3. 编译并运行您的软件

PS:我不知道libcmocka-dev。我认为这是cmocka的预编译版本?

PPS:我在将cmocka的输出重定向到我的串行UART时遇到了一些问题。如果您遇到相同的问题,请随时问我。


你可能还需要将 --specs=nosys.specs 添加到编译器和链接器标志中。我还不得不在我的 cmake .. 命令中添加 -DHAVE_CLOCK_GETTIME=0-DHAVE_CLOCK_GETTIME_REALTIME=0,以便它不会尝试使用函数 clock_getttime() - CivFan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接