実際、次の理由により、taskDelay(0) は優先度の低いタスクを実行させません。
- 優先度の高いタスクが実行中です
- 優先度の高いタスクの問題 taskDelay(0)
- スケジューラが呼び出され、実行する次のタスクをスキャンし、「準備完了」の最も優先度の高いタスクを選択します
- taskDelay(0) を発行したタスクは、遅延が期限切れになったため (つまり、0 ティックが経過したため) 準備ができています。
- そのため、優先度の高いタスクはすぐに再スケジュールされます。この場合、taskDelay(0) は実質的に CPU サイクルの無駄です。
taskDelay(1) を発行する場合、同じ手順に従いますが、違いは、1 ティックが経過していないため優先度の高いタスクが準備完了状態にないことです。 CPU 時間の 1 ティック後、優先度の高いタスクによって横取りされます。
現在、次のようなことを行う、設計が不十分なシステムがいくつかあります。
taskLock();
...
taskDelay(0);
...
taskUnlock();
優先度の低いタスクが CPU を占有することを意図して、優先度の高いタスクが taskDelay(0) を発行することによって引き継ぐことができるようになります。ただし、このようなゲームをプレイする場合は、デザインを再考する必要があります。
また、あなたの場合、優先度の低いタスクがイベントを処理できるようにするために taskDelay() を実行するのではなく、より堅牢なシステムを検討します。優先度の低いタスクにメッセージを送信し、優先度の低いタスクにメッセージを処理させる必要があります。列。イベントハンドラーまたは同様のものによって提供されるセマフォで優先度の高いタスクがブロックされている間。この状況では、ジョブを完了するために 2 つの異なるタスク間でピンポンを強制することを望んでいますが、システムがスケジュール可能である限り (つまり、応答するのに十分な時間がある限り)、バッファーとして機能するキューを追加する場合すべてのイベントに対して、それらをキューに入れ、完全に処理します)、それは機能します。
アップデート
あなたのシステムは次のようなものになっていると思います:
- イベントが発生します (割り込み駆動?)。
- 優先度の高いタスクを実行してデータを収集します。
- データは優先度の低いタスクによって処理されます。
この場合、従いたいパターンは実際には非常に単純であり、実際には 1 つのタスクだけで達成できます。
割り込みハンドラはデータを収集し、メッセージ (msgQSend()) をタスクに送信します。タスクは、msgQReceive を使用してメッセージ キューで保留中です。
しかし、あなたのシステム (実際に何をしようとしているのか) と、ネイティブの vxworks 呼び出しではなく posix 呼び出しを使用している理由について詳しく知っていれば、役立つかもしれません。
リアルタイム システムを初めて使用する場合は、レート単調分析について学ぶ必要があります。ウィキペディアに非常に簡単な要約があります。
http://en.wikipedia.org/wiki/Rate-monotonic_scheduling
また、VxWorks では「高優先度」は 0、「低優先度」は 255 であることに注意してください。実際の数値はその意味に反比例します:D