[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
|
[前へ][▲上へ][次へ]