我在 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/负责人/大师