vxWorks 組み込みシステムには、同じ優先度 (110) を持つ 2 つのタスク (T1 と T2) があります。
両方のタスクを実行する準備ができている場合、通常の vxWorks スケジューラはこれをどのように処理しますか?
最初に実行するタスクは?
3 に答える
最初に実行されるタスクは、VxWorks スケジューラ タスクによって実現される最初に生成されるタスクです。VxWorks は、デフォルトで優先度ベースのスケジューリングを使用します。したがって、あなたの場合、T1とT2の優先度は同じであるため、最初にCPUを取得した方が明示的にブロックされるまで(taskSuspendまたはtaskDelayを使用して)無期限に実行され続け、その時点で他のREADYタスクがブロックされるまで実行されます、 等々。これは、セマフォまたはミューテックス (mutices?) によって制御されるべきです。
優先順位に基づくスケジューリングの主な問題は、まさにこの問題によって明らかになります。これらのタスクを実行する時間をどのように決定するのでしょうか? それらが同じ優先順位を持っているという事実は、物事を複雑にします。もう 1 つの懸念事項は、優先度の高い VxWorks タスク (数字が小さいほど優先度が高いことを意味します) が、コードで準備する必要があるアプリケーションをプリエンプトする可能性があることです。これらの問題は、ラウンドロビン スケジューリングを使用することで解決できます。ラウンドロビン スケジューリングによって引き起こされる追加の問題とその解決策は、すべてここで説明されています。
VxWorks には 256 の優先度レベルがあります (0 が最高、255 が最低)。いつでも、最も優先度の高いタスクが CPU で実行されます。各優先度レベルには、概念的には、複数のタスクが実行のためにキューに入れられるキューがあります。
同じ優先度の 3 つのタスク A、B、C があります。A が実行中であるとします。
A がブロック (taskDelay、SemTake、msgQReceive) すると、B が実行を開始します。
A がブロック解除されると、キューの最後に配置されます。これで、B、C、Aができ
ました。B がブロックすると、C が引き継ぐなど...
ラウンド ロビン スケジューリング (タイム スライス) が有効になっている場合、同じ概念が適用されますが、タイム スライスが終了すると、タスクはキューの最後に置かれます。
優先度の高いタスクによって横取りされたタスクは、キューの順序に影響を与えないことに注意してください。A が実行されていて横取りされた場合、優先度の高いタスクが完了したときに実行が継続されます。キューの最後に置かれません。
デフォルトでは、最初に生成されたものが実行され、CPUを放棄しない限り、もう一方は実行されません。
タイムスライスよりも、ラウンドロビンを明示的に有効にすることができます。