我们的vxWorks嵌入式系统中有两个具有相同优先级(110)的任务(T1和T2) 如果两个任务都准备好运行,常规vxWorks调度程序如何处理? 首先执行哪个任务?
答案 0 :(得分:5)
首先运行的任务是首先由VxWorks调度程序任务实现的任务。默认情况下,VxWorks使用基于优先级的调度。因此,在您的情况下,由于T1和T2具有相同的优先级,因此无论哪一个首先获得CPU将继续无限期地运行,直到它被明确阻止(使用 taskSuspend 或 taskDelay ) ,此时另一个READY任务将被执行,直到被阻止,依此类推。这应该由信号量或互斥量控制(突变?)
基于优先级的调度的主要问题在于这个确切的问题。我们如何确定让这些任务运行多长时间?他们具有相同优先级的事实使事情复杂化。另一个问题是具有高优先级的VxWorks任务(较低的数字意味着较高的优先级)可以抢占您必须在代码中准备的应用程序。使用循环调度可以解决这些问题。循环调度和解决方案带来的其他问题都在here进行了描述。
答案 1 :(得分:2)
VxWorks有256个优先级(0表示最高,255表示最低)。在任何给定时间,最高优先级的任务在CPU上运行。每个优先级在概念上都有一个队列,其中多个任务排队等待执行。
我们有3个相同优先级A,B,C的任务。假设A正在执行
当A块(taskDelay,SemTake,msgQReceive)时,B将开始执行
当A解除阻塞时,它被放在队列的末尾。我们现在有B,C,A.
当B阻塞,C接管等等......
如果启用了循环调度(时间分片),则应用相同的概念,但是当时间片结束时,任务将放在队列的末尾。
请注意,由优先级较高的任务抢占的任务不会影响队列的顺序。如果A正在运行并被抢占,则在优先级较高的任务完成时它将继续执行。它不会放在队列的末尾。
答案 2 :(得分:1)
默认情况下,首先产生的那个将被执行,除非它放弃CPU,否则另一个将永远不会运行。
您可以明确启用循环,而不是时间片。