OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8320|回复: 4

uC/GUI学习笔记——内存管理

[复制链接]

12

主题

39

帖子

4

精华

高级会员

Rank: 4

积分
724
金钱
724
注册时间
2013-5-10
在线时间
2 小时
发表于 2013-11-26 13:26:09 | 显示全部楼层 |阅读模式
    与uc/os内存管理相似,ucgui也存在类似存储控制块的结构,不过它不叫内存控制块,而叫内存分配信息节点(或叫内存管理单元)。方便起见,我们暂且也将其称为存储控制块。存储控制块以数组形式存在,同时也构成双向链表,而ucos中的存储控制块则是单向链表。与ucos内存管理刚好相反,在ucos中的内存控制块链表是用于记录未分配的存储控制块的,而ucgui的双向链表则是用于记录已经分配的存储控制块。

 

句柄:实际就是数组某一元素的索引号。

 

 

 

 

 

 

 uC/GUI动态内存分配过程:

1.    最初,假如进行4次内存申请操作:

 

(1)最初申请的内存,只要没有进行释放操作,那么所申请的内存块一定都是连续的。

(2)数组中第0个元素始终被系统占用,用于维护链表头结点。所以内存分配必须从索引1开始。

 

 

2.    释放掉第2块内存后:

释放内存的操作很简单:

(1)从数组的角度:将该控制块中的Size参数清零,即标记为空闲控制块。

(2)从链表的角度:将该节点从双链表中删除;

 

 

3.    申请了一块更大的内存:

(1)从数组的角度,查找空闲存储控制块,即Size参数为0的控制块;

(2)从链表的角度,查找相邻节点之间是否有符合条件的空闲内存;

(3)将(1)找到的控制块插入到(2)中合适的位置。

(4)填充存储控制块的相关信息,并返回数组索引号。

 

 

4.    又申请了一块较小的内存:

(1)从数组的角度,查找空闲存储控制块,即Size参数为0的控制块

(2)从链表的角度,查找相邻节点之间是否有符合条件的空闲内存;

(3)将(1)找到的控制块插入到(2)中合适的位置。

(4)填充存储控制块的相关信息,并返回数组索引号。

 

所以,被占用内存块的排列顺序是与控制块链表的顺序一一对应的。即链表中的Off参数是从低到高排列的,而数组中的Off参数是无序的。

 

关键函数伪代码

 

 

分配函数:_Alloc

_Alloc()

{

1调用Size2LegalSize将要分配内存大小调整至最小粒度对齐

2)从数组的角度,查找空闲存储控制块,FindFreeHandle中完成

3)从链表的角度,查找相邻节点之间是否有符合条件的空闲内存,在FindHole中完成;

4)将找到的存储控制块插入链表中合适的位置;

5)填充控制块相关参数,并将分配的内存块清零;

6)更新GUI_ALLOC的统计参数;

7)返回控制块索引号。

}

 

 

查找空闲存储控制块函数:FindFreeHandle

FindFreeHandle()

{

1)从控制块数组索引1开始,查找Size0的元素;

2)找到了,返回索引号;没找到,返回0

}

 

 

查找空闲内存函数:FindHole

FindHole()

{

1)从链表头开始,顺序查找相邻链表之间是否有空闲内存,查找方法:

后一结点Off  前一结点Off + Size

看后一结点与前一点之间的间隙是否满足此次分配

2)如果(1)找到了符合条件的节点,则返回前一节点的句柄;

如果没找到,则从最后剩余空间开始分配,返回最后一个节点的句柄。

}

 

 

释放函数:GUI_ALLOC_Free

GUI_ALLOC_Free()

{

1)从数组的角度,根据指定的内存句柄,将对应的控制块Size参数清零;

2)从链表的角度,将该节点从链表中删除;

3更新GUI_ALLOC中的统计参数。

}

 

 

 

 

参考资料:

UCGUI 技术文集:《UCGUI的动态内存分配的原理深入分析》

                                  《几种动态内存分配策略的比较分析》

gliethttp博客:浅析μC/GUI-v3.98GUI_ALLOC_AllocZero()内存申请转句柄hWin函数 

uCGUI学习笔记——内存管理.pdf

396.29 KB, 下载次数: 1060

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-11-26 20:15:28 | 显示全部楼层
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-26 23:47:22 | 显示全部楼层
谢谢分享,不错
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2013-12-12 02:02:21 | 显示全部楼层
乖乖,感觉就是天书!
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

53

主题

608

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2013-3-29
在线时间
18 小时
发表于 2014-1-14 21:25:40 | 显示全部楼层
回复【楼主位】hexiaolong2008:
---------------------------------
不知道杂用
学电子,学音乐!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-6 20:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表