我有一个ChibiOS应用程序,我通过malloc()
.
但是,我观察到 100% 的时间我调用malloc()
,它返回NULL
。我已经确认:
- 单片机内存未满
- 大小为 1 的 malloc 调用也会发生该错误,因此内存块大小不是问题的原因。
errno
总是ENOMEM
在malloc()
通话后
我该如何解决这个问题?
当您查看 in 的定义时_sbrk
,os/various/syscalls.c
您可以清楚地看到它总是返回ENOMEM
错误 if CH_CFG_USE_MEMCORE == FALSE
。
除非您CH_CFG_USE_MEMCORE = TRUE
在 中设置chconf.h
,否则 ChibiOS 核心内存管理器将被完全禁用,_sbrk
并且其他与内存相关的功能仅包含在目标文件中,因此不会发生链接错误。
为了正确配置 ChibiOS,请确保在 中设置以下内容chconf.h
:
#define CH_CFG_USE_MEMCORE TRUE
为了避免遇到可靠性问题,您可能希望尽可能使用内存池或替代算法。请参阅此详细说明,了解为什么malloc()
在嵌入式系统上通常是一个坏主意(实际上在大多数嵌入式编码标准中完全禁止这样做)。