malloc() 在 ChibiOS 中总是 returns NULL
malloc() always returns NULL in ChibiOS
我有一个 ChibiOS 应用程序,我在其中通过 malloc()
使用动态内存分配。
但是,我观察到 100% 的时间我调用 malloc()
,它 returns NULL
。我已经确认:
- 单片机内存未满
- size-1 malloc 调用也会出现错误,因此内存块大小不是问题的原因。
errno
在 malloc()
调用 之后总是 ENOMEM
我该如何解决这个问题?
当您查看 os/various/syscalls.c
中 _sbrk
的定义时,您可以清楚地看到如果 CH_CFG_USE_MEMCORE == FALSE
,它总是 returns 一个 ENOMEM
错误。
除非您在chconf.h
中设置CH_CFG_USE_MEMCORE = TRUE
,否则ChibiOS核心内存管理器将被完全禁用并且_sbrk
和其他与内存相关的功能仅包含在目标文件中,因此没有链接发生错误。
为了正确配置ChibiOS,请确保在chconf.h
中设置以下内容:
#define CH_CFG_USE_MEMCORE TRUE
为了避免 运行 陷入可靠性问题,您可能想使用 memory pools or alternative algorithms instead where possible. See this detailed explanation 来描述为什么 malloc()
在嵌入式系统上通常是个坏主意(实际上在完全符合大多数嵌入式编码标准)。
我有一个 ChibiOS 应用程序,我在其中通过 malloc()
使用动态内存分配。
但是,我观察到 100% 的时间我调用 malloc()
,它 returns NULL
。我已经确认:
- 单片机内存未满
- size-1 malloc 调用也会出现错误,因此内存块大小不是问题的原因。
errno
在malloc()
调用 之后总是
ENOMEM
我该如何解决这个问题?
当您查看 os/various/syscalls.c
中 _sbrk
的定义时,您可以清楚地看到如果 CH_CFG_USE_MEMCORE == FALSE
,它总是 returns 一个 ENOMEM
错误。
除非您在chconf.h
中设置CH_CFG_USE_MEMCORE = TRUE
,否则ChibiOS核心内存管理器将被完全禁用并且_sbrk
和其他与内存相关的功能仅包含在目标文件中,因此没有链接发生错误。
为了正确配置ChibiOS,请确保在chconf.h
中设置以下内容:
#define CH_CFG_USE_MEMCORE TRUE
为了避免 运行 陷入可靠性问题,您可能想使用 memory pools or alternative algorithms instead where possible. See this detailed explanation 来描述为什么 malloc()
在嵌入式系统上通常是个坏主意(实际上在完全符合大多数嵌入式编码标准)。