AUTOVECTORの割込ハンドラ・アドレス

AVR32のINTC(Interrupt Controller)の続き。

固定ハンドラ・アドレスやEVBAで指し示す例外ハンドラ・テーブルを除き、その他の割込はINTCのIRPレジスタに格納されたAUTOVECTORから計算される。

AUTOVECTORから割込ハンドラへのアドレスは

EVBA | event_handler_offset

となる。event_handler_offsetはAUTOVECTORのことで、これは14bit(0〜16,383byte)の範囲しかない。このアドレスは、割込ハンドラ・テーブルではなく、ハンドラそのものの開始アドレスであることに注意が必要だ。最も遠くに配置するハンドラはともかく、それより近いハンドラはコンパクトに記述する必要がある。「割込グループから割込要因毎の処理へジャンプするなら、そんなに大きくならないでしょ」という開発者の意図かもしれない。
ハードウェアを簡潔にするためと思われるが、符号付き加算ではなく、論理和演算なので、EVBAが指す割込ハンドラ・テーブルと重なる可能性がある点も要注意だ。EVBAは4バイト・アライメントに乗っていればよいはずなので、極端な話EVBA=0x8000FFFCなどとすると、INT3〜0の割込ハンドラ本体がEVBAの指す割込ハンドラ・テーブルと重複する(リンク・エラーで気づく)。割込ハンドラ・テーブルとINT3〜0の割込ハンドラ本体を同一セクションに定義すると重複することは無いが、割込ハンドラが14bit範囲から外れる可能性がある(何らかのチェックが必要)。

安全を考えれば、割込ハンドラ・テーブルとINT3〜0の割込ハンドラのみ同一セクションに入れる。そして、4つの割込ハンドラの開始アドレスがセクション先頭アドレス | 0x3FFFより小さいことをリンク時に確認すればよい。
さて、そんなチェック、簡単にできるのかな?