想知道如何调用调度程序以便它可以切换任务。就像它的抢占式调度或循环调度一样——调度程序应该参与进来以进行任何类型的任务切换。假设一个低优先级的任务有一个无限循环——调度器什么时候干预并切换到一个更高优先级的任务?
查询是: 1.谁调用调度器?[在 VxWorks 中] 2. 如果它被定期调用 - 该机制是如何实现的?
提前致谢。
——阿什温
想知道如何调用调度程序以便它可以切换任务。就像它的抢占式调度或循环调度一样——调度程序应该参与进来以进行任何类型的任务切换。假设一个低优先级的任务有一个无限循环——调度器什么时候干预并切换到一个更高优先级的任务?
查询是: 1.谁调用调度器?[在 VxWorks 中] 2. 如果它被定期调用 - 该机制是如何实现的?
提前致谢。
——阿什温
简单的答案是,vxWorks 通过系统计时器的硬件中断来控制,该中断在系统运行时以固定的时间间隔连续发生。
这里有更多细节:
当 vxWorks 启动时,它会将您的硬件配置为每n毫秒生成一个计时器中断,其中n通常为 10,但完全取决于您的硬件。计时器间隔通常由 vxWorks 在启动时在您的板级支持包 (BSP)中设置。
每次定时器触发中断时,系统都会开始执行定时器中断处理程序。定时器中断处理程序是 vxWorks 的一部分,所以现在 vxWorks 拥有控制权。它所做的第一件事就是将 CPU 状态(例如寄存器)保存到当前运行任务的任务控制块 (TCB)中。
然后最终 vxWorks 运行调度程序来确定下一个运行的人。为了运行一个任务,vxWorks 将任务的状态从它的 TCB 复制到机器寄存器中,然后任务就控制了 CPU。
奖金信息:
vxWorks 提供了任务切换逻辑的挂钩,因此您可以在任务被抢占时调用函数。
indiv 提供了一个很好的答案,但它只是部分准确。
系统的实际工作稍微复杂一些。
调度程序可以作为同步或异步操作的结果来执行。
同步是指由于当前执行任务中的代码而导致的操作。一个典型的例子是采用信号量(semTake)。
如果信号量不可用,则当前正在执行的任务将挂起,不再可用于执行。此时,调度程序将被调用并确定下一个应该执行的任务并将执行上下文切换。
异步操作本质上是指中断。indiv 很好地描述了定时器中断。但是,许多不同的元素可能会导致执行中断:网络流量、传感器、串行数据等......
还要记住,定时器中断不一定会导致上下文切换!是的,中断将发生,延迟任务和时间片计数器将递减。但是,如果时间片没有过期,或者没有更高优先级的任务从挂起状态转换到就绪状态,那么调度程序实际上不会被调用,并且您将返回到原始任务,在执行的确切时间点打断了。
Note that the scheduler does not have its own context; it is not a task. It is simply code that executes in whatever context it is invoked from. Either from the interrupt context (asynchronous) or from the invoking task context (synchronous).
除非您有一个主要定制的目标构建,否则调度程序由 Timer 中断调用。不过,细节是特定于平台的。
如果当前任务完成或阻塞,调度程序也会被调用。