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

由于malloc / free还不存在,我不得不使用c / asm来创建内存管理系统。 我需要有malloc / free!

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

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

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

  • 一个内存堆栈,其中malloc增长堆栈并释放(p)通过移动[p..stack_pointer]来缩小堆栈(这会使移位后的内存地址无效)。
  • 具有可变大小内存块的链接列表(内存池)。 但是我不知道在哪里把这个记忆......应该链表是一个“全局”变量,或者“静态”?
  • 谢谢!


    对于嵌入式系统,内存在链接时分成若干部分或池,即:ro(代码+常量)rw(heap)zi(零初始化内存用于静态变量)

    您可以在链接器配置文件中添加第4节,这将有效地分配内存映射中的空间用于动态分配。

    但是,一旦您创建了动态内存的原始存储空间,那么您需要了解动态分配将会发生多少次,多大以及多频繁。 从这里你可以建立一张关于内存如何随时间变化的图片。

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

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

    {
        int inUse;
        char data[10];
    }
    

    您可以采用三个这样的结构数组(记住初始化为0并在[0]和[1]之间滑动,[2]保留用于发生少量中断并且需要下一个缓冲区的情况一个被释放(需要第三个缓冲区),alloc算法需要检查第一个缓冲区inUse并返回一个指向数据的指针,free只需要改回0。

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


    本文提供了有关内存管理技术的很好的回顾。 底部的资源部分有几个开源malloc实现的链接。


    声明一个巨大的静态字符缓冲区,并使用这个内存来编写你自己的malloc&free函数。

    用于写入malloc和free的算法可以像复杂(并优化)一样简单。

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

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

  • 使用该长度的char缓冲区来声明每个大小的结构,并使用布尔值来表示缓冲区是否被占用。
  • 然后声明上述结构的静态数组(根据系统中可用的总内存来决定数组大小)
  • 现在malloc会根据所需的大小简单地转到最合适的数组,并搜索一个空闲缓冲区(在这里使用一些搜索算法或简单地使用线性搜索)并返回。 同时将关联结构中的布尔值标记为TRUE。
  • free会简单地搜索缓冲区并将布尔值标记为FALSE。
  • 希望这可以帮助。

    链接地址: http://www.djcxy.com/p/82713.html

    上一篇: C Memory Management in Embedded Systems

    下一篇: Stack and heap in c sharp