[ARM奮闘記 Advanced Interrupt Controller]

AT91R400807 には割り込みコントローラが内蔵されています。
Advanced Interrupt Controller (AIC) と呼ばれるそれは、いろいろな割り込み要因から
適切な割り込み処理ルーチンアドレスを教えてくれる仕組みを持っています。

割り込み処理ルーチン

割り込み処理に対応する処理ルーチンをあらかじめ登録します。

割り込み要因のクリア

割り込みコントローラは、割り込み要求パルスを入力すると、それが処理されたと教えられるまで
パルスが発生したことを覚えています。CPU は、この覚えている方を調べて割り込みを発生させます。
割り込み禁止中に割り込み要求が発生しても、割り込み禁止解除直後にその割り込み処理ルーチンへ
ジャンプするのは、その仕組みのおかげです。これによって同時に発生するかもしれない複数の割り込み
を順番に処理できます。
割り込み処理ルーチンは、処理が終わったこと(同じ割り込みが再度入っても良いこと)を、AICへ
通知することにより、AICは割り込み要求を取り下げます。これを忘れると、割り込み禁止解除した瞬間
再度同じ割り込みが入って無限ループに陥ってしまいます。
この通知のことを割り込み要因のクリアと呼ぶことにします。
このAIC で割り込み要因のクリアは、次のように実施します。

AIC_ICCR ← 要因に対応するビットを 1 にする

割り込み要因の許可

CPU の CPSR にも割り込み許可/禁止のフラグがありますが、あれは CPU 側の設定です。
それとは別に AIC 側でも割り込み許可/禁止が指定できます。CPU からみると IRQ 割り込みでしかない
外部割り込みは、実際には USART だったり TC だったりいろいろあるわけです。そのあたりの管理を
AIC が受け持っているので、AIC 側の割り込み許可/禁止設定は、これら個別に指定できます。

割り込み許可は次の設定

AIC_IECR ← 要因に対応するビットを 1 にする

割り込み禁止は次の設定

AIC_IDCR ← 要因に対応するビットを 1 にする

割り込みベクタ

割り込みに対応する割り込みベクタを 32本持っています。これは要因番号0〜31 に対応する 4byte の値で、
AIC_SVR0〜AIC_SVR31 に書き込みます。割り込み発生時に AIC_IVR や AIC_FVR レジスタに適切な値が現れます。
ARM の割り込みベクタに、AIC_IVR や AIC_FVR に書かれているアドレスへジャンプするコードを記述すれば
AIC の割り込みベクタには、割り込み処理ルーチンのアドレスを指定するだけで良く、設定も簡単です。

割り込み要因番号

AIC は 32本の割り込み要求を処理できますが、実際に接続されているのはその一部のみです。

割り込み要因番号 要因
0 FIQ
1 ソフトウェア割り込み
2 USART0
3 USART1
4 Timer0
5 Timer1
6 Timer2
7 WatchDogTimer
8 PIO割り込み
16 外部IRQ0
17 外部IRQ1
18 外部IRQ2

[前へ][▲上へ][次へ]