我可以在VxWorks中实现协作式多任务系统吗?

时间:2008-09-27 01:29:30

标签: vxworks

使用协作式多任务调度程序实现传统嵌入式系统。

系统基本上按以下方式工作:

  • 任务A确实有效
  • 完成任务A后,它会生成处理器。
  • 任务B获取处理器并确实有效。
  • 任务B产生
    ......
  • 任务n产生
  • 任务A已安排并正常运行

一个大的循环队列:A - > B - > C - > ... - > n - >甲

我们正在将系统移植到新平台,并希望最大限度地减少系统重新设计。

有没有办法在vxWorks中实现这种类型的协同多任务?

5 个答案:

答案 0 :(得分:2)

虽然VxWorks是基于优先级的操作系统,但可以实现这种类型的协作式多任务处理。

只需将所有任务置于相同优先级 在代码中,您执行 yield ,只需插入'taskDelay(0);'

请注意,您必须确保禁用内核时间切片(kernelTimeSlice(0))。

具有相同优先级的所有任务都在队列中。当任务产生时,它将被放置在队列的末尾。这将实现所描述的算法类型。

答案 1 :(得分:2)

我曾经在一个相对较大的嵌入式产品上工作过。时间切片被禁用,并且线程在他们想要允许另一个线程运行时显式地执行taskDelay。

我必须得出结论:禁用vxWorks切片会导致疯狂。如果你有能力这样做,请避免使用它。

因为任务完全是非抢占式的(并且只允许中断处理程序将消息排入队列以供常规任务使用),所以系统已经为其任何数据结构省去了任何类型的锁定。如果所有数据结构都一致,则期望任务仅将调度程序释放到另一个任务。

随着时间的推移,原始程序员继续前进并被新的开发人员取代以维护和扩展产品。随着功能越来越多,整个系统的响应速度也越来越低。当面对一项花费太长时间的任务时,新开发人员将采取直截了当的解决方案:在中间插入taskDelay。有时这很好,有时候不是......

有效地禁用任务切片会使系统中的每个任务都依赖于每个其他任务。如果你有三个以上的任务,或者你甚至认为你最终可能有三个以上的任务,你真的需要构建系统以允许它。

答案 2 :(得分:0)

这不是特定于VxWorks,但您所描述的系统是循环调度的变体(我假设您正在使用优先级队列,否则它只是循环调度)。

wiki article提供了一些背景知识,然后你可以从那里开始。

祝你好运

答案 3 :(得分:0)

您所描述的内容基本上是:

void scheduler()
{
    while (1)
    {
        int st = microseconds();
        a();
        b();
        c();
        sleep(microseconds() - st);
    }
}

但是,如果您还没有调度程序,现在是实施调度程序的好时机。在最简单的情况下,每个入口点可以从Task类中多次继承,也可以实现Task接口(取决于语言)。

答案 4 :(得分:0)

您可以使所有任务具有相同的优先级并使用任务延迟(0),或者您可以在低优先级任务中使用任务锁定和taskunlock,您需要进行非预先工作。