信号量在RTOS中发布或发出信号时会发生什么?

时间:2016-01-01 14:36:44

标签: rtos

让6个任务,6个,4个(任务)等待信号量。当信号量发出信号时, RTOS

做出了什么决定
  
      
  1. 从等待(信号量)列表中选择哪些任务
  2.   
  3. 如果从等待名单中挑选了一项任务,那剩下的任务将会发生什么,即他们什么时候开始运行。
  4.   
  5. 当已经执行了更高优先级的任务时。
  6.   

所有 RTOS

的解决方案是否相同

1 个答案:

答案 0 :(得分:5)

如果这是一个基于优先级的抢占式多任务系统,那么RTOS调度程序将运行准备运行的最高优先级任务。当发信号通知信号量时,RTOS调度程序会重新评估最高优先级的准备运行任务,如果它与先前运行的任务不同,它将执行到该任务的上下文切换。

当有多个任务等待同一个信号量并且信号量发出信号时:

  1. 等待信号量的任务的最高优先级任务将准备好运行。
  2. 其余任务将继续等待信号量。
  3. 如果先前运行的任务的优先级高于准备运行的任务,则先前运行的任务将继续运行。即使等待任务已准备好运行,它也不会运行,直到它成为可以运行的最高优先级任务。
  4. 以上所有基于优先级的抢占式多任务RTOS都是如此,它不一定都是RTOS。如果RTOS不支持优先级任务,那么它可能会将信号量授予等待信号量最长的任务。它也可能使用循环调度程序,使每个任务在预定的时间段内运行,而不是允许任务以异步方式互相抢占。

    <强>随访: 如果您使用信号量作为事件信号,并且有多个任务消耗该事件,那么您将不得不仔细考虑设计。我不相信这可以用一个二进制信号量来完成。因为如果最高优先级的消费者任务获得信号量,做其业务,然后在再次发信号通知信号量之前再次等待信号量,那么最高优先级的消费者将始终在每次信号通知时获得信号量。优先级较低的消费者任务永远不会运行,因为他们永远不会被授予信号量。

    一种可能的解决方案是使用计数信号量。当事件发生时,信号量计数应设置为等于消耗任务的数量。然后每个消耗任务获取信号量并将计数减1。在信号量计数减少到零之前,消耗任务不应再等待信号量。这将阻止最高优先级的消费者每次事件多次获取信号量,因此它将允许每个消费者任务在响应事件时只运行一次。

    您可能希望探索发布 - 订阅设计模式,以了解是否有更好的方法可以解决您的情况。

相关问题