OpenEdv-开源电子网

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

动态内存管理,支持内存碎片自动管理。

[复制链接]

7

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
311
金钱
311
注册时间
2015-8-18
在线时间
63 小时
发表于 2016-1-3 00:32:12 | 显示全部楼层 |阅读模式
本帖最后由 feisheng168 于 2016-1-3 09:42 编辑

放假里晚上就睡得晚,没有睡得兄弟晚上好:
下面我给大家分享一下我掌机的动态内存管理。说起动态内存管理,我研究了有半年多,一年前写出了一个我认为还完美的动态内存管理,现在分享给大家。

动态内存有以下优点:
1,它的操作和我们在电脑上一样操作,函数名一模一样;

2,他可以移植到任何处理器芯片和单片机;
3,支持内存碎片自动管理功能;
4,在任意地方可以了申请和释放,不用考虑释放和申请顺序(因为它有内存碎片自动管理功能);

这款评估板,代码是一年前写的,由于写好没有详细整理过。所以有点乱,希望大家谅解。

有兴趣的兄弟可以移植玩玩。
配置讲解:STM32F4为例
#define MAX_SIZE          110*1024                      //总字节数 = MAX_BLOCK * MIN_SIZE
#define MIN_SIZE          32                                //最小分配空间字节大小   
#define MAX_BLOCK      50                                //记录块大小  块大小必须 < MAX_SIZE/MIN_SIZE,注意不可等于因为内存对齐时预留空间。
#define END_BLOCK      MAX_BLOCK-1                //记录块末端块

#define  MEM_UINT       unsigned int
#define  MEM_UCHAR     unsigned char        
#define  MEM_INT         int

/*****配置只需下面两步填写******/
#define MAX_SIZE          110*1024                        //总字节数 = MAX_BLOCK * MIN_SIZE
#define MAX_BLOCK        50                                //记录块大小  块大小必须 < MAX_SIZE/MIN_SIZE,注意不可等于因为内存对齐时预留空间。

1.MAX_SIZE:这个是动态内存大小;
2.MAX_BLOCK:最多动态内存分的块。
3.调用时必须初始化:mymeminit();内存块初始化函数.  

/*****下面这个就是根据不同单片机修改*******/
#define  MEM_UINT           unsigned int
#define  MEM_UCHAR     unsigned char        
#define  MEM_INT          int

具体管理多个内存的方法大家可以上面的
在malloc.c里面将分区表多定义几个就可以了。

附件: mem.rar (4 KB, 下载次数: 1373)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1681
金钱
1681
注册时间
2014-2-25
在线时间
229 小时
发表于 2016-1-3 08:45:47 | 显示全部楼层
回复 支持 反对

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2016-1-3 09:52:02 | 显示全部楼层
谢谢分享,期待楼主更多精品
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

2

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2016-1-2
在线时间
13 小时
发表于 2016-1-3 17:09:05 | 显示全部楼层
楼猪牛呀,谢谢分享!
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2016-1-3 17:18:19 | 显示全部楼层
mark....
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2016-1-3 17:30:03 | 显示全部楼层
真的可以碎片整理?怎么实现的?比如我在A时刻给变量c申请了内存1K字节,假设地址为ADDR1,而这个地址之前和之后,都有2个小内存(假设是ADDR0和ADDR1),被释放了,如何合并他们?
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-1-3 17:30:08 | 显示全部楼层
强大,赞.....
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3708
金钱
3708
注册时间
2011-5-23
在线时间
2010 小时
发表于 2016-1-3 17:33:46 | 显示全部楼层
本帖最后由 aozima 于 2016-1-3 17:35 编辑

没有MMU的系统上面碎片怎么个整理法?
楼主说的是自动合并空闲内存吧?
RT-Thread RTOS 音频,WIFI,蓝牙
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2016-1-3 17:34:45 | 显示全部楼层
来张图片看看: 无标题.png

还请楼主指点下。

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2016-1-3 17:35:42 | 显示全部楼层
主要是9楼的问题,无法解决。
所以,我一直没有办法实现碎片整理。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2078
金钱
2078
注册时间
2014-12-19
在线时间
710 小时
发表于 2016-1-3 18:27:53 来自手机 | 显示全部楼层
本帖最后由 lvehe 于 2016-1-3 18:32 编辑

碎片整理需要移动已经分配的内存块吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2016-1-3 20:41:13 | 显示全部楼层
lvehe 发表于 2016-1-3 18:27
碎片整理需要移动已经分配的内存块吗

必须的啊,不然怎么叫碎片整理。。。。
就是把很多小的内存片,组合成一个大的内存片,方便给需要调用的地方调用。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2016-1-3 20:41:41 | 显示全部楼层
lvehe 发表于 2016-1-3 18:27
碎片整理需要移动已经分配的内存块吗

所谓的内存碎片,也就是小的内存申请释放次数多了,而产生的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
311
金钱
311
注册时间
2015-8-18
在线时间
63 小时
 楼主| 发表于 2016-1-3 20:47:22 | 显示全部楼层
本帖最后由 feisheng168 于 2016-1-3 23:13 编辑
正点原子 发表于 2016-1-3 17:34
来张图片看看:

还请楼主指点下。

看图片的话,内存块会对ADDR0,ADDR2,做记录,会把这两块认为独立内存,如果ADDR1没有释放,要用内存ADDR0,和ADDR2,在你申请内存时内存管理会先判断你申请内存大小是否等于或小于,左右那两块内存,如果小于等于就会把ADDR0或ADD2分给它,内存表记录就
会往后偏移一个。这时就成了,

4个记录表了,为
ADD0_0   有
ADD0_1   无
ADD1      有
ADD2      无

如果申请内存大于ADD0或ADD2 它会申请ADD3给它ADD0      无
ADD1      有
ADD2      无
ADD3      有

一次类推申请内存,它的记录表继续增加

如果你释放ADD1时下面:
ADD0_0   有
ADD0_1   无
ADD1      有
ADD2      无
内存管理会把ADD0_1+ADD1+ADD2合并
变成
ADD0_0   有
ADD1      无

如果你释放ADD0_0时下面:
ADD0_0   有
ADD0_1   无
ADD1      有
ADD2      无
内存管理会把ADD0_0+ADD0_1合并
变成
以前
ADD0      无
ADD1      有
ADD2      无

如果你再释放ADD1时下面:
ADD0      无
ADD1      有
ADD2      无
内存管理会把ADD0+ADD1+ADD2合并
变成
ADD0      无



这些工序程序会帮你完成的,你如果想要看内存分布状态,只需发

Getmemtablestatus();//获取内存表状态

这个函数,串口会把所有的用到内存块记录表,显示打印
比如这个状态他就会打印
4个记录表了,为
ADD0_0   有  地址多少-多少在用
ADD0_1   无  地址多少-多少没用
ADD1      有  地址多少-多少在用
ADD2      无   地址多少-末端地址没用


呵呵这下大家明白了吧,所谓的内存碎片管理,他就是将你的碎片内存又可以分给比他小的内存,当这些小内存不用时当释放,
他的左,或右,或左右为不用内存是,它会自动合并,合并后把它用一个记录表来记录,等待下次申请内存使用。










回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2016-1-3 22:23:29 | 显示全部楼层
feisheng168 发表于 2016-1-3 20:47
看图片的话,内存块会对ADDR0,ADDR2,做记录,会把这两块认为独立内存,如果ADDR1没有释放,要用内存ADDR ...

你这个并没有解决我的问题哦。
不用推那么多情况,就9楼的情况。你这种应该是无法解决的。
因为ADD1被占用的时候,ADD0和ADD2无法合并,也就是无法做大碎片整理。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2016-1-3 22:24:24 | 显示全部楼层
只是申请一个更大的ADD3来解决,并不是ADD0+ADD2,那么就没有碎片整理,和我以前发的的内存管理,实质是没有本质区别的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
311
金钱
311
注册时间
2015-8-18
在线时间
63 小时
 楼主| 发表于 2016-1-3 22:36:06 | 显示全部楼层
正点原子 发表于 2016-1-3 22:24
只是申请一个更大的ADD3来解决,并不是ADD0+ADD2,那么就没有碎片整理,和我以前发的的内存管理,实质是没 ...

呵呵,原子哥,你的程序我没有看过,有可能我的机制是和你的有点一样,我要的就是上面的结果,小内存再分,小内存释放合并。这些小内存我认为就是小碎片合理利用和管理和重新分配,你所说的AADD0+ADD2的那种合并我在一些书记看过,有点复杂效率也不高,它是用链表方式访问的.....。呵呵不好意思我这个程序不可以实现ADD0+ADD2合并做打内存。
回复 支持 反对

使用道具 举报

7

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
311
金钱
311
注册时间
2015-8-18
在线时间
63 小时
 楼主| 发表于 2016-1-3 22:36:38 | 显示全部楼层
正点原子 发表于 2016-1-3 22:24
只是申请一个更大的ADD3来解决,并不是ADD0+ADD2,那么就没有碎片整理,和我以前发的的内存管理,实质是没 ...

呵呵,原子哥,你的程序我没有看过,有可能我的机制是和你的有点一样,我要的就是上面的结果,小内存再分,小内存释放合并。这些小内存我认为就是小碎片合理利用
回复 支持 反对

使用道具 举报

7

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
311
金钱
311
注册时间
2015-8-18
在线时间
63 小时
 楼主| 发表于 2016-1-3 22:37:23 | 显示全部楼层
正点原子 发表于 2016-1-3 22:24
只是申请一个更大的ADD3来解决,并不是ADD0+ADD2,那么就没有碎片整理,和我以前发的的内存管理,实质是没 ...

呵呵,原子哥,你的程序我没有看过,有可能我的机制是和你的有点一样,我要的就是上面的结果,小内存再分,小内存释放合并。这些小内存我认为就是小碎片合理利用和管理和重新分配,你所说的AADD0+ADD2的那种合并我在一些书记看过,有点复杂效率也不高,它是用链表方式访问的.....。呵呵不好意思我这个程序不可以实现ADD0+ADD2合并做打内存。
回复 支持 反对

使用道具 举报

7

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
311
金钱
311
注册时间
2015-8-18
在线时间
63 小时
 楼主| 发表于 2016-1-3 22:37:40 | 显示全部楼层
本帖最后由 feisheng168 于 2016-1-3 22:43 编辑
正点原子 发表于 2016-1-3 22:24
只是申请一个更大的ADD3来解决,并不是ADD0+ADD2,那么就没有碎片整理,和我以前发的的内存管理,实质是没 ...

呵呵,原子哥,你的程序我没有看过,有可能我的机制是和你的有点一样,我要的就是上面的结果,小内存再分,小内存释放合并。这些小内存我认为就是小碎片合理利用和管理和重新分配,你所说的AADD0+ADD2的那种合并我在一些书记看过,有点复杂效率也不高,它是用链表方式访问的.....。呵呵不好意思我这个程序不可以实现ADD0+ADD2合并做大内存。
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1863
金钱
1863
注册时间
2011-3-29
在线时间
139 小时
发表于 2016-1-3 23:07:33 来自手机 | 显示全部楼层
被楼主的标题唬住了,还以为是碎片整理,原来是碎片管理。简单的说这是一种内存分配的搜索算法,优先分配小块内存。
回复 支持 反对

使用道具 举报

7

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
311
金钱
311
注册时间
2015-8-18
在线时间
63 小时
 楼主| 发表于 2016-1-3 23:10:35 | 显示全部楼层
本帖最后由 feisheng168 于 2016-1-3 23:15 编辑
ofourme 发表于 2016-1-3 23:07
被楼主的标题唬住了,还以为是碎片整理,原来是碎片管理。简单的说这是一种内存分配的搜索算法,优先分配小 ...

呵呵!!!!!!!!!!
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2016-1-4 08:13:09 | 显示全部楼层
顶顶,还没有写这个的能力。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2016-1-4 23:31:32 | 显示全部楼层
feisheng168 发表于 2016-1-3 22:37
呵呵,原子哥,你的程序我没有看过,有可能我的机制是和你的有点一样,我要的就是上面的结果,小内存再分 ...

恩,内存整理不好搞的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 21:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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