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