OpenEdv-开源电子网

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

对于原子的“内存管理”的思考

[复制链接]

131

主题

150

帖子

0

精华

高级会员

Rank: 4

积分
558
金钱
558
注册时间
2016-12-24
在线时间
68 小时
发表于 2018-4-8 20:29:57 | 显示全部楼层 |阅读模式
1金钱
原子的开发板中,有一章节是“内存管理”,主要是对MCU内存和扩展内存进行管理,其中在对MCU自带SRAM管理时,系统首先申请一个大数组:

    __align(4) u8 mem1base[MEM1_MAX_SIZE];

   当需要申请内存时,采用函数:memp_memory=mymalloc(SRAMIN,mempsize);        申请内存
   当释放内存时,采用函数:myfree(SRAMIN,memp_memory);


   也就是说在使用MCU自带SRAM内存时,需要mymalloc和myfree函数成对使用,但是如果使用数组直接申请就可以了:__align(4) u8 memp_memory[mempsize];使用完毕系统自动释放。


   疑问:在使用MCU自带SRAM内存时,没有必要使用原子的“内存管理”啊?或者说在使用MCU自带SRAM内存时,使用“内存管理”有什么优点呢?

         我觉得采用原子的“内存管理”,缺点是占用内存啊?


         但是在使用扩展SRAM时,我认为还是有优点的!

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-4-9 01:58:50 | 显示全部楼层
你直接定义数组,使用完毕,系统自动释放,这句话,最后这句话,你结论如何来的? 难不成你定义的都是局部变量? 如果都是局部变量,你知道局部变量多了会死机么?
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-4-9 12:17:20 来自手机 | 显示全部楼层
比如你有1k内存,你要分别读写两个存储设备,每一个都是512
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-4-9 12:19:16 来自手机 | 显示全部楼层
的块,不用内存管理,就要申请两个512大小数组,这样程序内存就全占用了。动态申请,用完free再申请给另一个用,就可以解决了
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-4-9 12:23:27 来自手机 | 显示全部楼层
再浅显的说,两个人出门买东西,买两辆车各自只能骑各自的,或者动态共享一辆,
回复

使用道具 举报

131

主题

150

帖子

0

精华

高级会员

Rank: 4

积分
558
金钱
558
注册时间
2016-12-24
在线时间
68 小时
 楼主| 发表于 2018-4-12 19:16:32 | 显示全部楼层
多谢原子和孟亮的回复和解答!
回复

使用道具 举报

131

主题

150

帖子

0

精华

高级会员

Rank: 4

积分
558
金钱
558
注册时间
2016-12-24
在线时间
68 小时
 楼主| 发表于 2018-4-12 19:19:23 | 显示全部楼层
我还有一个疑问:比如LWIP中“内存池”和“内存堆”都是分配的全局变量数组,也就是说只要系统运行,都不会释放.

---在这种情况下,还需要使用原子的内存管理分配内存吗?只需要采用lwip中系统为“内存池”和“内存堆”分配的全局变量数组即可,我这样理解对吗?
回复

使用道具 举报

131

主题

150

帖子

0

精华

高级会员

Rank: 4

积分
558
金钱
558
注册时间
2016-12-24
在线时间
68 小时
 楼主| 发表于 2018-4-12 19:20:07 | 显示全部楼层
或者说,在以上的情况下,采用原子的内存管理分配,有什么优点呢?
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
发表于 2018-4-12 23:44:02 | 显示全部楼层
xql923 发表于 2018-4-12 19:20
或者说,在以上的情况下,采用原子的内存管理分配,有什么优点呢?

即然想不通, 那便不要用, 想通了再来用;
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-3-5
在线时间
8 小时
发表于 2018-4-12 23:58:36 | 显示全部楼层
本帖最后由 jey0807 于 2018-4-13 00:01 编辑

在子函数里面使用大数组也即局部变量,那是在存放在堆栈里面的,而内存管理是使用的全局变量。
回复

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
发表于 2018-10-15 19:39:40 | 显示全部楼层
正点原子 发表于 2018-4-9 01:58
你直接定义数组,使用完毕,系统自动释放,这句话,最后这句话,你结论如何来的? 难不成你定义的都是局部 ...

一直不理解内存管理的作用,如果不用内存管理又会有什么问题。
看了这句,好像有点理解。
回复

使用道具 举报

14

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2443
金钱
2443
注册时间
2017-9-13
在线时间
559 小时
发表于 2018-10-16 09:03:26 | 显示全部楼层
C库提供的 malloc 和 free 占用 cycles 数很大的,自己做内存管理是很有必要的,如果你觉得占用内存大,可以根据自己的需要量身定制内存池大小
回复

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2017-12-22
在线时间
39 小时
发表于 2020-7-16 22:55:44 | 显示全部楼层
测试下就好:
uint8_t W25QXX_BUFFER[1024 * 4] = NULL;
  uint8_t* W25QXX_BUFFER_1;
  W25QXX_BUFFER_1 = mymalloc( SRAMIN, 1024 * 4 );
  for( int i = 0; i < 1024 * 4; ++i )
  {
    W25QXX_BUFFER_1[i] = i;
  }
  myfree( SRAMIN, W25QXX_BUFFER_1 );

用数组
  48'471 bytes of readonly  code memory
   2'260 bytes of readonly  data memory
  58'389 bytes of readwrite data memory (+ 1'044'480 absolute)
用内存分配
  48'483 bytes of readonly  code memory
   2'192 bytes of readonly  data memory
  53'269 bytes of readwrite data memory (+ 1'044'480 absolute)
原子的已经分配好了内存块,直接用就好,再额外定义个数组没释放,占内存。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-30 23:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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