使用协作式多任务调度程序实现传统嵌入式系统。
系统基本上按以下方式工作:
一个大的循环队列:A - > B - > C - > ... - > n - >甲
我们正在将系统移植到新平台,并希望最大限度地减少系统重新设计。
有没有办法在vxWorks中实现这种类型的协同多任务?
答案 0 :(得分:2)
虽然VxWorks是基于优先级的操作系统,但可以实现这种类型的协作式多任务处理。
只需将所有任务置于相同优先级 在代码中,您执行 yield ,只需插入'taskDelay(0);'
请注意,您必须确保禁用内核时间切片(kernelTimeSlice(0))。
具有相同优先级的所有任务都在队列中。当任务产生时,它将被放置在队列的末尾。这将实现所描述的算法类型。
答案 1 :(得分:2)
我曾经在一个相对较大的嵌入式产品上工作过。时间切片被禁用,并且线程在他们想要允许另一个线程运行时显式地执行taskDelay。
我必须得出结论:禁用vxWorks切片会导致疯狂。如果你有能力这样做,请避免使用它。
因为任务完全是非抢占式的(并且只允许中断处理程序将消息排入队列以供常规任务使用),所以系统已经为其任何数据结构省去了任何类型的锁定。如果所有数据结构都一致,则期望任务仅将调度程序释放到另一个任务。
随着时间的推移,原始程序员继续前进并被新的开发人员取代以维护和扩展产品。随着功能越来越多,整个系统的响应速度也越来越低。当面对一项花费太长时间的任务时,新开发人员将采取直截了当的解决方案:在中间插入taskDelay。有时这很好,有时候不是......
有效地禁用任务切片会使系统中的每个任务都依赖于每个其他任务。如果你有三个以上的任务,或者你甚至认为你最终可能有三个以上的任务,你真的需要构建系统以允许它。
答案 2 :(得分:0)
答案 3 :(得分:0)
您所描述的内容基本上是:
void scheduler()
{
while (1)
{
int st = microseconds();
a();
b();
c();
sleep(microseconds() - st);
}
}
但是,如果您还没有调度程序,现在是实施调度程序的好时机。在最简单的情况下,每个入口点可以从Task类中多次继承,也可以实现Task接口(取决于语言)。
答案 4 :(得分:0)
您可以使所有任务具有相同的优先级并使用任务延迟(0),或者您可以在低优先级任务中使用任务锁定和taskunlock,您需要进行非预先工作。