OpenEdv-开源电子网

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

关于内存管理的问题

[复制链接]

12

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2014-8-6
在线时间
8 小时
发表于 2015-4-17 11:56:21 | 显示全部楼层 |阅读模式
5金钱
要在两个任务(或中断)中使用mymalloc()申请内存,在另外两个任务中使用myfree()释放内存。内存分配是共享资源,请问一下,我需要互斥保护吗?怎样写例程?谢谢!
上午看原子哥的内存管理,没在关键代码段加入原子操作。这样如果两个任务抢占了内存管理资源,是要出bug的。
以为申请与释放内存是很简单的事,看来也要注意一下。

最佳答案

查看完整内容[请看2#楼]

这跟内存管理malloc.c中的函数没有关系,是你使用系统的时候要做的事情!你可以将函数mymalloc()和myfree()当作是共享资源,在UCOS中对于共享资源的保护可以采用信号量!还有就是,在调用mymalloc()和myfree()的时候只要你能保证不会发生任务切换,那么就不会出现两个任务抢的问题。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-4-17 11:56:22 | 显示全部楼层
这跟内存管理malloc.c中的函数没有关系,是你使用系统的时候要做的事情!你可以将函数mymalloc()和myfree()当作是共享资源,在UCOS中对于共享资源的保护可以采用信号量!还有就是,在调用mymalloc()和myfree()的时候只要你能保证不会发生任务切换,那么就不会出现两个任务抢的问题。
开往春天的手扶拖拉机
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2015-4-17 12:39:58 | 显示全部楼层
看你在几个地方使用了
学无止境
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-4-17 12:46:02 | 显示全部楼层
最好互斥一下,免得出bug难找
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

12

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2014-8-6
在线时间
8 小时
 楼主| 发表于 2015-4-17 13:06:18 | 显示全部楼层
回复【3楼】八度空间:
---------------------------------看原子哥的内存管理,没在关键代码段加入原子操作。这样如果两个任务抢占了内存管理资源,是要出bug的。
回复

使用道具 举报

12

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2014-8-6
在线时间
8 小时
 楼主| 发表于 2015-4-17 16:31:26 | 显示全部楼层
回复【5楼】zuozhongkai:
------------------------------谢谢指教!UCOS原作者写的内存管理,是有互斥保护的。不过UCOS原作者写的内存管理,是分配一个固定内存块,不如原子哥的方便。
UCOS原作者写的:
//获得一个内存块
void  *OSMemGet (OS_MEM  *pmem,
                 INT8U   *perr)
{
    。
   OS_ENTER_CRITICAL();
    if (pmem->OSMemNFree > 0u) {                     
        pblk                = pmem->OSMemFreeList;   
        pmem->OSMemFreeList = *(void **)pblk;        
        pmem->OSMemNFree--;                          
        OS_EXIT_CRITICAL();
        *perr = OS_ERR_NONE;                      
        return (pblk);                             
    }
    OS_EXIT_CRITICAL();
    。。。
}

回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-4-17 20:19:52 | 显示全部楼层
回复【6楼】jnfxt95:
---------------------------------
UCOS作者是针对他的系统写的内存管理,用了他的系统中的临界段代码保护,我们写的是我们自己的内存管理,不管上不上系统都可以用,你在使用的时候对mymalloc()和myfree()加上保护不就行了。
开往春天的手扶拖拉机
回复

使用道具 举报

12

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2014-8-6
在线时间
8 小时
 楼主| 发表于 2015-4-20 16:55:35 | 显示全部楼层
回复【7楼】zuozhongkai:
---------------------------------
谢谢老师指教。今天加了互斥信号量试了试,顺便熟悉了一下互斥信号量的用法。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 15:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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