<keygen id="uMOTx"><col id="uMOTx"><cite id="uMOTx"><i id="uMOTx"><address id="uMOTx"><rt id="uMOTx"><hgroup id="uMOTx"></hgroup></rt><span id="uMOTx"></span><ins id="uMOTx"></ins></address><strike id="uMOTx"></strike></i></cite></col></keygen>
  • <embed id="uMOTx"><colgroup id="uMOTx"><sub id="uMOTx"></sub><dfn id="uMOTx"></dfn></colgroup></embed>

      <q id="uMOTx"><var id="uMOTx"><param id="uMOTx"><ul id="uMOTx"></ul><ruby id="uMOTx"><em id="uMOTx"></em></ruby><th id="uMOTx"></th></param></var><fieldset id="uMOTx"></fieldset><table id="uMOTx"></table><noscript id="uMOTx"><p id="uMOTx"><colgroup id="uMOTx"><object id="uMOTx"><tr id="uMOTx"></tr></object></colgroup></p></noscript><map id="uMOTx"></map><code id="uMOTx"></code></q><button id="uMOTx"><sub id="uMOTx"><hgroup id="uMOTx"><p id="uMOTx"></p></hgroup></sub></button>
            <b id="uMOTx"><area id="uMOTx"></area></b>
          <tfoot id="uMOTx"><strong id="uMOTx"><small id="uMOTx"><embed id="uMOTx"><audio id="uMOTx"><video id="uMOTx"></video><i id="uMOTx"><dd id="uMOTx"></dd><legend id="uMOTx"><dt id="uMOTx"><canvas id="uMOTx"></canvas></dt></legend><link id="uMOTx"><output id="uMOTx"></output></link></i></audio></embed></small></strong><sup id="uMOTx"><ul id="uMOTx"><i id="uMOTx"></i><keygen id="uMOTx"><param id="uMOTx"></param><strike id="uMOTx"></strike><acronym id="uMOTx"><option id="uMOTx"></option></acronym></keygen><input id="uMOTx"></input><section id="uMOTx"><col id="uMOTx"><input id="uMOTx"><thead id="uMOTx"><audio id="uMOTx"><i id="uMOTx"></i></audio></thead></input></col></section><select id="uMOTx"></select></ul><ruby id="uMOTx"></ruby></sup></tfoot>
          欢迎来到EDA中国!
          当前位置:网站首页 >技术专栏 > 模拟/数字

          信号量

          发布时间: 2020-02-19 10:41:01     来源: EDA中国

          信号量实际上是一种约定机制,在多任务内核中普遍使用.信号量用于: 控制共享资源的使用权(满足互斥条件)

          信号量实际上是一种约定机制,在多任务内核中普遍使用.信号量用于:

          控制共享资源的使用权(满足互斥条件)

          标志某事件的发生

          使两个任务的行为同步


          信号与信号量在英文中都叫做Semaphore,并不加以区分,而说它有两种类型,二进制型(binary)和计数器型(counting)。本书中的二进制型信号量实际上是只取两个值0和1的信号量。实际上这个信号量只有一位,这种信号量翻译为信号更为贴切。而二进制信号量通常指若干位的组合。而本书中解释为事件标志的置位与清除



          信号像是一把钥匙,任务要运行下去,得先拿到这把钥匙。如果信号已被别的任务占用,该任务只得被挂起,直到信号被当前使用者释放;痪浠八,申请信号的任务是在说:“把钥匙给我,如果谁正在用着,我只好等!”信号是只有两个值的变量,信号量是计数式的。只取两个值的信号是只有两个值0和1的量,因此也称之为信号量。计数式信号量的值可以是0到255或0到65535,或0到4294967295,取决于信号量规约机制使用的是8位、16位还是32位。到底是几位,实际上是取决于用的哪种内核。根据信号量的值,内核跟踪那些等待信号量的任务。

              
          一般地说,对信号量只能实施三种操作:初始化(INITIALIZE),也可称作建立(CREATE);等信号(WAIT)也可称作挂起(PEND);给信号(SIGNAL)或发信号(POST)。信号量初始化时要给信号量赋初值,等待信号量的任务表(Waiting 
          list)应清为空。

              
          想要得到信号量的任务执行等待(WAIT)操作。如果该信号量有效(即信号量值大于0),则信号量值减1,任务得以继续运行。如果信号量的值为0,等待信号量的任务就被列入等待信号量任务表。多数内核允许用户定义等待超时,如果等待时间超过了某一设定值时,该信号量还是无效,则等待信号量的任务进入就绪态准备运行,并返回出错代码(指出发生了等待超时错误)。

              
          任务以发信号操作(SIGNAL)释放信号量。如果没有任务在等待信号量,信号量的值仅仅是简单地加1。如果有任务在等待该信号量,那么就会有一个任务进入就绪态,信号量的值也就不加1。于是钥匙给了等待信号量的诸任务中的一个任务。至于给了那个任务,要看内核是如何调度的。收到信号量的任务可能是以下两者之一。

          l          等待信号量任务中优先级最高的,或者是

          l          最早开始等待信号量的那个任务,即按先进先出的原则(First In First Out ,FIFO)

          有的内核有选择项,允许用户在信号量初始化时选定上述两种方法中的一种。但μC/OS-Ⅱ只支持优先级法。如果进入就绪态的任务比当前运行的任务优先级高(假设,是当前任务释放的信号量激活了比自己优先级高的任务)。则内核做任务切换(假设,使用的是可剥夺型内核),高优先级的任务开始运行。当前任务被挂起。直到又变成就绪态中优先级最高任务。



          同步:

          可以利用信号量使某任务与中断服务同步(或者是与另一个任务同步,这两个任务间没有数据交换)。如图2.13所示。注意,图中用一面旗帜,或称作一个标志表示信号量。这个标志表示某一事件的发生(不再是一把用来保证互斥条件的钥匙)。用来实现同步机制的信号量初始化成0,信号量用于这种类型同步的称作单向同步(unilateral 
          rendezvous)。一个任务做I/O操作,然后等信号回应。当I/O操作完成,中断服务程序(或另外一个任务)发出信号,该任务得到信号后继续往下执行。




          图2.13 用信号量使任务与中断服务同步

          如果内核支持计数式信号量,信号量的值表示尚未得到处理的事件数。请注意,可能会有一个以上的任务在等待同一事件的发生,则这种情况下内核会根据以下原则之一发信号给相应的任务:

           

          l          发信号给等待事件发生的任务中优先级最高的任务,或者




          l          发信号给最先开始等待事件发生的那个任务

          关键字 : 信号量 
          获取帮助