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