OpenEdv-开源电子网

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

ucOSii互斥信号量求助

[复制链接]

7

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-8-5
在线时间
0 小时
发表于 2014-8-19 12:00:46 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true] [/mw_shl_code]
[mw_shl_code=c,true]void Task1(*p_arg) { (void)p_arg; while(1) { OSMutexPend(Fun_Mutex, 0, &err); // Task1 do somthing... // OSMutexPost(Fun_Mutex); OSTimeDlyHMSM(0, 0, 0, 200); } } void Task2(*p_arg) { (void)p_arg; while(1) { // OSMutexPend(Fun_Mutex, 0, &err); // Task2 do somthing... OSTimeDlyHMSM(0, 0, 0, 500); OSMutexPost(Fun_Mutex); } }[/mw_shl_code]


请问下在 ucOS-II中使用互斥信号量的时候,在 Task1中请求的信号量必须要在 Task1中发送出去吗?如果 Task1只负责请求信号量而 Task2对该信号量进行释放(代码如上) Task1是否还能正常运行呢?
自己试了下,Task1只能执行一次,Task2的运行不受影响,但是 Task1便不再执行,,请问下这是这么回事?
Task1执行第一次的原因是知道的,就是不明白为什么 Task2在发送互斥信号量以后 Task1还是不能执行,谢谢。

最佳答案

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

首先:楼主的应用信号量是可以实现的,用信号量没有问题,但互斥信号量和信号量的机制还是差别很大的,不能混淆二者 其次:互斥信号量mutex根本都不能这么用,mutex是为了解决资源独占和优先级翻转问题而应用的,请求mutex和释放mutex必须在一个任务中成对出现,在OSMutexPost()函数中会判断释放mutex的任务是不是占用mutex的任务,如果释放mutex的任务没有占用mutex,会返回错误标志。 这一段的源码给你贴出来吧 [m ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-7-1
在线时间
0 小时
发表于 2014-8-19 12:00:47 | 显示全部楼层
首先:楼主的应用信号量是可以实现的,用信号量没有问题,但互斥信号量和信号量的机制还是差别很大的,不能混淆二者
其次:互斥信号量mutex根本都不能这么用,mutex是为了解决资源独占和优先级翻转问题而应用的,请求mutex和释放mutex必须在一个任务中成对出现,在OSMutexPost()函数中会判断释放mutex的任务是不是占用mutex的任务,如果释放mutex的任务没有占用mutex,会返回错误标志。

这一段的源码给你贴出来吧

[mw_shl_code=c,true]INT8U OSMutexPost (OS_EVENT *pevent) { …… /* Get owner's original priority */ if (OSTCBCur != (OS_TCB *)pevent->OSEventPtr) { /* See if posting task owns the MUTEX */ OS_EXIT_CRITICAL(); return (OS_ERR_NOT_MUTEX_OWNER); } …… }[/mw_shl_code]

回复

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
发表于 2014-8-19 14:51:57 | 显示全部楼层
信号量是全局的,所以可以一个任务发,一个任务收

推荐楼主看一下任哲还是邵贝贝的关于μc/OS的书,百度一下,具体名字忘记了

现在已经很久不用ucos了,下面的那个问题不晓得怎么解释,等待高手
努力,前进。
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2014-8-19 15:16:15 | 显示全部楼层
你试着将将这两句的顺序换一下。先发送信号量在延时
OSTimeDlyHMSM(0, 0, 0, 500);
OSMutexPost(Fun_Mutex);
开往春天的手扶拖拉机
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1727
金钱
1727
注册时间
2014-6-27
在线时间
938 小时
发表于 2014-8-19 16:26:57 | 显示全部楼层
你这个程序没什么问题,Task1可以周期性得到互斥信号量执行下去,Task1里面的这个OSTimeDlyHMSM(0, 0, 0, 200);  调用不调用都是一样,你确定就这2个任务?
回复

使用道具 举报

7

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-8-5
在线时间
0 小时
 楼主| 发表于 2014-8-19 17:03:47 | 显示全部楼层
回复【4楼】TinyBoy:
---------------------------------
测试的时候还一个任务,只是用来控制 LED闪烁的,没有其他操作
OSTimeDlyHMSM(0, 0, 0, 200);这个不是问题的所在,我也很奇怪为什么不能执行
回复

使用道具 举报

7

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-8-5
在线时间
0 小时
 楼主| 发表于 2014-8-19 17:04:34 | 显示全部楼层
回复【3楼】zuozhongkai:
---------------------------------
这个我试过了,包括任务优先级的提升也试过,结果还是一样
回复

使用道具 举报

7

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-8-5
在线时间
0 小时
 楼主| 发表于 2014-8-19 17:05:34 | 显示全部楼层
回复【2楼】5498折戟沉沙:
---------------------------------
我现在看的是任哲的,把互斥信号量改成信号量的时候是可以运行的
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1727
金钱
1727
注册时间
2014-6-27
在线时间
938 小时
发表于 2014-8-19 17:11:28 | 显示全部楼层
回复【7楼】灰色世界001:
---------------------------------
 我之前用UCOS的互斥信号量,也有些问题,后来我自己写了几个互斥信号量函数,用一直没问题,它的为什么有问题,我没有去深究,但是你的这个任务安排是可以的,没有问题。你可以先跳过这个问题,弄多了,自然就顺手了。
回复

使用道具 举报

7

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-8-5
在线时间
0 小时
 楼主| 发表于 2014-8-20 09:30:26 | 显示全部楼层
回复【8楼】TinyBoy:
---------------------------------
嗯,好的谢谢
回复

使用道具 举报

7

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-8-5
在线时间
0 小时
 楼主| 发表于 2014-9-11 17:49:00 | 显示全部楼层
回复【10楼】taiwentaotwt:
---------------------------------
谢谢,之前对源码没什么了解,现在算是明白什么原因了
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3761
金钱
3761
注册时间
2015-4-26
在线时间
761 小时
发表于 2016-3-11 15:33:03 | 显示全部楼层
标记,学习,回答非常不错
我有故事,你有酒吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-1 18:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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