首页 文章

VxWorks调度程序如何执行?

提问于
浏览
10

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

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

提前致谢 .

--Ashwin

4 回答

  • 5

    简单的答案是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提供给任务切换逻辑,这样您就可以在任务被抢占时调用函数 .

  • 13

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

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

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

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

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

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

  • 0

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

  • 0

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

相关问题