3

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

4

3 回答 3

5

首先运行的任务是由 VxWorks 调度程序任务实现的最先产生的任务。VxWorks 默认使用基于优先级的调度。因此,在您的情况下,由于 T1 和 T2 具有相同的优先级,因此首先获得 CPU 的任何一个都将无限期地继续运行,直到它被显式阻塞(使用taskSuspendtaskDelay),此时另一个 READY 任务将执行直到它被阻塞, 等等。这应该由信号量或互斥量(互斥量?)

这个确切的问题阐明了基于优先级的调度的主要问题。我们如何确定让这些任务运行多长时间?他们具有相同的优先级这一事实使事情变得复杂。另一个问题是具有高优先级(数字越小表示优先级越高)的 VxWorks 任务可能会抢占您必须在代码中准备的应用程序。这些问题可以通过使用循环调度来解决。轮询调度带来的额外问题和解决方案都在这里描述。

于 2008-09-17T05:19:36.983 回答
2

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

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

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

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

于 2008-09-18T00:04:17.357 回答
1

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

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

于 2009-05-18T20:28:34.133 回答