Previous: 3.4. 一つのタスク用関数で複数のタスクを登録する |
Up: 3. タスク管理 |
Next: 3.6. タスクの実行頻度 |
サンプルプログラム |
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の間に出力可能な文字数だけ出力されて、その後は次のタスクに処理が移っています。TaskAが1msの間Running状態となり、その間TaskBはReady状態となります。その後コンテキストスイッチが発生し、TaskBが1msの間Running状態となり、その間TaskAはReady状態となります。
ここで先ほどのxTaskCreate関数のコメントアウトを以下のように変更して、優先度を1と2にしてみましょう。
? 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状態になって実行された訳です。この間TaskAはReady状態のままとなります。ちなみにコメントアウトを変更して、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. タスクの実行頻度 |