【问题标题】:memory allocation/deallocation for embedded devices嵌入式设备的内存分配/释放
【发布时间】:2017-12-09 20:31:15
【问题描述】:

目前,我们在基于 C 的嵌入式应用程序中使用 malloc/free Linux 命令进行内存分配/取消分配。我听说这会导致内存碎片随着堆大小的增加/减少,因为内存分配/取消分配会导致性能下降。其他具有高效垃圾收集的编程语言通过在不使用时释放内存来解决此问题。

在基于 C 的嵌入式程序中是否有任何替代方法可以解决此问题?

【问题讨论】:

  • 这有点宽泛,缺乏细节,但是a)内存池/竞技场 b)看看SLUB allocator

标签: c memory memory-management malloc


【解决方案1】:

您可以查看名为memory pool allocation 的解决方案。 见:Memory pools implementation in C

【讨论】:

    【解决方案2】:

    是的,有一个简单的解决方案:不要在初始化之外使用动态内存分配。

    在嵌入式系统中(根据我的经验)通常只允许在程序启动时调用 malloc(这通常是按照惯例完成的,C 中没有任何东西可以强制执行此操作。尽管您可以为 malloc 创建自己的包装器以做这个)。这需要更多的工作来分析您的程序可能使用的内存,因为您必须一次分配所有内存。但是,您获得的好处是完全了解您的程序使用什么内存。

    在某些情况下,这相当简单,特别是如果您的系统有足够的内存来一次分配它可能需要的所有内容。然而,在内存严重受限的系统中,您只能自己管理内存。我已经通过编写您分配和释放内存的“自定义分配器”来完成此操作。我举个例子吧。

    假设您正在实现一些需要大量大矩阵(不是非常大,但例如 1000x1000 浮点数)的数学程序。您的系统可能没有内存来分配这些矩阵中的许多,但是如果您可以分配其中至少一个,您可以创建一个用于矩阵对象的内存池,并且每次您需要一个矩阵时,您都会从该池中获取内存,当你完成它时,你将它放回池中。如果您可以按照放入它们的相同顺序返回它们,这很容易,这意味着内存池就像一个堆栈一样工作。如果不是这种情况,也许您可​​以在每次“迭代”结束时清除整个池(假设这个数学系统是周期性的)。

    更详细地了解您要实现的具体内容,我可以提供更多相关/具体的示例。

    编辑:也请参阅 sg7 的回答:该用户提供了一个链接到完善的框架,这些框架实现了我在此处描述的内容。

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 2022-10-14
      • 2018-08-27
      • 2011-12-09
      • 1970-01-01
      • 2011-05-13
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多