教材:嵌入式系統及應用,羅蕾、李允、陳麗蓉等,電子工業出版社
目錄:
-
- 中斷與異常
- 定義
- 外部中斷外部中斷
- 軟體中斷自陷
- 異常
- 異常向量表
- 具體内容
- ARM 引起的異常事件類型
- 異常響應過程
- Reset 異常
- 未定義指令異常
- 軟體中斷異常
- 指令預取異常
- 資料中止異常
- IRQ
- FIQ
- 異常傳回
- 異常優先級
- 異常進行中的寄存器使用
- 中斷處理
- 定義
- 中斷與異常
中斷與異常
定義
ARM 中的工作模式除 User 和 System 外,均為異常模式,這裡的異常是廣義的,包含以下三類情況
外部中斷(外部中斷)
由于 CPU 外部的原因而改變程式執行流程,屬于異步事件,可以屏蔽
軟體中斷(自陷)
- 通過處理器擁有的軟體指令,可預期地使正在執行的程式改變執行流程,以執行特定的程式
- 顯式的事件,無條件執行
- 屬同步事件,且不可屏蔽
- 例如 Motorola 68000 系列的 Trap 指令、ARM 中的 SWI、Intel 8086 中的 INT
異常
- 由 CPU 内部的原因(如非法指令)或外部的原因(如訪存錯誤)引起的事件
- 沒有對應的處理器指令
- 異常發生時,處理器無條件地挂起目前運作的程式,去執行特定的處理程式
- 屬同步事件,且不可屏蔽
ARM 處理器把上述三種事件以異常模式來處理,通過異常向量來響應。ARM 的每個異常向量中存放的是一條指令(一般是跳轉指令),異常發生時,CPU 自動到指定的向量位址讀取該指令并執行。
異常向量表
- ARM 的異常向量一般是完成程式跳轉的指令
- 在 ARM720T,ARM9 系列及以後的核心中,異常向量表可放置在 0xFFFF0000 開始的高位位址空間
具體内容
- 如果異常處理程式的起始位址位于 32MB 的範圍内,可以直接用分支指令完成跳轉
- 如果異常處理程式的起始位址是一個合法的 ARM 指令立即數(可由0~255内的數循環右移偶數位得到),則可以用資料傳輸指令将該位址加載到 PC 中
- 其他情況需采用 LDR 指令完成對 PC 的加載
ARM 引起的異常事件類型
異常響應過程
- 當一個異常産生,處理器核會
- 把 CPSR 的内容拷貝到對應模式下的 SPSR_< mode> 寄存器中
- 設定 CPSR 的相關位(改變到ARM态、改變到異常模式 、關閉中斷(如果适合))
- 把傳回位址儲存在對應模式下的 LR_< mode> 寄存器中
- 把 PC 撥到異常向量表位址
- 從異常傳回,異常處理程式需要
- 從 SPSR_< mode> 恢複 CPSR
- 把 PC 撥到 LR_< mode> 指向的位址(傳回位址加載到 PC)
- 以上隻能在 ARM 狀态完成
Reset 異常
- Reset 被觸發時,CPU 進入 Supervisor 模式并禁止 FIQ 和 IRQ
-
R14_svc = 不确定的值 SPSR_svc = CPSR CPSR[4:0] = 0b10011 ;進入管理模式 CPSR[5] = 0 ;在ARM态中執行 CPSR[6] = 1 ;禁止快速中斷FIQ CPSR[7] = 1 ;禁止普通中斷IRQ
未定義指令異常
- 觸發該異常,有兩種情形
- CPU 執行一條協處理器指令,未等到任何協處理器的應答
- CPU 執行一條未被定義的指令時
- 一旦發生該異常,CPU 将完成如下動作
R14_und = 未定義指令的下一條指令位址 SPSR_und = CPSR CPSR[4:0] = 0b11011 ;進入未定義模式 CPSR[5] = 0 ;在ARM态中執行 CPSR[7] = 1 ;禁止普通中斷IRQ
- 常用的異常傳回方式
MOVS PC, R14 ;跳過發生異常的指令 SUBS PC, R14, #4 ;重新執行發生異常的指令
軟體中斷異常
- 執行 SWI 指令時觸發,主要用于進入 OS 的系統調用
-
R14_svc = SWI指令的下一條指令位址 SPSR_svc = CPSR CPSR[4:0] = 0b10011 ;進入管理模式 CPSR[5] = 0 ;在ARM态中執行 CPSR[7] = 1 ;禁止普通中斷IRQ
- 常用的異常傳回方式:
MOVS PC, R14
指令預取異常
- 讀取指令時發生讀記憶體錯誤時被标記為中止,該指令還要執行時觸發該異常,若未執行,不觸發該異常
- 即 CPU 試圖執行已被标記為無效的指令時,觸發該異常
-
R14_abt = 中止指令的下一條指令位址 SPSR_abt = CPSR CPSR[4:0] = 0b10111 ;進入中止模式 CPSR[5] = 0 ;在ARM态中執行 CPSR[7] = 1 ;禁止普通中斷IRQ
- 常用的異常傳回方式:
SUBS PC, R14, #4
資料中止異常
- CPU 和存儲系統之間進行加載/存儲資料操作時,若發生錯誤則觸發該異常,分為兩種情況
-
内部中止異常
由CPU核心自己引起,如 MMU/MPU 錯誤,意味着需要采取正确的措施并重新執行合适的指令
-
外部中止異常
由存儲系統引起,可能是硬體錯誤,可能是記憶體位址不存在
-
-
R14_abt = 中止指令的下一條指令位址 SPSR_abt = CPSR CPSR[4:0] = 0b10111 ;進入中止模式 CPSR[5] = 0 ;在ARM态中執行 CPSR[7] = 1 ;禁止普通中斷IRQ
- 常用的異常傳回方式
SUBS PC, R14, #4 ;跳過發生異常的指令 SUBS PC, R14, #8 ;傳回到發生異常的指令
IRQ
- 當外部IRQ輸入請求發生并且IRQ中斷響應已經被使能,觸發該異常
-
R14_irq = 下一條指令位址 SPSR_irq = CPSR CPSR[4:0] = 0b10010 ;進入IRQ模式 CPSR[5] = 0 ;在ARM态中執行 CPSR[7] = 1 ;禁止普通中斷IRQ
- 常用的異常傳回方式:
SUBS PC, R14, #4
FIQ
- 當外部 FIQ 輸入請求發生并且 FIQ 中斷響應已經被使能,觸發該異常
- 通常用于快速傳輸資料
-
R14_fiq = 下一條指令位址 SPSR_fiq = CPSR CPSR[4:0] = 0b10001 ;進入FIQ模式 CPSR[5] = 0 ;在ARM态中執行 CPSR[6] = 1 ;禁止快速中斷FIQ CPSR[7] = 1 ;禁止普通中斷IRQ
- 常用的異常傳回方式:
SUBS PC, R14, #4
異常傳回
- 除複位異常外,其他異常在處理完成後都可以傳回異常發生時被打斷的程式中繼續執行
- 通常在異常處理程式的最後使用一條資料傳輸指令來完成
- 在異常模式下,在指令後加字尾 ’ S ’ ,将 PC 作為目标寄存器,這樣不僅将更新 PC 的值,還會将 SPSR 寄存器的内容加載到 CPSR 中
- 校正傳回位址的一大原因是 ARM 處理器的流水線
- 計算傳回位址的注意點
- 發生異常時 PC 的值是否已經更新
- 異常傳回後被中斷的指令是否還需要執行
-
LR = PC - 4
異常優先級
- 異常被賦以了優先級,據此決定被響應的順序
- 在所有異常的入口,IRQ 中斷被屏蔽,隻有重新被使能才可觸發核心響應(如中斷嵌套處理)
- 在 FIQ 和 Reset 異常的入口,FIQ 中斷被屏蔽
異常進行中的寄存器使用
- 異常發生時伴随的模式切換意味着, 被調用的異常處理程式會通路
- 它自己的堆棧指針 (SP_)
- 它自己的連結寄存器 (LR_)
- 它自己的備份程式狀态寄存器 (SPSR_)
- 如果是 FIQ異常處理,5個其它的通用狀态寄存器 (r8_FIQ to r12_FIQ)
- 其它寄存器和原來模式下的寄存器是相同的
- 在外部接口上,堆棧指針(SP_) 必須保持8位元組對齊
- 異常處理程式在傳回前必須保證其它(被破壞的寄存器) 被重新載入,以恢複到異常發生前的狀态
- 這可以通過将工作(即被破壞)寄存器的内容壓棧,而在傳回前出棧恢複來完成
- 應用的初始化代碼将執行必要的寄存器初始化工作
中斷處理
- ARM 可響應兩個外部中斷請求信号,FIQ 和 IRQ
- FIQ 中斷比 IRQ 中斷的優先級更高
- 當多個中斷發生時,首先處理 FIQ
- 在響應 FIQ 中斷時屏蔽 IRQ 中斷(和 FIQ中斷),直到 FIQ 中斷處理程式完成,IRQ 中斷才會被處理
- 以下設計使得 IFQ 盡快的響應
- FIQ 向量在異常向量表的最後,使 FIQ 處理程式可以直接從 FIQ 向量開始,省去跳轉的時間
- FIQ 模式下有五個額外的寄存器 (R8_FIQ to R12_FIQ),這些寄存器在進入和退出 FIQ 時不需儲存和恢複
- FIQ 中斷在 FIQ 中斷處理程式的入口是被屏蔽的,需要重新使能(FIQ 中斷源可以有多個,但是為了最好的系統性能應該避免 FIQ 中斷的嵌套)
- 絕大多數基于 ARM 的系統有兩個以上的中斷源,是以需要一個中斷控制器 (通常是記憶體映射編址))來控制中斷信号如何進入 ARM 晶片