首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在FreeRTOS中使用cmocka?

如何在FreeRTOS中使用cmocka?
EN

Stack Overflow用户
提问于 2017-06-30 13:44:00
回答 1查看 438关注 0票数 0

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

嗯,cmocka在作为FreeRTOS任务运行时似乎有一些问题。在第2953行,一些信号被初始化,这会导致FreeRTOS task中的堆栈溢出。我将任务堆栈的大小增加到64kB,这是最大值,但这并没有帮助。

代码语言:javascript
复制
// 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。

代码语言:javascript
复制
// Line 30 in cmocka.c
#ifdef HAVE_SIGNAL_H
#include <signal.h>
#endif

如何在FreeRTOS中使用cmocka

EN

回答 1

Stack Overflow用户

发布于 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最终看起来像这样:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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中,我有以下内容:

代码语言:javascript
复制
#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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44839325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档