C嵌入式系统中的内存管理
由于malloc / free还不存在,我不得不使用c / asm来创建内存管理系统。 我需要有malloc / free!
我正在考虑使用内存堆栈作为内存空间,但这会失败,因为当堆栈指针缩小时,分配的空间会发生难看的事情。
1)内存分配在哪里 ? 如果我将它随机放置在堆/堆栈的中间并且堆/堆栈扩展,将会与分配的空间发生冲突!
12什么是最简单/最干净的内存管理解决方案? 这些是我研究过的唯一选项:
谢谢!
对于嵌入式系统,内存在链接时分成若干部分或池,即: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的算法可以像复杂(并优化)一样简单。
一个简单的方法可能是...
根据应用程序中内存分配需求的类型,尝试查找最常见的缓冲区大小
希望这可以帮助。
链接地址: http://www.djcxy.com/p/82713.html