NUCLEO-F302R8 FreeRTOS タスク 優先度
前回はFreeRTOSでタスクを作ってLEDチカチカとUART送信を行いました。
今回は異なるタスクに異なる優先度を与えて、優先度に応じたタスクの切り替えが行われることを試します。
リファレンス
FreeRTOSのドキュメントを参照します。以下がトップページです。
https://www.freertos.org/index.html
SW構成

以下のタスクが今回のポイントです。
- Low, Mid Highタスク
    
- 優先度が異なるタスクを3つ作成します。Lowの優先度が一番小さいです。
 - 各タスクはUartタスクに送信したい文字を一定時間通知し続けます。タスクの処理を模擬しています。
 - vApplicationHookからSysTickカウントを受け取り、時間のカウントに使用します。
 
 - Uartタスク
    
- Low, Mid, Highタスクから文字を受け取り、Uartで送信します。
 - タスクの優先度はHighタスクよりも高くします。
 
 
タスクの実行スケジュール
以下のイメージでタスクが実行されるように、タスクの優先度、タスクの処理時間、タスクのDelayを設定します。

| タスク | 優先度 | 処理時間[ms] | Delay[ms] | 
|---|---|---|---|
| Uart | 4 | - | 100 | 
| High | 3 | 200 | 800 | 
| Mid | 2 | 500 | 500 | 
| Low | 1 | - | - | 
- High, Midタスクは処理時間だけループした後、Delay時間だけタスクをBlocked(待ち)にします。ループ中は優先度の低いタスクは実行されません。優先度の高いタスクがBlockedになると、優先度の低いタスクが実行されます。
 - LowタスクはDelayを行わず、常にループさせます。他に実行しているタスクがいない場合に実行されます。
 - Uartタスクの処理時間は実際にUartの送信レジスタへの書き込みにかかった時間になります。
 
Blockedはタスクの状態の一つです。以下のページを見てください。
https://www.freertos.org/RTOS-task-states.html
コード
タスク定義
タスク作成
動作確認
イメージしたスケジュール通りに文字が送信されていることが確認できます。

タスクの優先度を同じにすると
以下のコードのように、同じ優先度のタスクを作った場合の動きを確認します。
void taskAppLow1() {
    for (;;) {
        uartSendChar = '1';
    }
}
void taskAppLow2() {
    for (;;) {
        uartSendChar = '2';
    }
}
void taskAppLow3() {
    for (;;) {
        uartSendChar = '3';
    }
}
動作確認の結果です。ラウンドロビンで動いています。
