2013-07-16 1 views
0

В настоящее время я оцениваю embOS от SEGGER, работающего на Cortex M4F. Он имеет 128 килобайт внутренней памяти и 2 мегабайта внешней памяти, поэтому я знаю, что у меня много памяти.Встраиваемые RTOS и использование malloc/free

В моей программе используются динамические распределения (да, я знаю, что это не рекомендуется для встроенных систем).

При запуске моей задачи я пытаюсь позвонить malloc/OS_malloc, где OS_malloc - это потокобезопасная версия, предоставляемая embOS. В обоих случаях malloc не удалось и вернул указатель NULL.

При выполнении же 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(); 

Я пошел и попытался использовать УКО из Micrium, и я вижу такое же поведение. Любые идеи, почему это происходит?

+0

Это была бы одна из тех вещей, на которые разработчики ОС должны были ответить - или вам придется посмотреть исходный код ОС для malloc. Я очень удивлен тем, что malloc «работает», прежде чем вы правильно инициализировали ОС. –

+0

Нас угадывает все очень хорошо, но на самом деле вам нужно взглянуть на то, что на самом деле выделяется, и, возможно, использовать отладчик, чтобы узнать, почему malloc не доволен. – ams

+0

Кроме того, вы проверили 'errno'? – ams

ответ

0

Я думаю, что я нахожусь на пути к исправлению проблемы.

, кажется, что установка в сценарии компоновки:

_Min_Heap_Size = 0x19000;/* необходимое количество кучи */ _Min_Stack_Size = 0x200;/* Необходимое количество стека */

вместо:

_Min_Heap_Size = 0x00;/* необходимое количество кучи */ _Min_Stack_Size = 0x200;/* необходимое количество стека */

1

malloc может возвращает неудачу в следующем условии

Running out of memory 1), но, как вы сказали у меня есть много памятей так что это не так.

2) malloc is not able to allocate contiguous memory of requested size.

Я думаю, что вариант 2 несет ответственность за ваш случай.