我在运行FreeRTOS的嵌入式ARM微控制器(stm32)上使用cmocka。
嗯,cmocka在作为FreeRTOS任务运行时似乎有一些问题。在第2953行,一些信号被初始化,这会导致FreeRTOS task中的堆栈溢出。我将任务堆栈的大小增加到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。因此,我尝试在不使用signal.h的情况下运行cmocka,方法是将-DHAVE_SIGNAL_H传递给编译器,编译器应禁用第30行中的定义。但这并不会禁用信号的使用。它只是禁用了include。
// Line 30 in cmocka.c
#ifdef HAVE_SIGNAL_H
#include <signal.h>
#endif如何在FreeRTOS中使用cmocka
发布于 2020-03-28 01:03:47
我在ARM Cortex-M3上使用cmocka和FreeRTOS。我目前使用的是cmocka的1.1.1版本,较新的版本可能有不同的配置需求。我的堆栈通常是16KiB,所以你应该不会遇到64KiB堆栈的任何问题,除非你已经编写了一些需要巨大堆栈的测试。
配置实际上更多地取决于您正在使用的C库,而不是您的操作系统。我有两个使用FreeRTOS和cmocka的项目,但其中一个使用精简版的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/heads/master
https://stackoverflow.com/questions/44839325
复制相似问题