代码之家  ›  专栏  ›  技术社区  ›  Benoit

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

  •  2
  • Benoit  · 技术社区  · 16 年前

    传统的嵌入式系统是使用一个协作的多任务调度器来实现的。

    • 任务A确实有效
    • 当任务A完成时,它产生处理器。
    • 任务B获得处理器并执行工作。
    • 任务B产生
    • 任务n产生

    一个大循环队列:A->B->C->-&燃气轮机;n->A.

    我们正在将系统移植到一个新的平台上,希望尽量减少系统的重新设计。

    5 回复  |  直到 16 年前
        1
  •  2
  •   Benoit    16 年前

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

    只需将所有任务放在同一位置即可 相同的 优先事项
    在代码中,执行 产量 ,只需插入一个“taskDelay(0);”

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

        2
  •  2
  •   DGentry    16 年前

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

    我必须得出结论:禁用vxWorks切片会导致疯狂。避免它,如果它是在你的权力范围内这样做。

    禁用任务切片可以有效地使系统中的每个任务都依赖于其他每个任务。如果您有三项以上的任务,或者 认为 您最终可能会有三个以上的任务,您确实需要构建系统来实现它。

        3
  •  0
  •   mdec    16 年前

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

    这个 wiki article

    祝你好运

        4
  •  0
  •   Richard Harrison    16 年前

    你所描述的基本上是:

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

    然而,如果您还没有一个调度器,那么现在是实现一个调度器的好时机。在最简单的情况下,每个入口点既可以从任务类继承,也可以实现任务接口(取决于语言)。

        5
  •  0
  •   Naveen Kumar    10 年前

    您可以使所有任务具有相同的优先级并使用任务延迟(0),也可以在需要使非预先准备工作的低优先级任务中使用tasklock和taskunlock。