mnz119 发表于 2010-4-29 13:15:35

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

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();
这些语句是在信号量无效的情况下才执行的,那信号量怎么情况下又能变为有效?而且如果信号量又变为有效那此不是又向上面那样返回一个无错的错误代码然后退出,
任务接下来还等什么信号量啊?真的很难理解,连问问题都不懂得怎么问,问什么了,一片迷茫!希望高手能为本菜鸟解决问题,万分感激

voidx 发表于 2010-4-29 17:17:49

意思是说:如果信号量有效那就返回无错的错误代码,然后退出OSSemPend()这个函数,那接下来任务做什么?
----------------------------

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

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

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

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

mnz119 发表于 2010-4-29 20:41:54

呵呵,有点明白这位神爷的形象比喻,不过一结合到实际应用就觉得很难用理论去说明,我现在做毕业设计用到ARM和UC/OS-II,希望能加你的QQ,也希望各位学UC/OS-II的也加进来,我的QQ:1024852407,谢谢
页: [1]
查看完整版本: OSSemPend() 中 信号量有效无效困惑