vxWorks如何以相同的优先级处理两个任务?

时间:2020-03-05 18:57:54  来源:igfitidea点击:

vxWorks嵌入式系统中有两个任务(T1和T2)具有相同的优先级(110)。
如果两个任务都准备就绪,常规vxWorks调度程序将如何处理?
哪个任务先执行?

解决方案

回答

首先运行的任务是VxWorks调度程序任务首先实现的任务。默认情况下,VxWorks使用基于优先级的计划。因此,在情况下,由于T1和T2具有相同的优先级,因此无论哪个先获得CPU,都将无限期运行,直到它被明确阻止(使用taskSuspend或者taskDelay)为止,此时另一个READY任务将执行直到被阻止。 , 等等。这应该由信号量或者互斥量(互斥量)控制。

这个确切的问题阐明了基于优先级的调度的主要问题。我们如何确定让这些任务运行多长时间?它们具有相同的优先级这一事实使事情变得复杂。另一个问题是,具有较高优先级的VxWorks任务(较低的数字意味着较高的优先级)可以抢占应用程序,而我们必须在代码中为此做好准备。通过使用循环调度可以解决这些问题。轮循调度带来的其他问题及其解决方案均在此处进行了描述。

回答

VxWorks具有256个优先级(0最高,255最低)。在任何给定时间,最高优先级的任务都会在CPU上运行。每个优先级概念上都有一个队列,其中多个任务排队等待执行。

我们有3个具有相同优先级A,B,C的任务。假定A正在执行。
当A阻塞(taskDelay,SemTake,msgQReceive)时,B将开始执行。
当A解除阻止时,它将被放置在队列的末尾。我们现在有B,C,A。
当B封锁时,C接管,依此类推...

如果启用了Round Robin调度(时间分片),则将应用相同的概念,但是当任务的时间片结束时,该任务将被放置在队列的末尾。

请注意,被更高优先级的任务抢占的任务不会影响队列的顺序。如果A正在运行并被抢占,则在完成较高优先级的任务后它将继续执行。它不会放在队列的末尾。

回答

默认情况下,首先生成的一个将执行,除非它放弃了CPU,否则另一个将永远不会运行。

我们可以显式启用轮询,而不是将它们切片。