【发布时间】:2015-12-03 11:53:43
【问题描述】:
我有一个ChibiOS 应用程序,我通过malloc() 使用动态内存分配。
但是,我观察到,在我调用 malloc() 的情况下,100% 的时间它都会返回 NULL。我已经确认:
- 微控制器内存未满
- 大小为 1 的 malloc 调用也会发生错误,因此内存块大小不是问题的原因。
-
errno在malloc()调用之后始终是ENOMEM
我该如何解决这个问题?
【问题讨论】:
我有一个ChibiOS 应用程序,我通过malloc() 使用动态内存分配。
但是,我观察到,在我调用 malloc() 的情况下,100% 的时间它都会返回 NULL。我已经确认:
errno 在malloc() 调用之后始终是ENOMEM
我该如何解决这个问题?
【问题讨论】:
当你查看os/various/syscalls.c中_sbrk的定义时,你可以清楚地看到如果CH_CFG_USE_MEMCORE == FALSE,它总是返回一个ENOMEM错误。
除非您在chconf.h 中设置CH_CFG_USE_MEMCORE = TRUE,否则ChibiOS 核心内存管理器将完全禁用,_sbrk 和其他与内存相关的功能仅包含在目标文件中,因此不会发生链接错误。
为了正确配置ChibiOS,请确保在chconf.h中设置以下内容:
#define CH_CFG_USE_MEMCORE TRUE
为了避免遇到可靠性问题,您可能希望尽可能使用memory pools 或替代算法。请参阅 this detailed explanation 了解为什么 malloc() 在嵌入式系统上通常是一个坏主意(实际上在大多数嵌入式编码标准中完全禁止使用它)。
【讨论】: