В настоящее время я оцениваю embOS от SEGGER, работающей на Cortex M4F. Он имеет 128 килобайт внутренней памяти и 2 мегабайта внешней памяти, так что я знаю, что у меня достаточно памяти.
Моя программа использует некоторые динамические распределения (да, я знаю, что это не рекомендуется во встроенных системах).
При запуске своей задачи я пытаюсь позвонить malloc/OS_malloc
, где OS_malloc
является потокобезопасной версией, предоставляемой из embOS. В обоих случаях, malloc
не удалось и вернул нулевой указатель.
Делая то же самое malloc/OS_malloc
до запуска ОС она работает правильно:
**//Malloc here does not fail**
OS_IncDI(); /* Initially disable interrupts */
**//Malloc here does not fail**
OS_InitKern(); /* Initialize OS */
**//Malloc here does fail !!**
OS_InitHW(); /* Initialize Hardware for OS */
OS_CREATETASK(&TCBHP, "My Task", HPTask, 50, StackHP); //**<--And off course malloc failes inside teh task also**
OS_Start();
Я пошел и попытался использовать UCOS от MICRIUM, и я вижу то же самое поведение. Есть идеи, почему это происходит?
malloc
может вернуть ошибку в следующем состоянии
1)Running out of memory
но как ты сказал у меня много памяти так что это не тот случай.
2)malloc is not able to allocate contiguous memory of requested size
,
Я думаю, вариант 2 отвечает за ваше дело.
Я думаю, что я нахожусь на пути решения проблемы.
кажется, что установка в скрипте компоновщика:
_Min_Heap_Size = 0x19000; / * необходимое количество кучи * /
_Min_Stack_Size = 0x200; / * необходимое количество стека * /
вместо :
_Min_Heap_Size = 0x00; / * необходимое количество кучи * /
_Min_Stack_Size = 0x200; / * необходимое количество стека * /