我想知道调度器是如何被调用的,以便它可以切换任务。即使是抢占式调度或循环调度,调度器也应该参与到画面中来进行任何类型的任务切换。假设一个低优先级的任务有一个无限循环--什么时候调度器会介入并切换到高优先级的任务?
查询是: 1.谁调用调度器?在VxWorks 2中。如果它以固定的时间间隔被调用-该机制是如何实现的?
提前谢谢。
--阿什温
发布于 2010-06-09 02:13:39
简单的答案是,vxWorks通过系统定时器的硬件中断进行控制,该定时器在系统运行时以固定的时间间隔连续发生。
下面是更多细节:
当vxWorks启动时,它将您的硬件配置为每n毫秒生成一个计时器interrupt,其中n通常为10,但完全取决于您的硬件。计时器时间间隔通常由Board Support Package (BSP)中的vxWorks在启动时设置。
每次定时器触发中断时,系统都会开始执行定时器interrupt handler。定时器中断处理程序是vxWorks的一部分,因此现在vxWorks拥有控制权。它做的第一件事是将CPU状态(比如寄存器)保存到当前运行任务的Task Control Block (TCB)中。
然后,最终vxWorks运行调度程序来确定下一个运行的是谁。为了运行任务,vxWorks将任务的状态从它的TCB复制到机器寄存器中,之后该任务就控制了CPU。
奖金信息:
vxWorks在任务切换逻辑中提供了hooks,因此只要任务被抢占,就可以调用一个函数。
发布于 2011-02-15 08:32:26
indiv提供了一个非常好的答案,但它只是部分准确的。
系统的实际工作稍微复杂一些。
调度器可以作为同步或异步操作的结果来执行。
同步是指由于当前正在执行的任务中的代码而导致的操作。最好的例子就是获取一个信号量(semTake)。
如果信号量不可用,则当前正在执行的任务将挂起,并且不再可用于执行。此时,调度器将被调用,并确定应该执行的下一个任务,并执行上下文切换。
异步操作本质上是指中断。indiv很好地描述了定时器中断。但是,许多不同的元素可能会导致中断执行:网络流量、传感器、串行数据等。
记住,定时器中断不一定会导致上下文切换!是,中断将发生,延迟任务和时间片计数器将递减。但是,如果时间片未过期,或者没有更高优先级的任务从挂起状态转换到就绪状态,则不会实际调用调度程序,您将返回到执行中断的确切时间点上的原始任务。
请注意,调度程序没有自己的上下文;它不是一个任务。它只是在调用它的任何上下文中执行的代码。从中断上下文(异步)或从调用任务上下文(同步)。
发布于 2010-06-08 19:52:12
除非您有一个主要定制的目标构建,否则调度器将由计时器中断调用。不过,细节是特定于平台的。
https://stackoverflow.com/questions/2995210
复制相似问题