第12章 割り込み管理機能
- カーネル管理割り込み
カーネル割込マスクレベルより割り込み優先レベルが低い割り込みをカーネル管理割り込みといいます。
カーネル管理割り込みハンドラでは,サービス・コールを呼び出すことができます。
サービス・コール処理中にカーネル管理割り込みが発生した場合,カーネル管理割り込みを受け付け可能となるまで割り込み受理が遅延されます。
カーネル割込マスクレベルより割り込み優先レベルが低い割り込みをカーネル管理割り込みといいます。
カーネル管理割り込みハンドラでは,サービス・コールを呼び出すことができます。
サービス・コール処理中にカーネル管理割り込みが発生した場合,カーネル管理割り込みを受け付け可能となるまで割り込み受理が遅延されます。
- カーネル管理外割り込み
カーネル割込マスクレベルより割り込み優先レベルが高い割り込みをカーネル管理外割り込みといいます。ノンマスカブル割り込みは,カーネル管理外割り込みの扱いとなります。
カーネル管理外割り込みハンドラでは,サービス・コールを呼び出してはなりません。
サービス・コール処理中にカーネル管理外割り込みが発生した場合でも,直ちに割り込み受理が受理されるため,カーネル処理に依存しない高速な割り込み応答が可能です。
カーネル割込マスクレベルより割り込み優先レベルが高い割り込みをカーネル管理外割り込みといいます。ノンマスカブル割り込みは,カーネル管理外割り込みの扱いとなります。
カーネル管理外割り込みハンドラでは,サービス・コールを呼び出してはなりません。
サービス・コール処理中にカーネル管理外割り込みが発生した場合でも,直ちに割り込み受理が受理されるため,カーネル処理に依存しない高速な割り込み応答が可能です。
RX MCUは「高速割り込み」機能をサポートしています。ひとつの割り込み要因だけを高速割り込みとすることができます。高速割り込みは,割り込み優先レベル15として扱われます。高速割り込みを使用する場合は,割り込み優先レベル15の割り込み要因をひとつに限定する必要があります。
RI600PXで高速割り込みを使用する場合は,その割り込みはカーネル管理外割り込みとして扱う必要があります。つまり,カーネル割り込みマスクレベル(system.system_IPL)は,14以下に設定する必要があります。
時間管理機能は,一定周期で発生する基本クロック用タイマ割り込みを利用して実現されています。基本クロック用タイマ割り込みが発生した際には,RI600PXが提供している時間管理用割り込みハンドラが起動し,時間に関連した処理(システム時刻の更新,タスクの遅延起床/タイムアウト,周期ハンドラの起動など)が実行されます。
なお,RI600PXでは,割り込みハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。このため,割り込みが発生した際には,システム内で最高優先度を持つタスクが処理を実行中であっても,その処理は中断され,割り込みハンドラに制御が移ります。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600pxが出力するヘッダ・ファイルの定義*/ void Inthdr1 ( void ) { ............ ............ return; /*割り込みハンドラの終了*/ } |
- サービス・コールの発行
RI600PXでは,割り込みハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。
カーネル管理割り込みハンドラでは,“発行有効範囲”が“非タスク”のサービスコールを発行可能です。なお,カーネル管理外割り込みハンドラでは,サービス・コールを呼び出してはなりません。
RI600PXでは,割り込みハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。
カーネル管理割り込みハンドラでは,“発行有効範囲”が“非タスク”のサービスコールを発行可能です。なお,カーネル管理外割り込みハンドラでは,サービス・コールを呼び出してはなりません。
備考 RI600PXでは,カーネル管理割り込みハンドラ内の処理を高速に終了させる目的から,カーネル管理割り込みハンドラ内の処理が完了するまでの間,スケジューラの起動を遅延しています。したがって,カーネル管理割り込みハンドラ内でディスパッチ処理(タスクのスケジューリング処理)を伴うサービス・コール(isig_sem,iset_flgなど)が発行された際には,キュー操作などといった処理が行われるだけであり,実際のディスパッチ処理の実行はカーネル管理割り込みハンドラが終了するまで遅延され,一括して行うようにしています。
割り込みハンドラの静的登録とは,システム・コンフィギュレーション・ファイルで静的API“interrupt_vector[]”(可変ベクタ割り込みハンドラの登録),および“interrupt_fvector[]”(固定ベクタ/例外ベクタ割り込みハンドラの登録)を使用して割り込みハンドラを定義することをいいます。
静的API“interrupt_vector[]”の詳細は,「20.21 可変ベクタ情報(interrupt_vector[])」を,静的API“interrupt_fvector[]”の詳細は,「20.22 固定ベクタ/例外ベクタ情報(interrupt_fvector[])」を参照してください。