1.
首先就是知道
ARM
狀態下的通用寄存器和程式計數器,綠顏色的就是相應模式下的私人寄存器。
就是說程式一般運行在系統和使用者模式下,使用的是系統和使用者模式下的通用寄存器,當有異常發生時,比如
FIQ
,那麼系統將切換到
FIQ
模式下,相應的就會採用
FIQ
模式下的寄存器,其中綠顏色的就是只在
FIQ
模式下才會用到的寄存器。
2.
在模式切換的過程中,要保護系統和使用者模式下的通用寄存器狀態,以便在異常處理完成之後程式能正常返回。因為
FIQ
模式下
R8-R14
為其私人寄存器,所以切換的過程中,系統和使用者模式下的通用寄存器的
R8-R14
就不用保護了,所以減少了對寄存器存取的需要,從而可以快速的進行
FIQ
處理,故稱為
FIQ
。
3.
異常處理的動作
。當然這都是核心自己乾的。以
FIQ
為例。
當系統進入
FIQ
模式時
,
第一,將原來執行程式的下一條指令地址儲存到
LR
中,就是將
R14
儲存到
R14_fiq
裡面。
第二,拷貝
CPSR
到
SPSR_fiq
。
第三,改變
CPSR
模式位的值,改到
FIQ
模式。
第四,改變
PC
值,將其指向異常處理向量所指的下一條指令。
離開異常處理的時候
,
第一,將
LR
(
R14_fiq
)賦給
PC
。
第二,將
SPSR
(
SPSR_fiq
)拷貝到
CPSR
。
第三,清除中斷禁止標誌(如果開始時置位了)。
4
.異常中斷向量
異常中斷的向量地址
地址
異常中斷類型
入口時處理器的操作模式
0x00000000
複位
超級使用者
0x00000004
未定義指令
未定義
0x00000008
軟體中斷
超級使用者
0x0000000c
中止(預取指)
中止
0x00000010
中止(資料)
中止
0x00000014
保留
保留
0x00000018 I
RQ IRQ
0x0000001c FIQ
FIQ
異常中斷優先順序
中斷
優先順序
複位
最高
資料異常
FIQ
IRQ
預取指異常中斷
未定義指令和軟體中斷
最低
5
.當發生
IRQ
中斷時
第一
,模式進入到
IRQ
裡面。
第二
,
PC
跳到
0x00000018
處運行。因為這是
IRQ
的中斷入口。
第三
,
通過
0x00000018
:
LDR
PC, IRQ_ADDR
。跳轉到相應的中斷服務程式。這個裡面就有個確定哪個中斷源的問題了。那就有優先順序的問題了。每個中斷源會有自己的中斷服務程式。
第四
,得到中斷源有硬體實現和軟體處理兩種方式。比如
LPC21XX
的就是利用硬體方式,為了利用向量中斷控制器的優點,
IRQ
中斷向量入口處代碼做了修改,變成
0x00000018
:
LDR
PC, [PC, #-0xff0]
。
這條指令從記憶體映射地址
0xfffff030
處獲得資料裝載到
PC
,這樣就能夠直接從硬體中獲得中斷源。這樣就減少了中斷延遲
。記得,三星的
S3C44B0
好象採用的是用軟體確定中斷源,因此要建立中斷向量表。好久不用了,記不清了。
第五
,得到中斷源,就知道要跳到哪個中斷服務程式去了。
一般都是這麼定義的。
Timer0_Handler
HANDLER
Timer0
。這種格式是調用一種宏定義,目的是保護現場,跳到中斷服務程式。