搜索
bottom↓
回复: 2

OSSemPend() 中 信号量有效无效困惑

[复制链接]

出0入0汤圆

发表于 2010-4-29 13:15:35 | 显示全部楼层 |阅读模式
UC/OS-II中,任务调用OSSemPend()等待一个信号量,但是我对这个函数的中的一些代码非常不理解,问题如下:
    if (pevent->OSEventCnt > 0) {                                           (2)
        pevent->OSEventCnt--;                                               (3)
        OS_EXIT_CRITICAL();
        *err = OS_NO_ERR;
意思是说:如果信号量有效那就返回无错的错误代码,然后退出OSSemPend()这个函数,那接下来任务做什么?为什么信号量有效它就退出呢?
还有,如果最长等待时间大于0,那该任务将一直等到信号量有效或者超时,我就不明白了,        OSTCBCur->OSTCBStat    |= OS_STAT_SEM;                              (5)
        OSTCBCur->OSTCBDly      = timeout;                                  (6)
        OSEventTaskWait(pevent);                                            (7)
        OS_EXIT_CRITICAL();
        OSSched();                                                          (8)
        OS_ENTER_CRITICAL();
这些语句是在信号量无效的情况下才执行的,那信号量怎么情况下又能变为有效?而且如果信号量又变为有效那此不是又向上面那样返回一个无错的错误代码然后退出,
任务接下来还等什么信号量啊?真的很难理解,连问问题都不懂得怎么问,问什么了,一片迷茫!希望高手能为本菜鸟解决问题,万分感激

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-4-29 17:17:49 | 显示全部楼层
意思是说:如果信号量有效那就返回无错的错误代码,然后退出OSSemPend()这个函数,那接下来任务做什么?
----------------------------

等信号量好比买包.Zi.。

如果已经有熟的包.Zi.,买一个就走。相当于马上退出OSSemPend()函数。

包.Zi.没有,一直等,等到熟了,再买。相等于一直在OSSemPend()里等待,直到得到信号量。

如果等太久,等得不耐烦了,没买到包.Zi.也要走。相等于在在OSSemPend()里等待超时,返回错误。

出0入0汤圆

 楼主| 发表于 2010-4-29 20:41:54 | 显示全部楼层
呵呵,有点明白这位神爷的形象比喻,不过一结合到实际应用就觉得很难用理论去说明,我现在做毕业设计用到ARM和UC/OS-II,希望能加你的QQ,也希望各位学UC/OS-II的也加进来,我的QQ:1024852407,谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 18:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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