2008-09-17 420 views

回答

5

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

基于优先级的调度的主要问题是由这个确切的问题来说明的。我们如何确定让这些任务运行多久?事实上,他们具有相同的优先事项使事情复杂化。另一个问题是具有高优先级(较低数字意味着较高优先级)的VxWorks任务可以抢占您的代码中必须准备好的应用程序。这些问题可以通过使用循环调度来解决。由循环调度和解决方案带来的其他问题全部被描述为here

2

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

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

如果启用了轮循调度(时间分片),同样的概念适用,但任务被放到时间片结束时队列结束。

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

1

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

你可以明确地启用循环,比他们将timeslice。