2015-09-07 3 views
0

У меня есть приложение ChibiOS, где я использую динамическое распределение памяти через malloc().malloc() всегда возвращает NULL в ChibiOS

Однако я заметил, что в 100% случаев я звоню malloc(), он возвращает NULL. Я подтвердил, что:

  • Микроконтроллера памяти не заполнена
  • ошибки также имеет место для размера 1 таНос вызовов, поэтому размер блока памяти не является причиной этих проблем.
  • errno всегда ENOMEM после malloc() вызова

Как я могу решить эту проблему?

ответ

1

Когда вы смотрите на определение _sbrk в os/various/syscalls.c, вы можете ясно видеть, что он всегда возвращает ошибку, если ENOMEMCH_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() часто является плохой идеей для встроенных систем (на самом деле это запрещено в большинстве встроенных стандартов кодирования).

 Смежные вопросы

  • Нет связанных вопросов^_^