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