硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5453|回复: 1
收起左侧

[QQ群问题解答] OSSemPend() 中 信号量有效无效困惑

[复制链接]

92

主题

76

回帖

92

积分

初级会员

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2014-4-8 14:04:58 | 显示全部楼层
1. 这个Pend函数的作用就是这样,如果有可用资源,就将资源总数减一,然后继续执行,如果没有资源了,根据用户的需要设置延迟时间或者永久延迟等待。
2. 没有信号量可用的时候,会执行(8)进行任务调度,执行其它的任务。等收到POST信号后,会再次的将这个任务加入到就绪链表。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 07:10 , Processed in 0.148326 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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