让6个任务,6个,4个(任务)等待信号量.当信号量发出信号时,RTOS做出了什么决定
从等待(信号量)列表中选择哪些任务
如果从等待列表中挑选了一个任务,剩下的任务会发生什么,即它们何时运行.
当已经运行更高优先级的任务时.
所有RTOS的解决方案是否相同
如果这是基于优先级的抢占式多任务系统,则RTOS调度程序将运行准备运行的最高优先级任务.当发信号通知信号量时,RTOS调度程序重新评估最高优先级的准备运行任务是什么,如果它与先前运行的任务不同,它将执行到该任务的上下文切换.
当有多个任务等待相同的信号量并且信号量发出信号时,则:
等待信号量的任务的最高优先级任务将准备好运行.
剩下的任务将继续等待信号量.
如果先前运行的任务的优先级高于准备运行的任务,则先前运行的任务将继续运行.即使等待任务已准备好运行,它也不会运行,直到它成为可以运行的最高优先级任务.
以上情况适用于所有基于优先级的抢占式多任务RTOS,它不一定都是RTOS.如果RTOS不支持优先级任务,那么它可能会将信号量授予等待信号量最长的任务.并且它还可能使用循环调度程序,使得每个任务在预定的时隙中运行,而不是允许任务异步地相互抢占.
跟进: 如果您使用信号量作为事件信号,并且有多个任务消耗该事件,那么您将不得不仔细考虑设计.我不相信这可以通过单个二进制信号量来完成.因为如果最高优先级的消费者任务获得信号量,做其业务,然后在再次发信号通知信号量之前再次等待信号量,那么最高优先级的消费者将始终在每次发信号时获得信号量.优先级较低的消费者任务永远不会运行,因为它们永远不会被授予信号量.
一种可能的解决方案是使用计数信号量.当事件发生时,信号量计数应设置为等于消耗任务的数量.然后每个消耗任务获取信号量并将计数减1.在信号量计数减少到零之前,消耗任务不应再等待信号量.这将阻止最高优先级的消费者每次事件多次获取信号量,因此它将允许每个消费者任务仅响应事件运行一次.
您可能希望探索发布 - 订阅设计模式,以查看是否有更好的方法来解决您的情况.