当前,我们在基于C的嵌入式应用程序中使用Malloc/Free Linux命令进行内存分配/DE分配。我听说这会导致内存碎片,因为由于内存分配/DE分配,堆的大小增加/减小,这会导致性能降解。带有高效垃圾收集的其他编程语言通过在不使用时释放内存来解决此问题。
是否有其他方法可以解决基于C的嵌入式程序中的此问题?
您可以查看称为memory pool allocation
的解决方案。请参阅:C
是的,有一个简单的解决方案:不要在初始化之外使用动态内存分配。
(根据我的经验)在嵌入式系统中很常见,只能在程序启动时允许呼叫到Malloc(通常是通过惯例完成的,C中没有什么可以强制执行此操作的。尽管您可以为Malloc创建自己的包装器做这个)。这需要更多的工作来分析您的程序可能使用的内存,因为您必须一次分配这些内存。但是,您获得的好处是对您程序使用的内存的完全理解。
在某些情况下,这非常简单,特别是如果您的系统有足够的内存来一次分配所有可能需要的一切。但是,在严格的内存有限的系统中,您自己管理内存。我已经看到了通过编写您分配和免费内存的"自定义分配器"来完成的。我将提供一个例子。
假设您正在实施一些需要大量矩阵的数学程序(例如,1000x1000浮子)。您的系统可能没有内存来分配这些矩阵中的许多,但是如果您可以至少分配其中一个矩阵,则可以创建用于矩阵对象的内存池,每次您需要一个矩阵时,都可以从该池中获取内存,当您完成它后,您将其返回到游泳池。如果您可以按照您获得的顺序返回它们,这很容易,这意味着内存池就像堆栈一样工作。如果不是这种情况,也许您可以在每个"迭代"结束时清除整个池(假设此数学系统是周期性的)。
有了更多的详细信息,您可以提供更相关/具体的示例。
编辑:也请参见SG7的答案:该用户提供了一个链接到完善的框架,这些框架实现了我在此处的内容。