Previous: 5.1.3. バイナリセマフォを与える |
Up: 5.1.3. バイナリセマフォを与える |
Next: 5.1.3.2. 割込みハンドラの作成 |
このサンプルではタイマで定期的に割込みを発生させています。タイマの設定方法はもちろん、NVICの設定方法も、基本的にはFreeRTOSを使わない場合と特に変わりはありません。注意しないといけないのは、NVICに設定する割り込み優先度です。
割込みハンドラ内からFreeRTOSの機能を一切呼び出さないのであれば、その割込みの優先度をどのように設定しても構いません。一方、今回のサンプルのように、セマフォの操作をする場合等、割込みハンドラ内からFreeRTOSの関数を呼び出す場合には、割込みの優先度は、FreeRTOSConfig.h内で定められているシステムコールの割り込み優先度よりも低く設定していなければいけません。初期状態ではFreeRTOSConfig.h内で以下のように設定されています。
/* This is the raw value as per the Cortex-M3 NVIC.? Values can be 255 (lowest) to 0 (1?) (highest). */ #define configKERNEL_INTERRUPT_PRIORITY ? 255 #define configMAX_SYSCALL_INTERRUPT_PRIORITY ???? 191 /* equivalent to 0xb0, or priority 11. */ |
システムコールの優先度はconfigMAX_SYSCALL_INTERRUPT_PRIORITYで、ここでは191とされています。ここでの優先度は8ビット幅で計算しますので、NVICに設定する優先度が12(8ビット幅で192)であればシステムコールよりも優先度が低くなりますが、優先度が11(8ビット幅で176)になるとシステムコールよりも優先します。つまりこの設定であれば、FreeRTOSの機能を呼び出す割込みハンドラの優先度の設定値は12以上(数値としてです)にしなければいけません。
FreeRTOSの関数を利用しない割込みの優先度はどう設定しても構わないのですが、configMAX_SYSCALL_INTERRUPT_PRIORITYより優先度を低くすれば、FreeRTOSの機能関連の割込みが優先します。configMAX_SYSCALL_INTERRUPT_PRIORITYよりも優先度を高くすれば、FreeRTOSの各種機能よりも優先して処理される割込みになるということになります。
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 12; |
サンプルプログラムではタイマ割込の優先度を12に設定しています。これにより、タイマ割込の割込みハンドラから、FreeRTOSの機能を呼び出せることになります。逆に11以上の優先度がある割込みハンドラ内で後述のxSemaphoreGiveFromISR関数等を呼び出すとFreeRTOSがフリーズしますので注意してください。
Previous: 5.1.3. バイナリセマフォを与える |
Up: 5.1.3. バイナリセマフォを与える |
Next: 5.1.3.2. 割込みハンドラの作成 |