vxWorks は同じ優先度の 2 つのタスクをどのように処理しますか?

StackOverflow https://stackoverflow.com/questions/79892

  •  09-06-2019
  •  | 
  •  

質問

vxWorks 組み込みシステムには、同じ優先度 (110) を持つ 2 つのタスク (T1 と T2) があります。
両方のタスクを実行する準備ができている場合、通常の vxWorks スケジューラはこれにどのように対処しますか?
どのタスクが最初に実行されますか?

役に立ちましたか?

解決

最初に実行されるタスクは、VxWorks スケジューラ タスクによって実現されるように、最初に生成されるタスクです。VxWorks が使用するもの 優先順位ベースのスケジューリング デフォルトでは。したがって、あなたの場合、T1とT2は同じ優先順位を持っているため、最初にCPUを取得した方が明示的にブロックされるまで無期限に実行され続けます(次を使用します) タスクの一時停止 または タスク遅延)、その時点で他の READY タスクがブロックされるまで実行されます。これはセマフォまたはミューテックス (ミューテックス?) によって制御される必要があります。

優先順位ベースのスケジューリングの主な問題は、まさにこの問題によって明らかになります。これらのタスクを実行する時間をどのように決定すればよいでしょうか?優先順位が同じであるという事実が事態を複雑にしています。もう 1 つの懸念事項は、優先度の高い VxWorks タスク (数字が小さいほど優先度が高いことを意味します) がアプリケーションをプリエンプトする可能性があることです。これについてはコードで準備する必要があります。これらの問題は、次の方法で解決できます。 ラウンドロビンスケジューリング. 。ラウンドロビン スケジューリングによって引き起こされる追加の問題とその解決策がすべて説明されています。 ここ.

他のヒント

VxWorks には 256 の優先順位レベルがあります (0 が最高、255 が最低)。常に、最も優先度の高いタスクが CPU 上で実行されます。概念的には、各優先レベルにはキューがあり、複数のタスクが実行のためにキューに入れられます。

同じ優先度 A、B、C の 3 つのタスクがあります。A が実行されていると仮定します。
A がブロック (taskDelay、SemTake、msgQReceive) すると、B が実行を開始します。
A のブロックが解除されると、キューの最後に置かれます。これでB、C、Aができました。
B がブロックすると、C が引き継ぐなど...

ラウンド ロビン スケジューリング (タイム スライス) が有効な場合、同じ概念が適用されますが、タスクはタイム スライスが終了するとキューの最後に置かれます。

優先度の高いタスクによってタスクが横取りされても、キューの順序には影響しないことに注意してください。A が実行中でプリエンプトされた場合、優先度の高いタスクが完了すると実行を継続します。キューの最後には置かれません。

デフォルトでは、最初に生成されたものが実行され、CPU を放棄しない限り、もう一方は実行されません。

タイムスライスするよりも、ラウンド ロビンを明示的に有効にすることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top