適用先: RealView C コンパイラ
この記事に含まれている情報の適用先:
RealView-MDK の全バージョン
質問
STMicroelectronics 社の STR7 シリーズ マイクロコントローラの割り込みの処理方法を教えてください。
回答
STR7xx デバイスにおける IRQ 例外の処理例として、 直接ベクタ法とテーブル法の 2 つが用意されています。
直接ベクタ法
STR7 割り込みコントローラは、16+16 ビット(ベース:オフセット)を使用して割り込みベクタ アドレスを格納しています。すべての割り込みベクタが、同一の 16 ビット ベース アドレスを、割り込みベクタの上位 16 ビットとして使用します。この方法の長所は、高速であることです。短所は、すべての割り込みベクタが、メモリ上の 1 つの 64KB ブロック内に存在するコードを参照する必要があることです。各ベクタが直接ハンドラ コードを参照する場合は、各ハンドラがその 64KB の空間内に存在する必要があります。
テーブル法
もう 1 つの方法は、プログラムで IRQ ハンドラを 1 つだけ宣言しておき、このルーチンをディスパッチャとして使用して、割り込み元ごとに異なるハンドラ関数を呼び出します。この方法の長所は、ディスパッチャとハンドラ関数がメモリのどこに存在してもかまわないことです。短所は、ディスパッチャによってオーバーヘッド層が 1 つプログラムに追加されるために、割り込みレイテンシが長くなることです。
それぞれの方法の例については、RealView-MDK インストール フォルダにある以下のサンプル プログラムを参照してください。
- ARMRV30BoardsSTSTR710Blinky(直接法)
- ARMRV30BoardsSTSTR710ST_blinky(テーブル法)
ST_Blinky の例では、ファイル 71x_it.c にハンドラ テーブルが記述されています。 割り込み元ごとにテーブルに 1 つのエントリがあります。以下に有効なエントリの例を示します。
extern void TimeTick (void);
extern void TimeTick (void);
void T3TIMI_IRQHandler(void) {
TimeTick();
TIM_FlagClear(TIM3, TIM_TO_IT);
}
無効なエントリにはスタブ関数のみが含まれます。
関連項目
- ARM: HOW TO LOCATE INTERRUPT SERVICE ROUTINES FOR STR71X