2008-09-27 59 views
2

传统的嵌入式系统使用协作式多任务调度程序来实现。我可以在VxWorks中实现一个协作式多任务系统吗?

该系统主要大意如下工作:

  • 任务A做工作
  • 当任务A完成后,它产生的处理器。
  • 任务B获取处理器并工作。
  • 任务B产生
    ...
  • 任务ň产量
  • 任务A被安排和确实工作

一个大循环队列:甲 - >乙 - “ç - > ... - > n - > A

我们正在将系统移植到一个新的平台,并希望最小化系统重新设计。

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

回答

2

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

简单的说,所有的任务都在相同的优先。
在你的代码中,你的的产量是,只需插入一个'taskDelay(0);'

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

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

0

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

wiki article提供了一些背景,然后你可以从那里去。

好运

2

我曾经在一个相对较大的嵌入式产品上工作过,时间切片被禁用,并且线程在他们想要允许另一个线程运行时显式地执行taskDelay。我不得不得出结论:禁用vxWorks切片会导致疯狂。避免它,如果它是在你的力量这样做。由于任务完全是非抢先的(并且中断处理程序只允许排队消息以供常规任务使用),系统已经免除了对其任何数据结构的任何类型的锁定。如果所有数据结构都一致,则预期任务只会将调度程序释放到另一个任务。

随着时间的推移,原来的程序员继续前进,并被新鲜开发人员所取代以维护和扩展产品。随着系统功能的增多,整个系统的响应速度变慢。当面临花费太长时间的任务时,新开发人员会采取简单的解决方案:在中间插入taskDelay。有时候这很好,有时候并不是这样......

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

0

你描述的实际上是:

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

但是,如果你不已经有一个调度程序,现在是落实一个好时机。在最简单的情况下,每个入口点可以从Task类继承,或者实现一个Task接口(取决于语言)。

+0

Richard,我喜欢你的答案,但问题与vxWorks有关。所以已经有一个调度器。 – Benoit 2008-11-29 05:36:30

0

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

相关问题