嵌入式C中的动态内存分配

Sau*_*ber 0 c memory embedded malloc ram

我可以在嵌入式C中使用malloc和delete函数吗?例如,我有一个函数,其中在函数malloc的结构上创建了指针.这个函数在ram中返回地址,我可以使用它.退出我的功能,在那里分配了内存,这个指针将被删除或者这个内存为此保留,而不是将函数删除终止?

Typedef struct {
  Char varA;
  Char varB 
} myStruct ;

Void myfunc ( void) 
{
  myStruct * ptrStruct = ( myStruct *) malloc ( sizeof (myStruct)) ;
  // Code here 
  //........

  return ;    
}
Run Code Online (Sandbox Code Playgroud)

Lun*_*din 11

通常,您不应该malloc在嵌入式系统中使用,因为这样做没有任何意义 ,如此处所述.特别是,在裸机系统上使用它并没有任何意义.

使用动态内存分配的唯一有意义的地方是大型托管,多进程系统,其中多个进程共享相同的RAM.如果您对嵌入式系统的定义是Android智能手机或便携式PC,那么可以使用malloc.

如果你发现自己在其他任何地方使用它,它几乎肯定意味着你的程序设计存在根本缺陷,而且你不知道堆是如何工作的.

此外,几乎所有嵌入式系统编程标准都禁止动态内存分配.

  • 在互联网上的其他地方"解释"并不是真的.您引用的示例是系统wuth 4kb的RAM.并非所有嵌入式系统都具有这种性质.有很多理由不在*some*嵌入式系统中使用动态内存分配,但你必须了解这些原因,以及特定系统的约束和要求,以做出明智的决定,而不是遵循一些不理解的教条.此外,我建议"许多嵌入式系统编程标准",而不是"几乎所有" - 即使它是真的,也很难明显地支持 (4认同)

Cli*_*ord 5

嵌入式系统没有任何特定的东西阻止使用动态内存.

但是,您可能需要以多种方式为其提供支持,例如:

  • 您需要确保链接器为动态堆分配足够的空间.在堆栈和任何其他保留分配之后,某些链接描述文件可能已经自动将所有剩余内存分配给堆.
  • 您可能需要实现低水平的存根,以使库访问堆内存-例如在newlib库,你需要实现sbrk_r()malloc()等才能正常工作.
  • 在多线程系统中,您可能需要实现互斥存根以确保安全堆分配.如果库没有提供这样的存根,那么在这样的环境中使用malloc()/ free()等将是不安全的,你应该编写外部声明锁的包装函数.

但是,为什么您可能选择避免在嵌入式系统中使用动态内存(或至少是标准库实现的动态内存),有很多原因:

  • 标准分配方案具有不适合硬实时系统的非确定性定时.
  • 您需要为每个分配优雅地处理分配失败的可能性.安全地处理潜在的非确定性运行时错误比仅仅让编译器在构建时告诉您内存不足更复杂.
  • 你需要防止内存泄漏; 对于任何系统都是如此,但没有操作系统可以管理内存耗尽并杀死泄漏过程,您的系统将如何运行?
  • 没有互斥锁存根或包装函数,标准库堆管理可能不是线程安全的.
  • 破坏堆的错误不太可能立即影响执行,通常仅在执行新的堆操作时导致可观察到的失败,导致在与实际原因无关的时间和位置处的非确定性行为 - 使得它们非常难以诊断.对于任何系统来说都是如此,但是交叉托管的嵌入式系统中的调试工具通常不如自托管系统那么复杂.