假设有6个任务,其中6个(任务)中的4个正在等待信号量。发出信号量时,RTOS会做出什么决定
- 从等待(信号量)列表中选择哪些任务
- 如果从等待列表中选择一项任务,剩下的任务将会发生什么,即它们何时运行。
- 当已经有更高优先级的任务正在运行时。
所有RTOS的解决方案都一样吗
如果这是基于优先级的抢占式多任务处理系统,则RTOS调度程序将运行可运行的最高优先级任务。当信号量发出信号时,RTOS调度程序会重新评估最高优先级的准备运行任务,如果与先前运行的任务不同,它将执行到该任务的上下文切换。
当有多个任务等待相同的信号量并且该信号量被信号通知时,则:
对于所有基于优先级的抢占式多任务RTOS,以上情况均适用,但不一定是所有RTOS。如果RTOS不支持优先任务,则它可能会将信号授予最长等待信号的任务。而且它也可能使用循环调度程序,以便每个任务都在预定的时隙中运行,而不是允许任务彼此异步抢占。
后续:如果您将信号灯用作事件信号,并且有多个任务使用该事件,那么您将必须仔细考虑设计。我不相信使用单个二进制信号量就可以做到这一点。因为如果最高优先级的使用者任务获得了信号量,然后进行了业务,然后在再次发出信号量之前再次等待该信号量,那么最高优先级的使用者将始终在每次发出信号时都得到该信号量。优先级较低的使用者任务将永远不会运行,因为它们永远不会被授予信号量。
一种可能的解决方案是使用计数信号量。事件发生时,信号量计数应设置为等于消耗任务的数量。然后,每个使用任务都会获得信号量,并将计数减一。消费任务不应再等待信号量,直到信号量计数减少到零为止。这将防止最高优先级的使用者在每个事件中多次获得信号灯,因此,它将允许每个使用者任务在响应事件时仅运行一次。
您可能想探索发布-订阅设计模式,以查看是否有更好的方法来解决您的情况的此要求。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句