Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 嵌入式实时操作系统和使用malloc/free_C++_C_Memory Management_Embedded_Rtos - Fatal编程技术网

C++ 嵌入式实时操作系统和使用malloc/free

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

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

我的程序使用一些动态分配(是的,我知道在嵌入式系统上不建议这样做)

启动任务时,我尝试调用
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尝试从中提取的位置?是的,因为在不使用操作系统时,一切正常,因此在链接器和启动中都正确配置了一切。