割り込みハンドラー - 2022.1 日本語

Vitis 統合ソフトウェア プラットフォームの資料: エンベデッド ソフトウェア開発 (UG1400)

Document ID
UG1400
Release Date
2022-04-26
Version
2022.1 日本語

割り込みハンドラー、通常のサブルーチン呼び出しとは別の方法でコンパイルされます。割り込みハンドラーでは、不揮発性レジスタだけでなく、使用されている揮発性レジスタも保存する必要があります。また、割り込みが発生した際に、マシン ステータス レジスタ (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));
表 1. 属性の使用法
属性 関数
interrupt_handler マシン ステータス レジスタ、不揮発性レジスタ、およびすべての揮発性レジスタを保存します。rtid は、割り込みハンドラーから返されます。割り込みハンドラー関数がリーフ関数の場合は、関数で使用された揮発性レジスタのみが保存されます。
save_volatiles interrupt_handler と似ていますが、割り込みから戻るのに rtid ではなく rtsd が使用されます。
fast_interrupt interrupt_handler と似ていますが、固定アドレス 0x10 に飛ぶのではなく、割り込みルーチン アドレスに直接飛びます。