登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

问ucos-II 信号量的理解

作者:疯子海 栏目:嵌入式系统
问ucos-II 信号量的理解
信号量使用主要涉及三个函数: OSSemCreat(), OSSemPend(), OSSemPost();  
第1个负责建立一个信号量,同时需要的参数是设定信号量的值;
第2个是等待该信号量,当信号量值为0时,将调用改函数的任务加入该信号量的等待任务列表中,当信号量值大于0时,该函数紧紧将信号量值减1;
第3个函数负责置位指定的信号量,当指定的信号量是0或者大于0时,该函数将信号量值加1然后返回。此时在该信号量的等待任务列表中优先级最高的任务进入就绪态,任务调度函数进行任务调度。

看了,有些含糊,请问那位能帮忙说清除信号量怎么回事?信号量加减做什么呢?


2楼: >>参与讨论
蓝海深
多复习一下操作系统这本书,你会明白的!
引入信号量的初衷是为了管理设备的临界资源,操作系统书上说的很清楚!

3楼: >>参与讨论
seahai
奇怪了
就是看不明白才问的。。。

4楼: >>参与讨论
yzhu
以下为个人理解,仅供参考
简单地说:
    当信号量=0时,表示信号量代表的资源不可用,操作系统就调用OSSemPend()函数的任务加入该信号量的等待任务列表中;
    当信号量>0时,表示信号量代表的资源可用,OSSemPend()函数返回,任务可以使用资源。
    一般地,信号量的最大值(nmax)表示资源的最大同时共享数。nmax=1,表示资源最多只能由一个任务使用,如读写某内存单元时,为保证该单元不被其它任务篡改,就使用nmax=1的(二值)信号量;nmax>1,表示资源可由多个任务使用,如FIFO,一个任务写某单元时,另一个任务可以写其它单元,则可使用nmax>1的(多值)信号量,信号量的大小用来表示FIFO的可用单元数。
    减1操作:当该信号量=0时表示FIFO已满,任务只能等待;当该信号量>0时表示FIFO有空,可以使用,同时要减1表示调用OSSemPend()函数的任务已经使用了一个资源(FIFO单元),可使用资源少了一个。
    加1操作:当某任务调用OSSemPost()从FIFO中取出一个值时,该FIFO单元就空出一个可写单元,也就是资源多了一个,为表示这个变化,信号量要加1,一旦信号量由0->1,则把资源给等待任务列表中优先级最高的任务(通过OSSemPend()函数的返回)。
    总之,信号量的值代表共享资源的剩余量,用掉一个减1,空出一个加1。

举个例子:

顾客(任务)到银行办事,银行(OS)现有N名业务员(共享资源)。
1. 办事前先要取号(OSSemPend()),号条一般有“前面有xx位顾客”,表示正在等待服务(资源)的顾客(任务)数。
2. 另外假设银行有一指示牌(信号量)指示当前空闲的业务员的数量为n(信号量的值)。
3. 当n>0时,表示有空闲的业务员,那么顾客可以立即去业务员那办理业务(OSSemPend()立即返回),这样空闲的业务员就少一个,指示牌指示的数量(信号量的值)就要减1,但n只能减到N。
4. 当n=0时,表示没有空闲的业务员,那么顾客只能等待(OSSemPend()不返回,切换到其它任务)。
5. 当某位业务员为顾客办完手续后,他就空闲下来,这样空闲的业务员就多一个,指示牌指示的数量(信号量的值)就要加1,但n只能加到N。
   这时银行就会去查找有没有正在等待的顾客,如果有,就找出其中优先级最高的顾客,让他来办理业务(OSSemPend()返回)。
6. 顾客在取号时若设置了等待时间,那么在等待时间过后,银行就会通知顾客时间到(OSSemPend()返回),顾客接着去办其它事。
7. 也有的顾客希望:在取号时,如果有空闲的业务员他就办事,没有的话就走(去办其它事),那么就要用特殊的取号方式(OSSemAccept())。
8. N=1时,表示只有一个业务员,指示牌只能指示0或1两个值,这就是二值信号量。

不知道这个例子能不能说清楚信号量的概念,请大伙完善。


* - 本贴最后修改时间:2006-2-10 10:10:07 修改者:yzhu

5楼: >>参与讨论
ferry
楼上例子不错
再举一个互斥的例子
一间屋子,只能一人进去。门口箱子里放着一把钥匙。当有钥匙时箱子上显示1,无钥匙时显示0。来人看见1就打开箱子取出钥匙进屋,同时显示减一为0,再来人时看见0,就知道有人在屋里,于是在外等待,屋里人出来时,把钥匙放回箱中,显示加1。后面的人看见1又可以进入。
这里钥匙相当于信号量,根据钥匙的有无取0,1两个值。屋子相当于公用资源,同一时间只能由一人使用它。使用信号量保证不会有两人同时使用公用资源

6楼: >>参与讨论
FantasyBo
楼上例子不错


7楼: >>参与讨论
seahai
回答得非常好!
全部理解了,非常感谢yzhu 和ferry !

* - 本贴最后修改时间:2006-2-10 13:12:37 修改者:seahai

8楼: >>参与讨论
疯子海
谢谢大家回复
谢谢yzhu
我明白了。

9楼: >>参与讨论
brm00
To :yzhu
yzhu你好,在你举的例子里有一个地方没看懂:

3. 当n>0时,表示有空闲的业务员,那么顾客可以立即去业务员那办理业务(OSSemPend()立即返回),这样空闲的业务员就少一个,指示牌指示的数量(信号量的值)就要减1,但n只能减到N。


在这句话中,n代表空闲的营业员人数,N代表银行所有的营业员人数。n的最大值应该是(n=N),就是说所有的营业员都在空闲(不知这是行长会怎么想,呵呵),n的最小值应该是(n=0),就是说所有的营业员都在工作中。当(n>0)时,表示有空闲的业务员,当某一个客户去办理业务时(OSSemPend()立即返回),空闲的业务员就少一个,指示牌指示的数量(信号量的值)就要减1,但n应该可以减少到0的呀,可为什么是"但n只能减到N。"


:(


10楼: >>参与讨论
yzhu
写错了,是"只能减到0":)
 
11楼: >>参与讨论
chb2030

不好意思,第一次来这个论坛,感觉yzhu和ferry回答对"信号量的理解"非常棒,终于明白是怎么回事了.

12楼: >>参与讨论
fushaobing
谢谢“yzhu”和“ferry”
我刚开始学习“uC/OS-II”,也是不大明白“信号量”的概念,听你们这么一说就清楚多了。多谢!:)

13楼: >>参与讨论
andyxhw
操作系统书上讲得很清楚
我记得 uCOS-II  的第二章也讲了

14楼: >>参与讨论
syzhou1314
讲的都挺好,受益非浅
讲的都挺好,受益非浅

15楼: >>参与讨论
zkking
我的理解就是接力棒。谁拿到棒子谁跑。
 
16楼: >>参与讨论
seahai
re
好像钥匙

17楼: >>参与讨论
qiantao

好!TKS!TKS!

参与讨论
昵称:
讨论内容:
 
 
相关帖子
MG12864点阵图型液晶模块
那位大虾有LINUX的关于MAKEFILE编写的详细介绍
教学中使用AT89S51 OR AT89S52怎么样?
分体式空调室内部份的软件设计需要的知识??
做软件的怎样向硬件转行??
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号