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