割り込みハンドラー、通常のサブルーチン呼び出しとは別の方法でコンパイルされます。割り込みハンドラーでは、不揮発性レジスタだけでなく、使用されている揮発性レジスタも保存する必要があります。また、割り込みが発生した際に、マシン ステータス レジスタ (RMSR) の値も保存する必要があります。
-
interrupt_handler
- サブルーチンと割り込みハンドラーを区別するため、
mb-gcc
はコードの宣言部にinterrupt_handler
属性があるかどうかをチェックします。この属性は、次のように定義されています。void function_name () __attribute__ ((interrupt_handler));
注記: 割り込みハンドラーの属性は、プロトタイプ内でのみ指定し、定義には含めません。割り込みハンドラーは、揮発性レジスタを使用するほかの関数を呼び出すこともあります。揮発性レジスタで正しい値を保持するため、ハンドラーが非リーフ関数である場合は、すべての揮発性レジスタが保存されます。
注記: 非リーフ関数とは、ほかのサブルーチンを呼び出す関数のことです。割り込みハンドラーは、MSS (Microprocessor Software Specification) ファイルで定義されます。これらの定義により、割り込みハンドラー関数に属性が自動的に追加されます。割り込みハンドラーは
rtid
命令を使用して、割り込みで中断された関数に戻ります。 -
save_volatiles
-
MicroBlaze コンパイラは
save_volatiles
属性を提供しています。この属性はinterrupt_handler
属性に似ていますが、rtid
の代わりにrtsd
を使用して返されます。この属性を使用すると、非リーフ関数の場合はすべての揮発性レジスタが保存され、リーフ関数の場合は使用されている揮発性レジスタのみが保存されます。void function_name () __attribute__((save_volatiles));
-
fast_interrupt
-
MicroBlaze コンパイラには、interrupt_handler 属性に類似した
fast_interrupt
という属性があります。高速割り込みがあると、MicroBlaze は、固定アドレス 0x10 に飛ぶのではなく、割り込みルーチン アドレスに飛びます。標準割り込みとは異なり、
fast_interrupt
属性が C 関数で使用される場合は、MicroBlaze は最小限のレジスタしか保存しません。void function_name () __attribute__ ((fast_interrupt));
属性 | 関数 |
---|---|
interrupt_handler | マシン ステータス レジスタ、不揮発性レジスタ、およびすべての揮発性レジスタを保存します。rtid は、割り込みハンドラーから返されます。割り込みハンドラー関数がリーフ関数の場合は、関数で使用された揮発性レジスタのみが保存されます。 |
save_volatiles | interrupt_handler と似ていますが、割り込みから戻るのに rtid ではなく rtsd が使用されます。 |
fast_interrupt | interrupt_handler と似ていますが、固定アドレス 0x10 に飛ぶのではなく、割り込みルーチン アドレスに直接飛びます。 |