首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >嵌入式系统中的C内存管理

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

Stack Overflow用户
提问于 2011-09-28 02:55:56
回答 4查看 4.5K关注 1票数 0

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

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

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

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

  • 一个内存堆栈,其中malloc增长堆栈和空闲(P)缩小堆栈通过移动指针
  • 具有可变大小内存块的链接列表(内存池).但是我不知道把这个放在什么地方.链接列表是“全局”变量还是“静态”变量?

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-28 08:40:04

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

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

但是,一旦为动态内存创建了原始存储,就需要了解动态分配的数量、大小和频率。从这一点上,您可以构建一张内存将如何随着时间的推移被分割的图片。

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

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

代码语言:javascript
运行
复制
{
    int inUse;
    char data[10];
}

您可以使用由三个结构组成的数组(记得将inUse初始化为0,并在和1之间切换,其中2只用于当出现过多中断而下一个缓冲区被释放时(需要第三个缓冲区)的情况。分配算法需要检查第一个缓冲区!inUse,并返回指向数据的指针。空闲只需要将inUse更改为0。

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

票数 2
EN

Stack Overflow用户

发布于 2011-09-28 03:28:05

这篇文章很好地回顾了内存管理技术。底部的资源部分有几个开源malloc实现的链接。

票数 4
EN

Stack Overflow用户

发布于 2011-09-28 05:27:55

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

编写malloc和free的算法可以是复杂的(和优化的),也可以是您想要的简单的。

一个简单的方法就是跟随..。

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

  • 使用长度为这个长度的char缓冲区声明每个大小的结构,并使用一个布尔值来表示是否占用缓冲区。
  • 然后声明上述结构的静态数组(根据系统中可用的总内存确定数组大小)
  • 现在malloc只需根据所需的大小选择最合适的数组,并搜索空闲缓冲区(在这里使用一些搜索algo或简单地使用线性搜索)并返回。还将关联结构中的布尔值标记为TRUE。
  • 空闲只需搜索缓冲区并将布尔值标记为FALSE。

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7577828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档