【问题标题】:How does a VxWorks scheduler get executed?VxWorks 调度程序是如何执行的?
【发布时间】:2010-06-08 06:29:18
【问题描述】:

想知道如何调用调度程序以便它可以切换任务。就像它的抢占式调度或循环调度一样 - 调度程序应该参与进来以进行任何类型的任务切换。假设一个低优先级的任务有一个无限循环——调度器什么时候介入并切换到更高优先级的任务?

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

提前致谢。

--阿什温

【问题讨论】:

  • 虽然我不了解 VxWorks,但在其他操作系统中,调度程序通常由定时器中断调用,因此即使一个任务当前很忙,它也可以切换任务。

标签: vxworks scheduler preemption


【解决方案1】:

简单的答案是,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,因此您可以在任务被抢占时调用函数。

【讨论】:

  • 请注意,只有在启用循环调度(通过调用 kernelTimeSlice() )时才会如此,默认为基于优先级的抢占式调度。
  • @nos:无论调度策略如何,定时器中断始终运行以跟踪滴答计数、看门狗定时器和信号量超时。碰巧的是,对于基于优先级的抢占式调度,vxWorks 调度程序不会选择新的任务来运行,除非某些计时器操作将更高优先级的任务移至就绪队列。但公平点。我一直想更新这个答案,使其更精确,并包括系统调用,我当时完全忘记提及了。
  • 还应该记住,循环是基于优先级的补充。无论如何,您都会获得优先级。循环调度只影响相同优先级的任务。另外,即使只有一个优先级,任务仍然可以使用例如taskDelay,因此系统滴答仍然需要进行。
【解决方案2】:

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). 这对于我相信的大多数操作系统都是如此,无论是否实时
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 2021-07-20
      • 1970-01-01
      相关资源
      最近更新 更多