嵌入式RTOS和使用malloc/free

Embedded RTOS and using malloc/free

本文关键字:malloc free RTOS 嵌入式      更新时间:2023-10-16

我目前正在评估Cortex M4F上运行的SEGGER的embOS。它有128千字节的内部RAM和2兆字节的外部RAM,所以我知道我有足够的内存。

我的程序使用了一些动态分配(是的,我知道这在嵌入式系统上是不推荐的)。

在启动任务时,我尝试调用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的uCOS,我看到了同样的行为。你知道为什么会这样吗?

我认为我在路上解决这个问题。

链接器脚本中的设置似乎是:

_Min_Heap_Size=0x19000;/*所需堆数量*/_Min_Stack_Size=0x200;/*所需堆叠数量*/

而不是:

_Min_Heap_Size=0x00;/*所需堆数量*/_Min_Stack_Size=0x200;/*所需堆栈数量*/

malloc可能在以下条件下返回失败

1) Running out of memory,但正如你所说,我有足够的内存,所以事实并非如此。

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

我想选项2对你的情况负责。