关于嵌入式:vxWorks 如何处理两个优先级相同的任务?

关于嵌入式:vxWorks 如何处理两个优先级相同的任务?

How does vxWorks deal with two tasks at the same priority?

我们的 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 接管,等等...

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

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


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

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


推荐阅读