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

Embedded vxWorks如何处理优先级相同的两个任务?,embedded,vxworks,rtos,Embedded,Vxworks,Rtos,在我们的vxWorks嵌入式系统中,有两个任务(T1和T2)具有相同的优先级(110)。 如果两个任务都准备好运行,常规vxWorks调度程序如何处理此问题? 哪个任务首先执行?首先运行的任务是由VxWorks调度程序任务首先生成的任务。默认情况下,VxWorks使用基于优先级的调度。因此,在您的情况下,由于T1和T2具有相同的优先级,因此,无论哪一个首先获得CPU,都将继续无限期运行,直到它被显式阻止(使用taskSuspend或taskDelay),此时另一个就绪任务将执行,直到它被阻止,依

在我们的vxWorks嵌入式系统中,有两个任务(T1和T2)具有相同的优先级(110)。
如果两个任务都准备好运行,常规vxWorks调度程序如何处理此问题?

哪个任务首先执行?

首先运行的任务是由VxWorks调度程序任务首先生成的任务。默认情况下,VxWorks使用基于优先级的调度。因此,在您的情况下,由于T1和T2具有相同的优先级,因此,无论哪一个首先获得CPU,都将继续无限期运行,直到它被显式阻止(使用taskSuspend或taskDelay),此时另一个就绪任务将执行,直到它被阻止,依此类推。这应该由信号量或互斥量(mutices?)控制


基于优先级的调度的主要问题就是这个问题。我们如何确定让这些任务运行多长时间?他们有相同的优先权,这一事实使事情复杂化。另一个问题是,具有高优先级的VxWorks任务(数字越小意味着优先级越高)可能会抢占您必须在代码中准备的应用程序。这些问题可以通过使用循环调度来解决。循环调度带来的其他问题和解决方案都已说明。

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

我们有3个优先级相同的任务A、B、C。假设A正在执行。
当A阻塞(taskDelay、SemTake、msgQReceive)时,B将开始执行。
当一个队列取消阻塞时,它被放在队列的末尾。我们现在有B、C、A.
当B阻塞时,C接管,等等

如果启用了循环调度(时间切片),同样的概念也适用,但是当任务的时间切片结束时,任务会被放在队列的末尾


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

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

您可以显式启用循环,而不是时间片