[ARM奮闘記 割り込み]

割り込み(例外)が発生すると、割り込みベクタへジャンプしてきます。
割り込みベクタに書かれているアドレスへジャンプするわけではなく、割り込みベクタへジャンプしてきます。

割り込みベクタは次のモノがあります。

例外 アドレス モード
リセット 0x00000000 SVC
未定義命令 0x00000004 UND
ソフトウェア割り込み 0x00000008 SVC
プリフェッチ・アボート 0x0000000C ABORT
データ・アボート 0x00000010 ABORT
IRQ(通常割り込み) 0x00000018 IRQ
FIQ(高速割り込み) 0x0000001C FIQ

REMAPしてあれば、このベクタの内容を書き換えられるので、割り込み処理ルーチンへ
ジャンプするコードを書き込むことで割り込み処理を実現できます。
ROMであれば、あらかじめ適切な場所へジャンプするコードを書き込んでおくことで割
り込み処理を実現できます。

割り込みに入ると ARM の動作モードが切り替わる場合があります。動作モードは CPSRレジスタ
の bit4〜bit0 の 5bit で示されています。

CPSRレジスタ bit4〜bit0
CPSR(4 downto 0) 意味
10000 一般のアプリケーション
10001 FIQ割り込み処理中(FIQ)
10010 IRQ割り込み処理中(IRQ)
10011 ソフトウェア割り込み処理中(SVC)
10111 メモリ・フォールト処理中(ABORT)
11011 未定義命令割り込み処理中(UND)
11111 OS等のシステム処理中

ベクタエリアは、各割り込みごとに 4byte ずつ用意されていますので、24bit相対ジャンプ命令(B label)
を書いておけば十分です。24bit相対ジャンプは、アドレス的には 26bit(LSB 2bit は0)の範囲を移動
できるので、±32MB の範囲が指定できます。
ARMボードの RAM/ROM は 0x100000以降/0x400000以降 に配置されているので、十分範囲内です。

割り込み禁止/解除は、CPSR レジスタの bit6(FIQ), bit7(FIQ以外) で制御します。このビットは負論理なことに
注意してください。1 にすると割り込み禁止、0 にすると割り込み許可となります。

割り込み禁止/許可を C 言語から操作するためのモジュール Cpu.s/Cpu.h を用意しました。ArmDevに添付しています。

ArmDev


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