malloc() всегда возвращает NULL в ChibiOS
У меня есть приложение ChibiOS, где я использую динамическое выделение памяти через malloc()
,
Тем не менее, я заметил, что 100% времени я звоню malloc()
, это возвращает NULL
, Я подтвердил, что:
- Память микроконтроллера не заполнена
- Ошибка также возникает для вызовов malloc размера 1, поэтому размер порции памяти не является причиной проблем.
errno
всегдаENOMEM
послеmalloc()
вызов
Как я могу решить эту проблему?
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
Чтобы избежать проблем с надежностью, вы можете использовать пулы памяти или альтернативные алгоритмы, где это возможно. Смотрите это подробное объяснение для описания почему malloc()
часто является плохой идеей для встроенных систем (на самом деле это полностью запрещено в большинстве стандартов встроенного кодирования).