【レジスタの退避、復旧】
割り込み処理で必要なレジスタ退避と復旧は、割り込みハンドラと
して関数を定義すれば自動的に行われます。
また割り込みレベルが7の場合には、シャドーレジスタを使って
レジスタ退避、復旧が行われますので高速となります。
【割り込みハンドラの生成】
関数を割り込みハンドラとするための、アトリビュートとPragmaが
用意されています。
《基本の記述》
@ 複数ベクタ割り込みの場合
#pragma interrupt function-name iplx [vector [@]number [ ,number-list]]
function-name:割り込みハンドラとする関数名
x:割り込みレベル(0〜7) (ipl記述はiplかIPL)
A 単一ベクタ割り込みの場合
#pragma interrupt function-name single [vector [@]0]
《記述例》
#pragma interrupt foo ipl4 vector @54, 34
fooという関数を割り込みレベル4で、割り込みベクタ54と34の
割り込みハンドラとする。 @がある場合には、foo関数を割り込み
ベクタ54の領域に直接配置する。ベクタ34にはディスパッチ命令のみ
#pragma interrupt bar ipl5 vector 23
barという関数を割り込みレベル5で、割り込みベクタ23の
割り込みハンドラとする。bar関数は、汎用のプログラム領域に
配置する
【マクロを使った記述】
割り込み処理ハンドラの作成には__ISRというマクロが用意されて
いますからこれで作成すると簡単です。
《基本の記述形式》
void __ISR(vector, iplx) XXXName(void){
ハンドラの処理
mXXXClearIntFlag();
}
この記述で、XXXの割り込みハンドラをXXXnameという名称の
関数で生成し、ベクタ番号はvector、割り込みレベルはxとする
ベクタにはハンドラへのジャンプ命令を自動で配置する。
ClearIntFlagで割り込み要因XXXの割り込みフラグビットをクリアする。
《記述例》
void __ISR(7, ipl3) INT1Handler(void) {
−−−−−−
mINT1ClearIntFlag();
}
ここでINT1などの割り込み要因の名称XXXと割り込みベクタ番号はあらかじめ
決まっていて、下表のようになっています。
【XXXの名称】(最初の-より前の文字列) 【ベクタ番号】