0

我在运行FreeRTOS的嵌入式 arm 微控制器(stm32)上使用cmocka

好吧,cmocka 在作为 FreeRTOS 任务运行时似乎有一些问题。在第 2953 行,一些信号被初始化,这会导致 FreeRTOS任务中的堆栈溢出。我将任务堆栈大小增加到最大 64kB,但这无济于事。

// Line 2953 of cmocka.c
for (i = 0; i < ARRAY_SIZE(exception_signals); i++) {
    default_signal_functions[i] = signal(
        exception_signals[i], exception_handler);
}

如果我在没有启动 FreeRTOS 调度程序的情况下运行 cmocka,它工作得很好。

但我需要用 FreeRTOS 运行 cmocka。所以我尝试通过传递-DHAVE_SIGNAL_H给编译器来运行 cmocka 而不使用 signal.h,然后编译器应该禁用第 30 行中的定义。但这不会禁用信号的使用。它只是禁用包含。

// Line 30 in cmocka.c
#ifdef HAVE_SIGNAL_H
#include <signal.h>
#endif

如何将cmockaFreeRTOS一起使用?

4

1 回答 1

0

我在 ARM Cortex-M3 上使用 cmocka 和 FreeRTOS。我目前使用的是 cmocka 1.1.1 版本,较新的版本可能有不同的配置需求。我的堆栈通常为 16KiB,因此除非您编写了一些需要大量堆栈的测试,否则您不应该在使用 64KiB 堆栈时遇到任何问题。

配置实际上更多地取决于您使用的 C 库,而不是您的操作系统。我有两个项目使用带有 cmocka 的 FreeRTOS,但一个使用 MUSL 的精简版本作为其 C 库,另一个使用专有的 C 库。

以下是我使用 MUSL 配置项目的方式...

MUSL 已经signal.h并且我已经实现了一些时间功能,所以我config.h最终看起来像这样:

#ifndef CMOCKA_CONFIG_H_
#define CMOCKA_CONFIG_H_

#define HAVE_SIGNAL_H
#define HAVE_CLOCK_GETTIME_REALTIME
#define HAVE_STRUCT_TIMESPEC
#define CMOCKA_PLATFORM_INCLUDE

#endif /* CMOCKA_CONFIG_H_ */

我创建了以下 C 文件,我将其命名cmocka_platform.c为满足一些 cmocka C 库依赖项,这些依赖项在我的 MUSL 精简版中未实现,请注意我只是让信号函数返回 NULL:

#include <stdlib.h>
#include <stdio.h>

FILE *const stdin = NULL;
FILE *const stdout = NULL;
FILE *const stderr = NULL;

void (*signal(int sig, void (*func)(int)))(int) {
    return NULL;
}

在我的cmocka_platform.h我有以下内容:

#include <stdlib.h>
#include <stdio.h>
#include <setjmp.h>
#include <stddef.h>

#define CMOCKA_ENABLED

#define exit(status) while(1)

#define abort() while(1)

#define getenv(env) NULL

#define fputs(str, stream) my_printf(MYLOG_LEVEL_D, str)

#define fflush(stream)

#define fopen(stream, mode) NULL

#define fclose(stream)

#define fprintf(stream, format, ...) my_printf(MYLOG_LEVEL_D, format, ##__VA_ARGS__)

#define printf(format, ...) my_printf(MYLOG_LEVEL_D, format, ##__VA_ARGS__)

我从 newlib 项目中找到了 setjmp 和 longjmp 的开源实现,可以轻松地将其修改为自包含。这是一个链接:https ://sourceware.org/git/?p=newlib-cygwin.git;a=blob_plain;f=newlib/libc/machine/arm/setjmp.S;h=21d6ff9e7ff3762536eddcd317ae4da6e6ba64a2;hb=refs/负责人/大师

于 2020-03-27T17:03:46.933 回答