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