割り込みハンドラ
昨日「割り込みハンドラを作るためのプラグマがある」と書きました。そのプラグマが#pragma interruptです。
#pragma interrupt void func( void ) { }
上のように関数の前にinterruptプラグマを置くと、直後の関数は割り込みハンドラとしてコンパイルされます。割り込みハンドラは頭でコンテキストを退避した後、終了時にrtiを実行します。さて、コンパイル結果を見てみましょう。
[ -- SP ] = ASTAT ; [ -- SP ] = FP ; [ -- SP ] = ( R7:0 , P5:0 ) ; SP += -64 ; SP += -52 ; JUMP.S 2 /*0xFFA0075C*/ ; SP += 60 ; SP += 56 ; ( R7:0 , P5:0 ) = [ SP ++ ] ; FP = [ SP ++ ] ; ASTAT = [ SP ++ ] ; RTI ;
rtiのほかにもastatの退避と復帰をおこなうところが割り込みハンドラならではです。内部でi0などを使う場合は対応するLxが自動的に退避されて0初期化されます。