NUCLEO-F302R8 FreeRTOS xTaskNotifyFromISR

xTaskNotifyFromISR の使用についてまとめた記事です。

経緯

AD変換の割込みでAD変換結果が閾値以上であればxTaskNotifyFromISRでタスクに通知するというプログラムを作っていました。

しかし、Arm Cortex-Mの割込み優先度設定が不適切でFreeRTOSのASSERTでプログラムが止まってしまったので、その対処で勉強したことをまとめました。

FreeRTOSの公式ドキュメントにも割込みについてのCoretx-Mの割込み優先度についての記載がありますので、こちらも参考にしてください。

https://www.freertos.org/RTOS-Cortex-M3-M4.html

リファレンス

Arm Cortex 割込み優先度

Arm Cortexは各割り込みに対して8bit値の優先度を設定できるしようになっています。

ただし、実際の優先度のビット幅はマイコンの実装依存になります。

F302R8は8bitの内、上位4bitを使用できます。

割込み優先度

PM: 4.3.7 割込み優先度レジスタ(NVIC_IPRx)

Arm Cortex 割込み優先度のグループ化

優先度値を上位、下位のビットに分けて、優先度をグループ化することができます。

  • グループ優先度
    • 実行中の割込みハンドラよりグループ優先度が高い割込みが発生した場合、実行中の割込みを中断してグループ優先度が高い割込みハンドラを実行します。
    • 優先度が同じ場合は割込み番号が低い割込みが優先されます。
  • サブ優先度
    • グループ優先度が同じ割り込みが複数発生した場合、サブ優先度が高い割込みから実行します。
    • 優先度が同じ場合は割込み番号が低い割込みが優先されます。

PM: 4.4.5 アプリケーション割込みおよびリセット制御レジスタ(AIRCR)
PRIGROUP

xTaskNotifyFromISR

公式のドキュメントを参照してください。

https://www.freertos.org/xTaskNotifyFromISR.html

コード

今回の対応をコミットしたリビジョンです。

  • グループ優先度
    • なしに設定しました。つまり、全ての優先度ビットをサブ優先度として使用します。
  • サブ優先度
    • 全て5に設定しました。FreeRTOSのconfigLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITYで設定した優先度値以下でないと、vPortValidateInterruptPriority()のASSERTで止まります。

https://github.com/ohmusso/NUCLEO-F302R8/commit/596b6163ceaf88d01b0c4a1e372e3d26862b7bec