第10章 割り込み管理機能
RI850V4では,さまざまな実行環境に対応するために,割り込み管理機能のうち,RI850V4が処理を実行するうえで必要となるハードウエア依存処理(割り込みエントリ処理)をユーザ・オウン・コーディング部として切り出しています。
割り込みエントリ処理は,割り込みが発生した際にCPUが強制的に制御を移すハンドラ・アドレスに対して該当処理(割り込み前処理など)への分岐処理を割り付けるためにユーザ・オウン・コーディング部として切り出されたエントリ処理専用ルーチンです。
なお,システム・コンフィギュレーション・ファイル作成時に割り込みハンドラ情報で定義されたEIレベル・マスカブル割り込みに対応した割り込みエントリ処理は,システム・コンフィギュレーション・ファイルに対してコンフィギュレータを実行することにより出力されるエントリ・ファイルに内包されています。したがって,該当EIレベル・マスカブル割り込み以外の割り込み(リセットなど)については,割り込みエントリ処理の記述が必要となります。
- 割り込みエントリ処理の基本型
割り込みエントリ処理を記述する場合,プロパティ パネル → [システム・コンフィギュレーション・ファイル関連情報]タブ → [エントリ・ファイル]カテゴリ → [出力方式]で選択した分岐方式にしたがった記述を行う必要があります。
以下に,システム・コンフィギュレーション・ファイル作成時に割り込みハンドラ情報で定義されたEIレベル・マスカブル割り込み以外の割り込み(割り込みハンドラ情報で未定義のEIレベル・マスカブル割り込み,リセット,FEレベル・マスカブル割り込みなど)に対応した割り込みエントリ処理をアセンブリ言語で記述する場合の基本型を示します。
なお,割り込みの種類がEIレベル・マスカブル割り込み以外の場合,割り込みエントリ処理の記述は,直接ベクタ方式に限られます。
割り込みエントリ処理を記述する場合,プロパティ パネル → [システム・コンフィギュレーション・ファイル関連情報]タブ → [エントリ・ファイル]カテゴリ → [出力方式]で選択した分岐方式にしたがった記述を行う必要があります。
以下に,システム・コンフィギュレーション・ファイル作成時に割り込みハンドラ情報で定義されたEIレベル・マスカブル割り込み以外の割り込み(割り込みハンドラ情報で未定義のEIレベル・マスカブル割り込み,リセット,FEレベル・マスカブル割り込みなど)に対応した割り込みエントリ処理をアセンブリ言語で記述する場合の基本型を示します。
なお,割り込みの種類がEIレベル・マスカブル割り込み以外の場合,割り込みエントリ処理の記述は,直接ベクタ方式に限られます。
備考 base_addressには,プロパティ パネル → [システム・コンフィギュレーション・ファイル関連情報]タブ → [エントリ・ファイル]カテゴリ → [例外ハンドラ・ベクタ・アドレス]で指定した値を記述します。
また,offsetには,該当割り込みの割り込み優先度に応じたオフセット値を記述します。
また,offsetには,該当割り込みの割り込み優先度に応じたオフセット値を記述します。
備考 base_addressには,プロパティ パネル → [システム・コンフィギュレーション・ファイル関連情報]タブ → [エントリ・ファイル]カテゴリ → [割り込みハンドラ・アドレス・テーブルのベース・アドレス]で指定した値を記述します。
また,offsetには,該当割り込みの割り込み要因に応じたオフセット値を記述します。
また,offsetには,該当割り込みの割り込み要因に応じたオフセット値を記述します。
- 割り込みエントリ処理内での処理
割り込みエントリ処理は,割り込みが発生した際にRI850V4を介在させることなく呼び出されるエントリ処理専用ルーチンです。このため,割り込みエントリ処理を記述する際には,以下に示す注意点があります。
割り込みエントリ処理は,割り込みが発生した際にRI850V4を介在させることなく呼び出されるエントリ処理専用ルーチンです。このため,割り込みエントリ処理を記述する際には,以下に示す注意点があります。
なお,RI850V4では,割り込みハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。このため,EIレベル・マスカブル割り込みが発生した際には,システム内で最高優先度を持つタスクが処理を実行中であっても,その処理は中断され,割り込みハンドラに制御が移ります。
また,RI850V4では,割り込みハンドラを管理するに当たり,割り込みハンドラと一対一に対応した管理オブジェクト(割り込みハンドラ管理ブロック)を用いることにより,割り込みハンドラ自体の管理を行っています。
#include <kernel.h> /*標準ヘッダ・ファイルの定義*/ #include <kernel_id.h> /*システム情報ヘッダ・ファイルの定義*/ void inthdr ( void ) { ............ ............ return; /*割り込みハンドラの終了*/ } |
RI850V4では,EIレベル・マスカブル割り込みが発生した処理プログラムから割り込みハンドラに制御を移す際,独自の割り込み前処理を行っています。また,割り込みハンドラからEIレベル・マスカブル割り込みが発生した処理プログラムに制御を戻す際にも,独自の割り込み後処理を行っています。このため,割り込みハンドラを記述する際には,以下に示す注意点があります。
- 記述方法
C言語,またはアセンブリ言語で記述します。
C言語で記述するときは通常の関数と同様に記述することができます。
アセンブリ言語で記述するときは使用するコンパイラの呼び出し規約にのっとって作成してください。
C言語,またはアセンブリ言語で記述します。
C言語で記述するときは通常の関数と同様に記述することができます。
アセンブリ言語で記述するときは使用するコンパイラの呼び出し規約にのっとって作成してください。
- スタックの切り替え
RI850V4では,割り込みハンドラに制御を移す際,基本情報において指定されたシステム・スタックへの切り替え処理を,EIレベル・マスカブル割り込みが発生した処理プログラムに制御を戻す際に該当スタックへの切り替え処理を行っています。したがって,割り込みハンドラ内でスタックの切り替えに関する記述を行う必要がありません。
RI850V4では,割り込みハンドラに制御を移す際,基本情報において指定されたシステム・スタックへの切り替え処理を,EIレベル・マスカブル割り込みが発生した処理プログラムに制御を戻す際に該当スタックへの切り替え処理を行っています。したがって,割り込みハンドラ内でスタックの切り替えに関する記述を行う必要がありません。
- サービス・コールの発行
RI850V4では,割り込みハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。このため,割り込みハンドラでは,“非タスク内から発行可能なサービス・コール”のみが発行可能となります。
RI850V4では,割り込みハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。このため,割り込みハンドラでは,“非タスク内から発行可能なサービス・コール”のみが発行可能となります。
備考1 RI850V4では,割り込みハンドラ内の処理を高速に終了させる目的から,割り込みハンドラ内の処理が完了するまでの間,スケジューラの起動を遅延しています。したがって,割り込みハンドラ内でディスパッチ処理(タスクのスケジューリング処理)を伴うサービス・コール(isig_sem,iset_flgなど)が発行された際には,キュー操作などといった処理が行われるだけであり,実際のディスパッチ処理の実行は“割り込みハンドラからの復帰命令(return命令の発行)”が発行されるまで遅延され,一括して行うようにしています。
- EIレベル・マスカブル割り込みの受け付け状態
RI850V4では,割り込みハンドラに制御を移す際,プライオリティ・マスク・レジスタPMRのPMnビットに対する操作(許可),およびプログラム・ステータス・ワードPSWのIDビットに対する操作(禁止)を行い,全EIレベル・マスカブル割り込みの受け付けを禁止しています。
RI850V4では,割り込みハンドラに制御を移す際,プライオリティ・マスク・レジスタPMRのPMnビットに対する操作(許可),およびプログラム・ステータス・ワードPSWのIDビットに対する操作(禁止)を行い,全EIレベル・マスカブル割り込みの受け付けを禁止しています。
したがって,基本クロック用タイマ割り込みが発生した際には,RI850V4が提供している時間管理用割り込みハンドラが起動し,時間に関連した処理(システム時刻の更新,タスクの遅延起床/タイムアウト,周期ハンドラの起動など)が実行されます。