OpenEdv-开源电子网

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

自己写的STM32 内存管理 实现了malloc,free,remalloc等函数

  [复制链接]

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2013-1-5
在线时间
0 小时
发表于 2014-4-1 01:24:28 | 显示全部楼层
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

7

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2014-3-11
在线时间
0 小时
发表于 2014-4-8 19:46:36 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2014-2-4
在线时间
4 小时
发表于 2014-5-9 10:55:52 | 显示全部楼层
给力!支持原子哥。
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-10-13
在线时间
3 小时
发表于 2014-5-24 11:47:56 | 显示全部楼层
为何内存管理状态表要用u16呢?能不能换成u8?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-5-24 23:12:18 | 显示全部楼层
回复【55楼】420304805:
---------------------------------
不能.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-10-13
在线时间
3 小时
发表于 2014-5-27 10:07:51 | 显示全部楼层
回复【56楼】正点原子:
---------------------------------
为什么不能?实在看不出端倪
我的理解如图
  状态表  | 0     | 1   | 2   | 3     |4      |5      |  .........
 内存池   |0-3    |4-7  |8-11 |12-15  |15-19  |20-23|  .........
这里只是起到一个对应关系,是不是还可以用某一个位来表示某一个块是否可用?
麻烦了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-5-27 23:37:42 | 显示全部楼层
回复【57楼】420304805:
---------------------------------
u8管理不了多少内容啊...
256*32就是你撑死的容量....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-10-13
在线时间
3 小时
发表于 2014-5-28 08:48:12 | 显示全部楼层
回复【58楼】正点原子:
---------------------------------
”u8管理不了多少内容啊... “ 这句话怎么说起? 这里的内存状态表    是不是区分     “可用”   和  “不可用”  两种状态吗?
假设我需要管理的内存池为64K (stm32大容量系列)那么,我需要的管理表大小为:
(内存总量/单块大小)*n , n为管理表的类型字节数 bool 为1/8 (BYTE),U8为1(BYTE),u16为2(BYTE),u32为4(BYTE)

如果用BOOL (某一位表示对应内存区是否可用)就是 64K/32*1/8= 256 byte

如果用U8 就是 64K/32*1=2048=2k byte

如果用U16 就是 64K/32*2=4096=4k byte

如果用U32 就是 64K/32*4=8192=8k byte

可见用的数据类型不同,内存管理表大小也是不同的。为了管理这个表,要固定有4K的内存来管理,有点大
如果用BOOL 实现稍微麻烦,U8在原有基础上改变不大。这样理解是否正确?麻烦原子哥了。
回复 支持 反对

使用道具 举报

5

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2013-9-11
在线时间
40 小时
发表于 2014-5-28 10:38:45 | 显示全部楼层
学习了,第一次考虑这个东西
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-5-29 00:01:51 | 显示全部楼层
内存管理表就是这个:
[mw_shl_code=c,true]//内存管理表 u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //内部SRAM内存池MAP u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE))); //外部SRAM内存池MAP [/mw_shl_code]
假设你改成:
[mw_shl_code=c,true]//内存管理表 u8 mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //内部SRAM内存池MAP u8 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE))); //外部SRAM内存池MAP [/mw_shl_code]

那么假定我要分配1个10K的数组,你这个时候,用u8,就没法分配出来了。
因为u8最大值是255,我10K,每个单元是32字节,需要连续的:320个单元。

显然,你的255就不够用了。



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

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-6-17
在线时间
1 小时
发表于 2014-6-18 11:03:46 | 显示全部楼层
原子你好,请问你这个内存管理相较于标准的malloc的优点在哪里呢?只是多了个内存使用率查看么
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-6-19 00:42:01 | 显示全部楼层
回复【62楼】dongbi00:
---------------------------------
1,方便使用,移植简单。
2,可以管理多个内存地址。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

17

主题

293

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2012-12-26
在线时间
1 小时
发表于 2014-10-3 11:13:50 | 显示全部楼层
原子哥,释放内存后,原来使用过的内存内容怎么没清零啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-10-3 21:51:51 | 显示全部楼层
回复【64楼】kassandra:
---------------------------------
不需要清零。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

17

主题

293

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2012-12-26
在线时间
1 小时
发表于 2014-10-4 10:44:17 | 显示全部楼层
回复【65楼】正点原子:
---------------------------------
不清零的话使用有时会有影响,特别是涉及到字符串库函数的时候,经常遇到申请的新空间里面有内容,然后在连接字符串的时候就出问题了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-10-4 10:53:57 | 显示全部楼层
回复【66楼】kassandra:
---------------------------------
那是你内存管理就出问题了。
你可以看看别的内存管理程序,一般都不会对内存池进行操作的。省时间!!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

114

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2014-7-1
在线时间
28 小时
发表于 2014-10-22 11:03:52 | 显示全部楼层
回复【67楼】正点原子:
---------------------------------
原子哥,STM32的内存管理是管理哪个内存呢?FLASH?RAM? 为什么STM32F103VET6的内存管理只能管理40K的内存呢?
回复 支持 反对

使用道具 举报

15

主题

114

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2014-7-1
在线时间
28 小时
发表于 2014-10-22 11:19:15 | 显示全部楼层
回复【67楼】正点原子:
---------------------------------
STM32F103VET6的SRAM有64K,起始地址是0X20000000, 我刷了你的内存管理程序进去,申请了2K的内存,而那个P的地址是0X20009890  ,这个是怎么得来的呢?  我以为是0X20000000+2046,但事实上不是这样的啊!

p=mymalloc(sramx,2048);//?ê??2K×???
if(p!=NULL)
{
sprintf((char*)p,"Memory SRAMIN Test!!!!!!!");//向P写入一些内容
LCD_ShowString(60,210,200,16,16,p);  //显示P的内容
}
if(tp!=p)
{
tp=p;
sprintf((char*)paddr,"P Addr:0X%08X",(u32)tp);
LCD_ShowString(60,230,200,16,16,paddr); //显示P的地址
}
回复 支持 反对

使用道具 举报

15

主题

114

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2014-7-1
在线时间
28 小时
发表于 2014-10-22 11:31:30 | 显示全部楼层
回复【67楼】正点原子:
---------------------------------
STM32F103ZET6的FLASH 512K,  RAM只有64K ,为什么要管理那个RAM啊? FLASH那么大完全可以用啊?
而且RAM掉电将丢失数据。
菜鸟,完全不懂!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-10-22 23:49:07 | 显示全部楼层
回复【70楼】zengan007:
---------------------------------
等你懂的时候再说吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2014-10-26
在线时间
29 小时
发表于 2014-11-12 21:20:36 | 显示全部楼层
有没有人对比过和MDK自带的malloc的差异~~
回复 支持 反对

使用道具 举报

12

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2014-1-22
在线时间
43 小时
发表于 2014-12-11 09:36:30 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
MARK   刚刚好在学习
任何一件事情,只要心甘情愿,总是能够变得简单。
回复 支持 反对

使用道具 举报

12

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2014-1-22
在线时间
43 小时
发表于 2014-12-11 10:58:56 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
MARK   刚刚好在学习
任何一件事情,只要心甘情愿,总是能够变得简单。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2012-8-20
在线时间
1 小时
发表于 2015-1-9 15:33:06 | 显示全部楼层
谢谢分享,学习了
回复 支持 反对

使用道具 举报

8

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-5-5
在线时间
0 小时
发表于 2015-1-29 12:35:33 | 显示全部楼层
谢谢原子哥的分享  先拿来用了  原子哥能够告知这个和C标准库的那个malloc有什么区别啊
回复 支持 反对

使用道具 举报

3

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2015-1-21
在线时间
8 小时
发表于 2015-3-1 14:13:14 | 显示全部楼层
mark!!!!!!!!!
回复 支持 反对

使用道具 举报

3

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2015-3-1
在线时间
123 小时
发表于 2015-3-1 18:53:21 | 显示全部楼层
这对内存和C功底深厚
- -个性的签名
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2015-1-21
在线时间
12 小时
发表于 2015-4-24 15:23:16 | 显示全部楼层
原子哥,我用了一下,我在主循环里面放了这个函数,程序运行刚开始几秒还好,但过一会就死机了,是怎么回事啊?
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2015-1-21
在线时间
12 小时
发表于 2015-4-24 15:28:54 | 显示全部楼层
回复【79楼】945595199:
---------------------------------
额,自己找到问题了,用完后,还加个myfree()
回复 支持 反对

使用道具 举报

35

主题

227

帖子

3

精华

高级会员

Rank: 4

积分
956
金钱
956
注册时间
2014-3-5
在线时间
35 小时
发表于 2015-4-27 09:23:45 | 显示全部楼层
学习了,第一次考虑这个东西
把看到的有意义的例子进行扩充,并将其切实的运用到自己的设计中。 应用确实不容易,水平是在不断的实践中完善和发展的。
回复 支持 反对

使用道具 举报

11

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-11-12
在线时间
0 小时
发表于 2015-7-18 22:36:46 | 显示全部楼层
markcool
回复 支持 反对

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-8-27 10:02:49 | 显示全部楼层
回复【23楼】正点原子:
---------------------------------
这是内存管理的是全局变量数组,全局变量区和堆区一个区啊?
合肥-文盲
回复 支持 反对

使用道具 举报

头像被屏蔽

65

主题

277

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2013-8-11
在线时间
29 小时
发表于 2015-8-27 12:50:01 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

38

主题

165

帖子

0

精华

高级会员

Rank: 4

积分
646
金钱
646
注册时间
2014-3-5
在线时间
67 小时
发表于 2015-9-8 14:34:39 | 显示全部楼层
回复【25楼】正点原子:
---------------------------------
原子哥,请问你这个只要free就可以吗?会存在碎片吗?我现在使用系统的malloc(经常malloc(105) ),产品运行几天就malloc不到内存了,纠结啊!不知道你这个好不好点!
Hard work!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2015-9-8 22:42:59 | 显示全部楼层
回复【85楼】杂牌电子:
---------------------------------
当然会有碎片,这个不带碎片整理的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

38

主题

165

帖子

0

精华

高级会员

Rank: 4

积分
646
金钱
646
注册时间
2014-3-5
在线时间
67 小时
发表于 2015-9-9 11:44:33 | 显示全部楼层
回复【86楼】正点原子:
---------------------------------
原子哥,我在看你写的内存管理,有一个地方没看懂:

#define MEM_BLOCK_SIZE 32  内存块大小为什么设置成32字节?当我只申请1个字节的内存时也会最低占用32个字节的空间,我的整个RAM只有8K,不知道能不能改小点!如果改变会有什么影响?
Hard work!
回复 支持 反对

使用道具 举报

11

主题

193

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2013-3-19
在线时间
20 小时
发表于 2015-9-9 12:09:17 | 显示全部楼层
mark!!!!!!
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2012-9-14
在线时间
24 小时
发表于 2015-12-20 11:59:21 | 显示全部楼层
原子哥,我发现一个问题:用你的这个malloc函数,当uCOS多任务时,会不会出现这个情况---任务1正在执行 char *p = mymalloc(0, 10);被任务2而打断,任务二中也要调用mymalloc函数,那么不就内存分配混乱,出问题了吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2015-12-20 23:04:26 | 显示全部楼层
回复【89楼】smallmount:
---------------------------------
可能存在,你可以加入互斥访问,进行malloc的时候,禁止任务调度。这样就万无一失了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-12-27
在线时间
7 小时
发表于 2015-12-27 11:06:46 | 显示全部楼层
原子哥,自己写内存管理有什么好处?为什么不直接用标准库?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-3-2
在线时间
0 小时
发表于 2016-3-2 10:46:56 | 显示全部楼层
我现在用的也是这个内存管理代码,会出现内存分配成功,但是返回的地址是一个不正确的地址,里面是有数据的,也是为一个链表做动态内存分配的,还不知问题出在哪里,不知道该怎么解决,我有2M的外部SRAM,全部分配在外部RAM里面,有可能出现的原因是什么呢?内存没有正确释放吗、
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-7-20
在线时间
0 小时
发表于 2016-7-20 22:33:02 | 显示全部楼层
u8 mem_perused(void)
{
     u16 used=0;
     u32 i;
     for(i=0;i<MEM_ALLOC_TABLE_SIZE;i++)
     {
         if(mallco_dev.memmap!=0)used++;//原来是if(mallco_dev.memmap)
     }
     return used*100/MEM_ALLOC_TABLE_SIZE;
}
IAR 会报出Warning[Pe236]: controlling expression is constant
的警告 。。。改了一下就好了 估计是if的原因改为表达式 就好
参考  http://stackoverflow.com/questio ... t-expression-on-ifs  
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-8-6
在线时间
0 小时
发表于 2016-8-6 00:07:44 | 显示全部楼层
请问原子哥 malloc.c 能在 mdk4 环境下使用吗
回复 支持 反对

使用道具 举报

7

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2016-4-10
在线时间
48 小时
发表于 2016-8-6 00:29:28 | 显示全部楼层
挺一下   支持原子哥
回复 支持 反对

使用道具 举报

6

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2016-4-12
在线时间
97 小时
发表于 2016-11-20 21:32:05 | 显示全部楼层
原子哥  为什么你程序里分了外部调用和内部调用 但是用的时候只用外部调用  就管理了内部和外部的SRAM
回复 支持 反对

使用道具 举报

10

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2017-5-3
在线时间
44 小时
发表于 2017-5-27 14:53:05 | 显示全部楼层
膜拜     
回复 支持 反对

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
发表于 2017-5-27 15:28:08 | 显示全部楼层
cool
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2019-6-16
在线时间
2 小时
发表于 2019-6-16 15:58:35 | 显示全部楼层
疑惑:

1.这里后面的表达式是不是应该加个括号,不然后面获得内存利用率会出问题。
2.后面不是应该if(malloc_dev.memmap)吗?

回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2019-6-16
在线时间
2 小时
发表于 2019-6-16 16:01:11 | 显示全部楼层



回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2019-6-16
在线时间
2 小时
发表于 2019-6-16 16:05:37 | 显示全部楼层
图片上传不了:
1.
#define MEM_ALLOC_TABLE_SIZE MAX_MEM_SIZE/MEM_BLOCK_SIZE //内存表大小
2.
u8 mem_perused(void)
{
    u16 used=0;
    u32 i;
    for(i=0;i<MEM_ALLOC_TABLE_SIZE;i++)
    {
        if(mallco_dev.memmap)used++;
    }
    return used*100/MEM_ALLOC_TABLE_SIZE;
}  
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 02:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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