Previous: 3.7. Idle Hook機能 |
Up: 3. タスク管理 |
Next: 3.9. 優先度の取得 |
サンプルプログラム |
freertos_priority_change_3_task |
これまでのプログラムでは、タスクの優先度は最初にカーネルに登録されたときから一定でした。FreeRTOSでは、一度登録されたタスクの優先度を、後から自由に変更することができます。
タスクの優先度を変更するためには、vTaskPrioritySet関数を使用します。
関数名 |
vTaskPrioritySet関数 |
|
関数プロトタイプ |
void vTaskPrioritySet ( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority ) |
|
動作 |
タスクの優先度を再設定します。 |
|
引数 |
pxTask |
変更するタスクのタスクハンドラを指定します。NULLを指定するとこの関数を実行したタスクを指定したことになります。 |
uxNewPriority |
再設定する優先度を指定します。 |
|
戻り値 |
無し。 |
タスクハンドラは、xTaskCreate関数でタスクを登録する際に引数pvCreatedTaskで指定する変数です。タスクハンドラは、あとあとタスクを変更したり、削除したりするときに、タスクを特定するために使用します。タスクハンドラを作るためには、以下のようにxTaskHandle型の変数を宣言しておきます。
xTaskHandle xTaskBHandle; |
そしてxTaskCreate関数の実行時に、引数pvCreatedTaskに、先ほど宣言したxTaskHandle型の変数を渡します。
xTaskCreate(prvTaskBC, (signed portCHAR *)"TaskB", 192, &TaskB_symbol, 2, &xTaskBHandle); |
すると、このタスクハンドラ、この例で言えば変数xTaskBHandleを使用することにより、TaskBを指定して、タスクの変更、削除等の操作が行えるようになります。
サンプルプログラムでは、以下のようにして、vTaskPrioritySet関数でxTaskBHandle等のタスクハンドラを指定し、タスクの優先度を変更しています。
vTaskPrioritySet(xTaskBHandle, 1); |
サンプルプログラムでは、TaskAの優先度を一番高くしているのですが、TaskAは10ms毎にしか実行されません。その間に実行されることとなるTaskBとTaskCの優先度をTaskAが入れ替えています。
void prvTaskA(void *pvParameters) { ? int8_t* pcTaskName; ? pcTaskName = (int8_t *)pvParameters; ? while(1) ??? { ????? cprintf(pcTaskName); ????? vTaskPrioritySet(xTaskBHandle, 1); ????? vTaskPrioritySet(xTaskCHandle, 2); ????? vTaskDelay(1); ????? cprintf(pcTaskName); ????? vTaskPrioritySet(xTaskBHandle, 2); ????? vTaskPrioritySet(xTaskCHandle, 1); ????? vTaskDelay(1); ??? } } |
その結果、サンプルプログラムを実行すると以下のように表示されます。TaskCの優先度が高い間は”C”が、TaskBの優先度が高い間は”B”が表示されます。
ACCCCCCCCCCCCABBBBBBBBBBACCCCCCCCCCCABBBBBBBBBBACCCCCCCC CCCBBBBBBBBBBBBACCCCCCCCCCABBBBBBBBBBBACCCCCCCCCCABBBBBB BBBBBACCCCCCCCCCABBBBBBBBBBBACCCCCCCCCCABBBBBBBBBBBACCCC .... |
Previous: 3.7. Idle Hook機能 |
Up: 3. タスク管理 |
Next: 3.9. 優先度の取得 |