想知道如何调用调度程序以便它可以切换任务 . 就像在其抢占式调度或循环调度一样 - 调度程序应该进入图像来进行任何类型的任务切换 . 假设低优先级任务具有无限循环 - 调度程序何时进行干预并切换到更高优先级的任务?
查询是:1 . 谁调用调度程序? [在VxWorks中] 2.如果定期调用它 - 该机制是如何实现的?
提前致谢 .
--Ashwin
简单的答案是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提供给任务切换逻辑,这样您就可以在任务被抢占时调用函数 .
indiv提供了一个非常好的答案,但它只是部分准确 .系统的实际工作稍微复杂一些 .
调度程序可以作为同步或异步操作的结果执行 .
同步是指由于当前正在执行的任务中的代码而导致的操作 . 一个典型的例子是采用信号量(semTake) .如果信号量不可用,则当前正在执行的任务将挂起并且不再可用于执行 . 此时,将调用调度程序并确定应执行的下一个任务并执行上下文切换 .
异步操作实质上是指中断 . 个人非常好地描述了定时器中断 . 但是,许多不同的元素可能导致执行中断:网络流量,传感器,串行数据等......
记住定时器中断不一定会引起上下文切换也是一件好事!是的,中断将发生,延迟任务和时间片计数器将递减 . 但是,如果时间片未过期,或者没有 higher 优先级任务从挂起状态转换到就绪状态,则实际上不会调用调度程序,并且您将返回到原始任务,在执行的确切位置中断 .
请注意,调度程序没有自己的上下文;这不是一项任务 . 它只是在调用它的任何上下文中执行的代码 . 来自中断上下文(异步)或来自调用任务上下文(同步) .
除非您有一个主要定制的目标构建,否则调度程序由Timer中断调用 . 但是,细节是特定于平台的 .
如果当前任务完成或阻塞,也会调用调度程序 .
4 回答
简单的答案是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提供给任务切换逻辑,这样您就可以在任务被抢占时调用函数 .
indiv提供了一个非常好的答案,但它只是部分准确 .
系统的实际工作稍微复杂一些 .
调度程序可以作为同步或异步操作的结果执行 .
同步是指由于当前正在执行的任务中的代码而导致的操作 . 一个典型的例子是采用信号量(semTake) .
如果信号量不可用,则当前正在执行的任务将挂起并且不再可用于执行 . 此时,将调用调度程序并确定应执行的下一个任务并执行上下文切换 .
异步操作实质上是指中断 . 个人非常好地描述了定时器中断 . 但是,许多不同的元素可能导致执行中断:网络流量,传感器,串行数据等......
记住定时器中断不一定会引起上下文切换也是一件好事!是的,中断将发生,延迟任务和时间片计数器将递减 . 但是,如果时间片未过期,或者没有 higher 优先级任务从挂起状态转换到就绪状态,则实际上不会调用调度程序,并且您将返回到原始任务,在执行的确切位置中断 .
请注意,调度程序没有自己的上下文;这不是一项任务 . 它只是在调用它的任何上下文中执行的代码 . 来自中断上下文(异步)或来自调用任务上下文(同步) .
除非您有一个主要定制的目标构建,否则调度程序由Timer中断调用 . 但是,细节是特定于平台的 .
如果当前任务完成或阻塞,也会调用调度程序 .