首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何执行VxWorks调度器?

如何执行VxWorks调度器?
EN

Stack Overflow用户
提问于 2010-06-08 14:29:19
回答 4查看 8.8K关注 0票数 10

我想知道调度器是如何被调用的,以便它可以切换任务。即使是抢占式调度或循环调度,调度器也应该参与到画面中来进行任何类型的任务切换。假设一个低优先级的任务有一个无限循环--什么时候调度器会介入并切换到高优先级的任务?

查询是: 1.谁调用调度器?在VxWorks 2中。如果它以固定的时间间隔被调用-该机制是如何实现的?

提前谢谢。

--阿什温

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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,因此只要任务被抢占,就可以调用一个函数。

票数 14
EN

Stack Overflow用户

发布于 2011-02-15 08:32:26

indiv提供了一个非常好的答案,但它只是部分准确的。

系统的实际工作稍微复杂一些。

调度器可以作为同步或异步操作的结果来执行。

同步是指由于当前正在执行的任务中的代码而导致的操作。最好的例子就是获取一个信号量(semTake)。

如果信号量不可用,则当前正在执行的任务将挂起,并且不再可用于执行。此时,调度器将被调用,并确定应该执行的下一个任务,并执行上下文切换。

异步操作本质上是指中断。indiv很好地描述了定时器中断。但是,许多不同的元素可能会导致中断执行:网络流量、传感器、串行数据等。

记住,定时器中断不一定会导致上下文切换!是,中断将发生,延迟任务和时间片计数器将递减。但是,如果时间片未过期,或者没有更高优先级的任务从挂起状态转换到就绪状态,则不会实际调用调度程序,您将返回到执行中断的确切时间点上的原始任务。

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

票数 6
EN

Stack Overflow用户

发布于 2010-06-08 19:52:12

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2995210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档