2

従来の組み込みシステムは、協調的なマルチタスク スケジューラを使用して実装されます。

このシステムは、基本的に次のように機能します。

  • タスクAは機能します
  • タスク A が完了すると、プロセッサが解放されます。
  • タスク B はプロセッサを取得し、作業を行います。
  • タスク B は
    ...
  • タスク n の利回り
  • タスク A がスケジュールされ、機能する

1 つの大きな循環キュー: A -> B -> C -> ... -> n -> A

システムを新しいプラットフォームに移植しており、システムの再設計を最小限に抑えたいと考えています。

vxWorks でそのような協調的なマルチタスクを実装する方法はありますか?

4

5 に答える 5

2

私はかつて、これを行う比較的大きな組み込み製品に取り組んだことがあります。タイム スライスが無効になり、別のスレッドの実行を許可したい場合、スレッドは明示的に taskDelay を実行しました。

結論として、vxWorks スライシングを無効にすると狂気になります。それがあなたの力の範囲内であれば、それを避けてください。

タスクは完全にプリエンプティブではないため (また、割り込みハンドラーは、通常のタスクが消費するメッセージをキューに入れることしか許可されていませんでした)、システムはそのデータ構造のいずれに対しても、あらゆる種類のロックを不要にしました。タスクは、すべてのデータ構造が一貫している場合にのみ、スケジューラを別のタスクに解放することが期待されていました。

時が経つにつれて、元のプログラマーは移動し、製品を維持および拡張するために新しい開発者に取って代わられました。機能が増えるにつれて、システム全体の応答性が低下しました。時間がかかりすぎるタスクに直面したとき、新しい開発者は単純な解決策をとります: 途中に taskDelay を挿入します。これでいいときもあれば、そうでないときもある…

タスク スライスを効果的に無効にすると、システム内のすべてのタスクが他のすべてのタスクに依存するようになります。3 つ以上のタスクがある場合、または最終的に 3 つ以上のタスクを持つ可能性があると思われる場合でも、それを可能にするシステムを構築する必要があります。

于 2008-09-27T03:01:21.847 に答える
2

VxWorks は優先度ベースの OS ですが、この種の協調マルチタスクを実装することは可能です。

すべてのタスクを同じ優先度に置くだけです。
コードでyieldを実行する場所に、「taskDelay(0);」を挿入するだけです。

カーネル タイム スライスが無効になっていることを確認する必要があることに注意してください (kernelTimeSlice(0))。

同じ優先度のすべてのタスクはキューにあります。タスクが譲歩すると、キューの最後に置かれます。これにより、説明されているタイプのアルゴリズムが実装されます。

于 2008-09-27T01:35:20.837 に答える
0

これは VxWorks に固有のものではありませんが、あなたが説明したシステムは Round Robin Scheduling の変形です (プライオリティ キューを使用していると仮定していますが、それ以外の場合は単なる Round Robin Scheduling です)。

wikiの記事では、少し背景を説明しています。

幸運を

于 2008-09-27T02:30:19.627 に答える
0

あなたが説明することは本質的に次のとおりです。

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

ただし、まだスケジューラーを持っていない場合は、今が実装する良い機会です。最も単純なケースでは、各エントリ ポイントは Task クラスから多重継承されるか、Task インターフェイスを実装します (言語によって異なります)。

于 2008-11-24T00:19:58.907 に答える