C++ 嵌入式实时操作系统和使用malloc/free
我目前正在评估在Cortex M4F上运行的SEGGER的EMBO。它有128千字节的内部RAM,2兆字节的外部RAM,所以我知道我有足够的内存 我的程序使用一些动态分配(是的,我知道在嵌入式系统上不建议这样做) 启动任务时,我尝试调用C++ 嵌入式实时操作系统和使用malloc/free,c++,c,memory-management,embedded,rtos,C++,C,Memory Management,Embedded,Rtos,我目前正在评估在Cortex M4F上运行的SEGGER的EMBO。它有128千字节的内部RAM,2兆字节的外部RAM,所以我知道我有足够的内存 我的程序使用一些动态分配(是的,我知道在嵌入式系统上不建议这样做) 启动任务时,我尝试调用malloc/OS\u malloc,其中OS\u malloc是embOS提供的线程安全版本。在这两种情况下,malloc都失败并返回空指针 在操作系统启动前执行相同的malloc/OS\u malloc操作时,它可以正常工作: **//Malloc here
malloc/OS\u malloc
,其中OS\u malloc
是embOS提供的线程安全版本。在这两种情况下,malloc
都失败并返回空指针
在操作系统启动前执行相同的malloc/OS\u 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();
**//此处的Malloc不会失败**
OS_IncDI();/*最初禁用中断*/
**//这里的Malloc不会失败**
OS_InitKern();/*初始化操作系统*/
**//Malloc在这里失败了**
OS_InitHW();/*初始化操作系统的硬件*/
OS_CREATETASK(&TCBHP,“我的任务”,HPTask,50,StackHP)//** malloc
在以下情况下可能返回失败
1) 内存不足
但正如你所说,我有足够的内存,所以情况并非如此
2) malloc无法分配请求大小的连续内存
我想选择2是对你的情况负责。 < P>我想我在路上解决问题。
链接器脚本中的设置似乎是:
_最小堆大小=0x19000;/*所需的堆数量*/
_最小堆栈大小=0x200;/*所需的堆栈数量*/
而不是:
_最小堆大小=0x00;/*所需的堆数量*/
_最小堆栈大小=0x200;/*所需的堆栈数量*/这是操作系统生产者必须回答的问题之一,或者您必须查看malloc的操作系统源代码。我很惊讶malloc在你正确初始化操作系统之前就“工作”了。我们的猜测很好,但实际上你需要去看看实际分配了什么,也许可以使用调试器来找出malloc不高兴的原因。另外,您是否检查了errno
?您的系统可能有足够的内存,但已将足够的内存分配给堆,或者分配给malloc尝试从中提取的位置?是的,因为在不使用操作系统时,一切正常,因此在链接器和启动中都正确配置了一切。