Previous: 3.6. タスクの実行頻度 |
Up: 3.6. タスクの実行頻度 |
Next: 3.6.2. vTaskDelay関数 |
サンプルプログラム |
freertos_wait_test |
前項では優先度が高いタスクのみが実行されることを確認しました。もっとも、優先度の高いタスクだけをずっと実行したいといったケースはあまりありません。一定のタイミングで実行したり、イベントが発生したときに実行したりしたいが多いでしょう。そこで、一定の周期でのみ優先度の高いタスクを実行させ、優先度の高いタスクが実行されていない間は、優先度の低いタスクを実行する方法を考えてみましょう。
定期的に実行するということであれば、処理と処理の間に時間待ち処理を挟めばよいということになります。サンプルプログラムでは、以下のように、メッセージの出力処理の間に時間待ち処理を挟んでみました。カーネルにはタスクを2つ登録していますが、この時間待ち処理を含むTaskaの方の優先度を高く設定しています。
void prvTaska(void *pvParameters) { ? int8_t* pcTaskName; ? pcTaskName = (int8_t *)pvParameters; ? while(1) ??? { ????? cprintf(pcTaskName); ????? delay_ms(10); ??? } } |
このサンプルプログラムの実行結果は以下のようになります。
abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc .... |
このとおりTaskaのみが実行され、TaskAは実行されていません。このアプリケーションはTaskaのみを実行し、”abc”を10ms毎に表示するという状態になってしまっています。
これはTaska中のdelay_ms関数は、カーネルから見れば、それ自体もTaskaの一部であることから、「10ms待つ」という処理をTaskAよりも優先して実行させないといけないと判断しているからです。
そこで、待ち時間の間は優先順位の低いタスクを実行させる場合には、次項以降で紹介するvTaskDelay関数又はvTaskDelayUntil関数を実行します。
Previous: 3.6. タスクの実行頻度 |
Up: 3.6. タスクの実行頻度 |
Next: 3.6.2. vTaskDelay関数 |