打印

ucos/2信号量

[复制链接]
3941|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ciniao|  楼主 | 2009-8-18 20:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
fontlose| | 2009-8-18 23:35 | 只看该作者

yong

本帖最后由 fontlose 于 2009-8-18 23:37 编辑

使用共享资源时OSSemPost()和OSSemPend()必须成对使用,获取资源控制权用完之后要释放出来。
如果是用于任务间的通信那就不一定了
OSSemCreat()是申请一个事件控制块,像malloc一样总不能老申请吧!

使用特权

评论回复
板凳
ciniao|  楼主 | 2009-8-19 09:35 | 只看该作者
假如用于任务间通讯的,一但信号量建立后,等待它的优先级最高的任务就能立刻得到吗,如果是这样的话,如果这个任务是等待这个信号量的唯一任务(因为没有post),那么这样做只是为了让那个任务等待信号量的建立?

使用特权

评论回复
地板
barryyan| | 2009-8-19 10:29 | 只看该作者
“如果是用于任务间的通信那就不一定了”,我不知道他的理解是否正确。
个人理解,在任务通讯中,只有先创建信号量OSSemCreat(),随后任务A中有OSSemPost(),任务B中有OSSemPend()。
这时,只有当A发出POST后,B才能接收到并进行下面操作。

使用特权

评论回复
5
fontlose| | 2009-8-19 10:42 | 只看该作者
我是说在任务通讯中 OSSemPost()和OSSemPend()可以不成对使用
比如可以有很多个任务等待一个信号量

使用特权

评论回复
6
fontlose| | 2009-8-19 11:03 | 只看该作者
3# ciniao

信号量都还没建立 怎么可以等待这个信号量?
只要信号量的计数值大于0,任务一Pend就可以立即得到,并将计数值减一。
计数值等于零,任务Pend就挂起(或延时挂起),只要另一个任务有Post(计数值加一)等待该信号量优先级最高的就可以马上得到了(并将计数值减一)。

使用特权

评论回复
7
sufeng983| | 2009-8-19 11:23 | 只看该作者
OSSemCreat(),OSSemPost(),OSSemPend()。
这些不是都和我们生活很接近,就像我们小时候去偷果子,路边要有人望风吧?还需要个人在果园和路边望风的通信吧?于是为了,路边望风的能在远距离通知我们跑。我们就做了面旗帜。
Creat,就等于做了面旗帜,
Post,就等于摇旗帜,表示来人了。
Pend,就等于望风的,看见旗帜摇头,马上告诉我们跑人。
不做旗帜,我们也没东西摇,光做面旗帜我们,没人在路边守着,当然也没人摇,旗帜不会自己跳舞的。
光有人摇旗帜,没人注意旗帜的动静,我们也不知道有人了,马上跑。
信号量和旗帜一样是用来通信的,要想偷东西不被抓,所以3步都需要协调好,
要想任务正常工作,并且能和其他任务(或者中断程序)通信,信号量也要使用好。

使用特权

评论回复
8
ciniao|  楼主 | 2009-8-19 11:35 | 只看该作者
楼上好可爱,学习了 7# sufeng983

使用特权

评论回复
9
barryyan| | 2009-8-20 10:56 | 只看该作者
呵呵,感觉7楼的解说很形象。

使用特权

评论回复
10
headwolf_83| | 2009-8-22 10:28 | 只看该作者
我来正面回答一下你好了。你可以看看ZLG的深入浅出LPC213X的下册,6.6节,信号量的使用,CREATE之后,马上就可以等待PEND。
PEND之后,即你获取了资源,使用完,当然要POST,释放掉。这是常规做法,难道你还真有只执行一次的任务?即使有,也释放掉好了。
目前学习RTOS,暂时只找到深入浅出LPC213X下册有些例子和注释,比较实际,有没有好的实例,大家能指引一下。没人带,自学太累了。

使用特权

评论回复
11
lessonarm| | 2013-6-19 18:39 | 只看该作者
fontlose 发表于 2009-8-19 11:03
3# ciniao  

信号量都还没建立 怎么可以等待这个信号量?

请教一下:

POST函数不是每次调用都会讲Cnt减1,而是当等待信号量任务列表为空时,才将PCnt减1的。
当任务栏列表不为空,POST好像不对Cnt操作吧,而是直接调用OSSched().

使用特权

评论回复
12
lessonarm| | 2013-6-19 20:53 | 只看该作者
sufeng983 发表于 2009-8-19 11:23
OSSemCreat(),OSSemPost(),OSSemPend()。
这些不是都和我们生活很接近,就像我们小时候去偷果子, ...

求指教
如果,在启动多任务后,系统开始执行优先级最高的任务A,此任务A创建一信号量为0,然后,调用pend函数,此时,因为等待事件列表为空,且信号量为0,任务A将在pend函数中将此任务A挂起,且加入等待事件列表,并且调用任务调用函数,开始执行下个优先级最高的任务B,在任务B中调用POST函数,因为等待事件列表不为空,POST不对信号量做加1操作,而直接将等待事件列表中优先级最高的任务A,列入就绪表中,然后调用任务调用函数,开始执行任务A,而这时从任务A的何处开始执行呢?
一、重新执行一遍任务A中Pend函数,这似乎不正确。
二、紧接着任务A执行任务调用函数处执行,
三、跳过Pend函数,执行Pend函数下面的指令??

求详细分析。不胜感激。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

134

帖子

0

粉丝