VxWorks调度程序如何执行?

时间:2010-06-08 06:29:19

标签: vxworks scheduler preemption

想知道如何调用调度程序以便它可以切换任务。就像在其抢占式调度或循环调度一样 - 调度程序应该进入图像来进行任何类型的任务切换。假设低优先级任务具有无限循环 - 调度程序何时进行干预并切换到更高优先级的任务?

查询是: 谁打电话给调度员? [在VxWorks中] 2.如果定期调用它 - 该机制是如何实现的?

提前致谢。

- 阿斯温

4 个答案:

答案 0 :(得分:13)

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

以下是更多细节:

当vxWorks启动时,它会将您的硬件配置为每 n 毫秒生成一个计时器interrupt,其中 n 通常为10但完全取决于您的硬件。计时器间隔通常由vxWorks在Board Support Package (BSP)启动时设置。

每次定时器触发中断时,系统都会开始执行定时器interrupt handler。定时器中断处理程序是vxWorks的一部分,所以现在vxWorks具有控制权。它首先要做的是将CPU状态(例如寄存器)保存到当前正在运行的任务的Task Control Block (TCB)中。

然后最终vxWorks运行调度程序以确定接下来运行的是谁。要运行任务,vxWorks会将任务的状态从其TCB复制到机器寄存器中,然后执行该操作,任务就可以控制CPU。

奖金信息:

vxWorks将hooks提供给任务切换逻辑,这样您就可以在任务被抢占时调用函数。

答案 1 :(得分:5)

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

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

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

异步操作实质上是指中断。个人非常好地描述了定时器中断。但是,许多不同的元素可能导致执行中断:网络流量,传感器,串行数据等......

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

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

答案 2 :(得分:0)

除非您有一个主要定制的目标构建,否则调度程序由Timer中断调用。但是,细节是特定于平台的。

答案 3 :(得分:0)

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