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

时间:2020-03-06 14:48:57  来源:igfitidea点击:

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

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

  • 任务A确实起作用
  • 任务A完成后,将产生处理器。
  • 任务B获得处理器并开始工作。
  • 任务B产生...
  • 任务n产生
  • 任务A已排定并正常工作

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

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

有没有办法在vxWorks中实现这种类型的协作式多任务处理?

解决方案

尽管VxWorks是基于优先级的OS,但可以实现这种类型的协作式多任务处理。

只需将所有任务置于相同的优先级即可。
在产生收益的代码中,只需插入" taskDelay(0);"

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

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

这不是特定于VxWorks,但是我们描述的系统是Round Robin Scheduling的变体(我假设我们使用的是优先级队列,否则就是Round Robin Scheduling)。

Wiki文章提供了一些背景知识,然后我们可以从那里开始。

祝你好运

我曾经开发过一个相对较大的嵌入式产品。时间切片被禁用,当线程想要允许另一个线程运行时,它们将显式地使用taskDelay。

我必须得出结论:禁用vxWorks切片会导致疯狂。如果可以的话,请避免使用它。

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

随着时间的流逝,最初的程序员继续前进,并由新的开发人员代替以维护和扩展产品。随着功能的增加,整个系统的响应能力也随之降低。当面对耗时太长的任务时,新开发人员将采用直接的解决方案:在中间插入taskDelay。有时候这很好,有时又不是...

有效地禁用任务切片将使系统中的每个任务都对其他所有任务具有依赖性。如果我们有三个以上的任务,或者甚至认为我们最终可能会有三个以上的任务,那么我们确实需要构建系统以允许这样做。

我们所描述的基本上是:

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

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