ソフトウェア割り込みハンドラ(#pragma interrupt_brk)
|
ソフトウェア割り込みに対応したオブジェクト・コードを出力します。
[機能]
- | 対象の関数定義をソフトウェア割り込みハンドラとして,RETBによる復帰コードが生成されます。 |
- | 割り込みハンドラ定義は通常関数同様に,.textセクションに出力されます。セクション名は,#pragma sectionにより変更可能です。
ただし,割り込みハンドラの先頭アドレスは16ビットでアドレッシングできなければなりません。 |
- | 明示的,暗黙問わず__farを指定しても強制的に__near指定となります。
警告は出力しません。 |
[効果]
- | Cソース・レベルで割り込みハンドラの記述が可能となります。 |
[方法]
- | #pragma指令に関数名,割り込み仕様を指定します。 |
#pragma interrupt_brk [(]割り込みハンドラ名[(割り込み仕様 [,...])][)]
|
割り込み仕様には,以下のものを指定できます。
|
|
|
レジスタ・バンク指定
|
bank={RB0|RB1|RB2|RB3}
|
割り込みハンドラ内で使用するレジスタ・バンク。注1
割込みハンドラの実行に指定のバンク中のレジスタを使います。
ESとCSはスタックに退避します。
汎用レジスタの退避および復帰をレジスタ・バンクを切り替えるSEL命令で実現するため,コードサイズを小さくすることができます。
本指定を省略した場合,汎用レジスタはスタックに退避します。注2
|
多重割り込み許可指定
|
enable={true|false}
|
true: 関数入口での多重割り込みを可能とします。
つまり,コンパイラが生成する割り込みハンドラの先頭にEIを生成します。
false: EIを生成しません。enableを省略した場合は,EIを生成しません。
|
注 1. | 割り込みハンドラを呼び出す前に使用しているレジスタ・バンクとは,異なるレジスタ・バンクを指定してください。同じレジスタ・バンクが指定された場合には,退避したレジスタの内容を復帰できなくなります。 |
同一の項目を,同時に複数回書く場合はコンパイル・エラーとなります。
#pragma interrupt_brk func(bank=RB0, bank=RB1) // エラー
|
本#pragmaはベクタテーブルを生成します。このため,スタートアップ・ルーチンなどにアセンブリ言語のセクション定義疑似命令でベクタテーブルを定義していると,リンク時にエラーとなります。
アセンブリ言語でもベクタテーブルを記述するには,セクション定義疑似命令ではなく.VECTOR疑似命令で記述してください。
[制限]
- | 割り込みハンドラを通常関数のように呼び出すと,コンパイル・エラーとなります。 |
- | __inline,__callt,および他の#pragma を指定すると,コンパイル・エラーとなります。 |
- | 割り込みハンドラは,引数,戻り型ともにvoid型で宣言しなければなりません(例:void func (void);)。
void型でない場合はコンパイル・エラーとなります。 |
- | 割り込みハンドラ中にレジスタ利用や関数呼び出しがない場合,#pragma interruptでレジスタ・バンク切り替え指定をしてもレジスタ・バンク切り替え命令は出力しません。 |
[使用例]
割り込み要因がBRKであり,復帰コードにRETBを使うことを除けば,出力プログラムは#pragma interruptと同じとします。
よって,割り込みハンドラ中に関数呼び出しがない場合の使用例を示します。
【入力プログラム】
#pragma interrupt_brk inter
void __near inter ( void ) {
/*割り込み処理(AX,HL,ESのみ使用)*/
}
|
【出力プログラム】
_inter .vector 0x007E ;BRK
.SECTION .text, TEXT
_inter:
push AX ;使用する汎用レジスタの,スタックへの退避コード
push HL
mov A, ES
push AX
;BRK命令に対する割り込み処理(関数本体。AX,HL,ESのみ使用)
pop AX ;使用する汎用レジスタの,スタックからの復帰コード
mov ES, A
pop HL
pop AX
retb
|