VxWorks调度程序如何执行?

问题描述:

想知道调度程序如何被调用,以便它可以切换任务。因为即使它的抢占式调度或循环调度 - 调度程序应该进入图片来执行任何类型的任务切换。假设低优先级任务具有无限循环 - 调度程序何时干预并切换到更高优先级的任务?VxWorks调度程序如何执行?

查询结果: 1.谁调用调度程序? [在VxWorks中] 2.如果定期调用它 - 该机制如何实现?

在此先感谢。

--Ashwin

+0

虽然我不知道VxWorks,但在其他OS中,调度程序通常由定时器中断调用,因此即使某个任务当前处于繁忙状态,它也可以切换任务。 – Rudi 2010-06-08 06:44:59

简单的答案是,vxWorks通过系统定时器中的硬件中断来控制系统定时器,该定时器在系统运行时以固定时间间隔持续发生。

这里的更多详细信息:

当VxWorks的开始,它配置您的硬件来产生定时器interruptñ毫秒,其中ñ往往是10,但完全取决于你的硬件。定时器间隔一般由vxWorks在您的Board Support Package (BSP)启动时设置。

每当定时器触发中断时,系统就开始执行定时器interrupt handler。定时器中断处理程序是vxWorks的一部分,所以现在vxWorks已经有了控制权。它所做的第一件事是将CPU状态(如寄存器)保存到当前正在运行的任务的Task Control Block (TCB)中。

然后最终vxWorks运行调度程序来确定接下来运行的是谁。为了运行任务,vxWorks将任务的状态从其TCB复制到机器寄存器中,并在任务完成后控制CPU。

奖金信息:

VxWorks提供hooks到任务切换逻辑,所以你可以有,只要您的任务被抢占的函数被调用。

+0

感谢您的详细解答... – Ashwin 2010-06-09 06:24:19

+0

请注意,只有在您启用循环调度(通过调用kernelTimeSlice())时,才会出现这种情况,默认情况下是基于优先级的抢占式调度。 – nos 2011-11-30 22:02:51

+0

@nos:不管调度策略如何,定时器中断总是运行以跟踪滴答计数,看门狗定时器和信号量超时。恰巧发生的是,对于基于优先级的抢占式调度,vxWorks调度器不会选择要运行的新任务,除非某些定时器操作将更高优先级的任务移至就绪队列。但公平点。我一直想更新这个答案,以便更加精确,并且包含系统调用,这在当时我完全忘记了。 – indiv 2011-12-01 00:32:48

除非你有一个majorily定制目标构建,调度由定时器中断调用。尽管详细信息是特定于平台的。

如果当前任务完成或阻塞,调度程序也会被调用。

个人提供了一个非常好的答案,但它只是部分准确。
系统的实际工作稍微复杂一些。

调度程序可以作为同步或异步操作的结果执行。

同步是指由于当前正在执行的任务中的代码而导致的操作。一个最好的例子是采取信号量(semTake)。
如果信号量不可用,则当前正在执行的任务将挂起并且不再可用于执行。此时,调度程序将被调用并确定下一个应该执行的任务并执行上下文切换。

异步操作本质上是指中断。定时器中断很好地被个人描述。然而,一些不同的元素可能会导致中断执行:网络流量,传感器,串行数据等...

还应该记住,定时器中断不一定会导致上下文切换!是的,中断将发生,延迟任务和时间片计数器将递减。但是,如果时间片没有过期,或者没有更高优先级任务从挂起状态转换到就绪状态,那么调度器将不会实际被调用,并且您将返回到原始任务,在确切点执行被中断。

请注意,调度程序没有自己的上下文;这不是一项任务。它只是代码在执行的任何上下文中执行。无论是从中断上下文(异步)还是从调用任务上下文(同步)。