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


Previous: 3.4. 一つのタスク用関数で複数のタスクを登録する

Up: 3. タスク管理

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


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

3.5. タスク優先度

サンプルプログラム

freertos_priority_test

 先述のように、RTOSでは、複数のタスクが登録されていて、その優先度に差がある場合には、優先度が高いもののみが実行されます。このサンプルプログラムで、実際にそのようなルールが実装されているか、確認してみましょう。

 このサンプルプログラムのタスクの登録部分は以下のようになっています。同じタスク用関数を使用していますがパラメータを分けています。ただし初期状態では優先順位は同じです。

? xTaskCreate(prvTask, (signed portCHAR *)"TaskA", 192, &TaskA_symbol, 1, NULL);

? xTaskCreate(prvTask, (signed portCHAR *)"TaskB", 192, &TaskB_symbol, 1, NULL);

//? xTaskCreate(prvTask, (signed portCHAR *)"TaskB", 192, &TaskB_symbol, 2, NULL);

//? xTaskCreate(prvTask, (signed portCHAR *)"TaskB", 192, &TaskB_symbol, 3, NULL);

 この状態でプログラムを実行すると以下のようになります。

abcabcabcabcABCABCABCABCabcabcabcabABCABCABCABCcabcabcabcabABCABCA

BCABcabcabcabcabCABCABCABCAcabcabcabcabBCABCABCABCcabcabcabcabABCA

BCABCABcabcabcabcabCABCABCABCAcabcabcabcabBCABCABCABCcabcabcabcabA

....

 先ほどのサンプルと同じく、1msの間に出力可能な文字数だけ出力されて、その後は次のタスクに処理が移っています。TaskA1msの間Running状態となり、その間TaskBReady状態となります。その後コンテキストスイッチが発生し、TaskB1msの間Running状態となり、その間TaskAReady状態となります。

 ここで先ほどのxTaskCreate関数のコメントアウトを以下のように変更して、優先度を12にしてみましょう。

? xTaskCreate(prvTask, (signed portCHAR *)"TaskA", 192, &TaskA_symbol, 1, NULL);

//? xTaskCreate(prvTask, (signed portCHAR *)"TaskB", 192, &TaskB_symbol, 1, NULL);

? xTaskCreate(prvTask, (signed portCHAR *)"TaskB", 192, &TaskB_symbol, 2, NULL);

//? xTaskCreate(prvTask, (signed portCHAR *)"TaskB", 192, &TaskB_symbol, 3, NULL);

 この状態でプログラムを実行すると以下のようになります。

abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc

abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc

abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc

....

 文字列”ABC”がまったく表示されなくなりました。つまりTaskAは一切実行されずに、TaskBのみが実行されているということになります。FreeRTOSの場合、優先度として指定する数値が大きいほど優先度が高いという扱いになっています。TaskAの優先度が1で、TaskBの優先度が2なので、優先度が高いTaskBのみRunning状態になって実行された訳です。この間TaskAReady状態のままとなります。ちなみにコメントアウトを変更して、TaskBの優先度を3にしても同じ結果になります。TaskAの優先度を2にして、TaskBの優先度を3に設定してもやはり同じ結果になります。

 xTaskCreate関数では、優先度として指定できる数値の最大値は、FreeRTOSConfig.h中のconfigMAX_PRIORITIESで設定します。優先度の最大値を大きくすると、カーネルのメモリ消費量が増えてしまうので、この値は、実際に必要になる優先度の範囲ぎりぎりにしておくのがよいでしょう。

#define configMAX_PRIORITIES??????????????? ( ( unsigned portBASE_TYPE ) 10 )


Previous: 3.4. 一つのタスク用関数で複数のタスクを登録する

Up: 3. タスク管理

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


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