OpenEdv-开源电子网

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

原子哥的动态内存管理,能不能嵌套使用?

[复制链接]

18

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2013-6-27
在线时间
82 小时
发表于 2019-1-8 15:59:19 | 显示全部楼层 |阅读模式
1金钱
原子哥的动态内存管理,能不能嵌套使用?比如我在程序任务A中申请了内存,然后任务切换到任务B,又申请了一块内存,任务B释放内存后任务切换到任务A释放内存。像这样的嵌套会不会出错?

最佳答案

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-1-8 15:59:20 | 显示全部楼层
回复

使用道具 举报

18

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2013-6-27
在线时间
82 小时
 楼主| 发表于 2019-1-9 08:44:30 | 显示全部楼层
正点原子 发表于 2019-1-8 15:59
当然可以嵌套使用

谢谢原子哥。我现在项目使用FreeRTOS的heap_4做内存管理,在任务中很多地方业务上使用内存管理,任务在切换时由嵌套使用内存管理的情况(A任务还没释放内存,B任务又申请)导致内存泄露。现在在想一个办法解决这种嵌套的问题,原子哥有什么好办法
回复

使用道具 举报

0

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
286
金钱
286
注册时间
2018-12-31
在线时间
12 小时
发表于 2019-1-9 09:17:28 | 显示全部楼层
是可以的了!
回复

使用道具 举报

7

主题

199

帖子

0

精华

高级会员

Rank: 4

积分
711
金钱
711
注册时间
2017-5-20
在线时间
96 小时
发表于 2019-1-9 09:51:36 | 显示全部楼层
本帖最后由 林光华ing 于 2019-1-9 09:54 编辑

我试着说说:
假设内存管理中没有关中断或者任务调度,
最危险情况:在低优先级任务A正在申请内存或者释放时,没有完成完整的操作,就被高优先级任务B打断,B任务中也申请一段内存。
对于任务A而言,任务B申请了内存,然后释放。这个过程A什么都不能做,而B拿了内存又放回,内存管理的相关全局变量恢复之前状态,所以A没有受到什么影响。当然,假如内存管理的相关全局变量不能恢复之前状态,就会受到影响。
对于任务B而言,本身是高优先级任务,它本身申请内存,当然不会收到低优先级任务A的破坏。


回复

使用道具 举报

16

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
305
金钱
305
注册时间
2017-1-7
在线时间
107 小时
发表于 2019-1-9 10:09:44 | 显示全部楼层
林光华ing 发表于 2019-1-9 09:51
我试着说说:
假设内存管理中没有关中断或者任务调度,
最危险情况:在低优先级任务A正在申请内存或者释 ...

mymalloc应该是不可重入函数吧?
回复

使用道具 举报

7

主题

199

帖子

0

精华

高级会员

Rank: 4

积分
711
金钱
711
注册时间
2017-5-20
在线时间
96 小时
发表于 2019-1-9 11:27:24 | 显示全部楼层
Marvelous 发表于 2019-1-9 10:09
mymalloc应该是不可重入函数吧?

肯定不是可重入函数。不过只要能在在使用myfree后,恢复那些与内存管理相关全局变量为使用mymalloc之前的样子,就没问题的。不过我也不清楚能不能。myfree与mymalloc对程序的影响是否为互逆不清楚。
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2019-1-9 14:33:58 来自手机 | 显示全部楼层
你这个叫重入,不叫嵌套吧?
回复

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
发表于 2019-1-9 14:59:44 | 显示全部楼层
你这个不叫嵌套,本来申请和释放就是分开的。
回复

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
发表于 2019-1-9 15:01:58 | 显示全部楼层
而且估计你没找到真正原因,
我猜测,是重入问题。
也就是上面朋友提到的,在执行malloc或者free的时候,不能被另外任务malloc或者free打断。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 01:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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