3.6.1. 単純な待ちルーチンの問題点

マイコン入門spacer ad
トップページに戻る(マイコン徹底入門:STM32で始めるARM/Cortex-M3組み込み開発)
「マイコン徹底入門」とは? |  「マイコン徹底入門」を読む |  ダウンロード |  掲示板 |  筆者の自己紹介


Previous: 3.6. タスクの実行頻度

Up: 3.6. タスクの実行頻度

Next: 3.6.2. vTaskDelay関数


マイコン徹底入門:RTOS編:フリーのリアルタイムOS活用法: 3. タスク管理: 3.6. タスクの実行頻度:

3.6.1. 単純な待ちルーチンの問題点

サンプルプログラム

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関数


このページはITと知的財産の法律情報「法務ネット」の管理人が制作・運営しています。