我有一个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()在嵌入式系统上通常是一个坏主意(实际上在大多数嵌入式编码标准中完全禁止这样做)。