嵌入式系统中的C内存管理

时间:2011-09-28 02:55:56

标签: c assembly

我必须使用c / asm来创建内存管理系统,因为malloc / free还不存在。我需要才能拥有malloc / free!

我在考虑使用内存堆栈作为内存的空间,但这会失败,因为当堆栈指针收缩时,分配的空间会发生丑陋的事情。

1)哪里会分配内存?如果我将它随机放置在堆/堆栈的中间并且堆/堆扩展,则会与分配的空间发生冲突!

12什么最简单/最干净的内存管理解决方案?这些是我研究过的唯一选择:

  • 一个内存堆栈,其中malloc增长堆栈,free(p)通过移位[p..stack_pointer]来收缩堆栈(这会使移位的内存地址无效......)。
  • 具有可变大小内存块的链表(Memory Pool)。但是我不知道哪里将它放在内存中......链表应该是“全局”变量还是“静态”?

谢谢!

4 个答案:

答案 0 :(得分:4)

This article提供了对内存管理技术的良好回顾。底部的资源部分链接到几个开源malloc实现。

答案 1 :(得分:2)

声明一个巨大的静态字符缓冲区并使用此内存编写自己的malloc&免费功能。

编写malloc和free的算法可以像你想要的那样复杂(和优化)或简单。

一种简单的方法可能是......

根据应用程序中内存分配需求的类型,尝试查找最常用的缓冲区大小

  • 使用该长度的char缓冲区声明每个大小的结构 和一个布尔值来表示缓冲区是否被占用。
  • 然后声明上述结构的静态数组(决定数组大小 基于系统中可用的总内存量)
  • 现在malloc会根据它来选择最合适的数组 所需的大小和搜索免费缓冲区(在这里使用一些搜索算法 或者只是使用线性搜索)并返回。同时在标记中标记布尔值 相关结构为TRUE。
  • free将只搜索缓冲区并将布尔值标记为FALSE。

希望这会有所帮助。

答案 2 :(得分:2)

对于嵌入式系统,内存在链接时分为几个部分或池,即: ro(代码+常量) rw(堆) zi(静态变量的零初始化内存)

您可以在链接器配置文件中添加第4部分,以便在内存映射中有效地分配空间以进行动态分配。

但是,一旦为动态内存创建了原始存储,那么您需要了解动态分配的发生次数,大小和频率。从这里你可以建立一个记忆如何随着时间的推移而分裂的图片。

通常,运行OS的应用程序不会使用动态内存,因为您不希望必须处理malloc失败的后果。如果可能的话,更好的解决方案是设计避免它。如果这根本不可能,请尝试使用一些大型结构来简化动态行为,这些结构在需要使用之前预先分配了数据。

例如,假设您有一个处理10字节数据的应用程序,同时接收要处理的下一个10字节数据,您可以实现一个简单的缓冲解决方案。驱动程序将始终请求相同大小的缓冲区,并且需要3个缓冲区。向结构添加一些元数据:

{
    int inUse;
    char data[10];
}

你可以采用这三种结构的数组(记住初始化inUse为0并在[0]和[1]之间轻弹,[2]保留用于发生一些太多中断和下一个缓冲的情况是必需的缓冲区1被释放(需要第三个缓冲区).ADC算法需要检查第一个缓冲区!inUse并返回一个指向数据的指针。空闲只需要将其更改回使用。

根据您使用的可用RAM和机器(物理/虚拟寻址)的数量,有许多可能的算法,但算法越复杂,分配的时间就越长。

答案 3 :(得分:0)

使用GNU C library。您只能使用malloc()free()或该库的任何其他子集。借用设计和/或实施以及重新发明轮子是提高工作效率的好方法。

当然,除非这是家庭作业,否则练习的目的是实施mallocfree ....