【正文】
如圖 ,由于 ARM處理器的 5級流水線結構,當異常發(fā)生時,程序計數器 PC總是指向返回位臵的下一條指令即第 3條指令,也就是說異常處理程序的正確返回地址為 PC4,且在 PC8的地址處發(fā)生異常中斷服務程序跳轉,由此可見, R14(R14_irq或者 LR)保存的是指向第 3條指令的程序計數器PC(地址),即 “ 中斷返回地址 +4”。 當一個 IRQ異常中斷發(fā)生時 , 內核切換到中斷模式, 表明產生了中斷 。復位后,除 PC和 CPSR之外的所有寄存器的值都是隨機的。 當 nRESET信號再次變?yōu)楦唠娖綍r, ARM處理器執(zhí)行以下操作: ■ 強制 M[4 : 0]變?yōu)?b100011,系統(tǒng)進入管理模式; ■ 將 CPSR中的控制位 I和 F臵位, IRQ和 FIQ中斷禁止; ■ 將 CPSR中的控制位 T清零,處理器處于 ARM狀態(tài); ■ 強制 PC從地址 0x00開始對下一條指令進行取指; ■ 返回到 ARM狀態(tài)并恢復執(zhí)行。 注意: 恢復 CPSR的動作會將控制位 T、 F和 I自動恢復為異常發(fā)生前的值。 ? 異常中斷的進入與退出 ( 2) 注意: 異常總是在 ARM狀態(tài)中進行處理 , 當處理器處于 Thumb狀態(tài)時發(fā)生了異常 , 在異常向量地址裝入 PC時 , 會自動切換到 ARM狀態(tài) 。 ( 1) 進入異常 : 當一個異常導致模式切換時,內核自動地做如下處理: ■ 將當前 PC保存到相應異常模式下的 LR,異常處理程序完成后的返回可通過將 LR的值減去偏移量以得到異常處理程序返回地址,然后寫入 PC; ■ 將 CPSR的當前值保存到相應異常模式下的 SPSR,異常處理程序完成后的返回可通過保存在 SPSR中的值來恢復 CPSR; ■ 設臵 CPSR為相應的異常模式; ■ 設臵 PC為相應異常處理程序的中斷入口向量地址,跳轉到相應的異常中斷處理程序執(zhí)行。 當 FIQ服務完成之后 , 恢復執(zhí)行數據中止處理程序 。 表 異常優(yōu)先級 下面介紹有些異常不能同時發(fā)生: ■ 由于未定義指令與 SWI優(yōu)先級相同 , 所以未定義的指令和 SWI不能同時發(fā)生 , 也就是說正在執(zhí)行的指令不可能既是一條未定義的指令 , 又是一條 SWI指令; 優(yōu) 先 級 異 常最 高最 低1234566復 位數 據 中 止F I QI R Q預 取 指 中 止未 定 義 指 令軟 件 中 斷 S W I? 異常優(yōu)先級 ( 2) ■ 在一個數據中止處理程序中 , 由于沒有禁止 FIQ異常中斷 , 所以可以發(fā)生 FIQ異常 。 這些指令組成的一段代碼 , 稱之為 “ 異常向量表 ” 。 以確保軟件能與不同的 ARM結構兼容 。 表 異常向量地址一覽表 0 x 0 0 0 0 0 0 1 C地 址0 x 0 0 0 0 0 0 0 00 x 0 0 0 0 0 0 0 40 x 0 0 0 0 0 0 0 80 x 0 0 0 0 0 0 0 C0 x 0 0 0 0 0 0 1 00 x 0 0 0 0 0 0 1 40 x 0 0 0 0 0 0 1 8異 常 進 入 時 的 模 式 進 入 時 I 的 狀 態(tài) 進 入 時 F 的 狀 態(tài)復 位未 定 義 指 令軟 件 中 斷中 止 ( 預 取 )中 止 ( 數 據 )保 留I R QF I Q管 理未 定 義管 理中 止中 止保 留中 斷快 速 中 斷禁 止 禁 止I F禁 止 FI FI F— — — —禁 止 F禁 止 禁 止? 異常向量表( 2) 在異常向量表中有一個保留的異常入口 , 其位于0x0000 0014地址處 。 每種處理器操作模式都有一個相關聯(lián)的中斷向量 , 當一個異常發(fā)生時 , ARM將改變模式 , 而程序計數器 PC將會被強行指向異常向量 。 未 定 義 的 指 令S U B S P C , R 1 4 _ a b t , 8返 回 地 址異 常 入 口 返 回 指 令S W I預 取 指 中 止快 速 中 斷中 斷數 據 中 止復 位 無S U B S P C , R 1 4 _ i r q , 4S U B S P C , R 1 4 _ f i q , 4S U B S P C , R 1 4 _ a b t , 4M O V S P C , R 1 4 _ u n dM O V S P C , R 1 4 _ s v c R 1 4R 1 4R 1 4 4R 1 4 4R 1 4 4R 1 4 8— —? 異常向量表( 1) 如表 。 表 異常入口 /出口指令匯總 注意: “ MOVS PC,R14_svc”是指在管理模式下執(zhí)行“ MOVS PC, R14”指令。 詳見 。 例如,在用戶模式下執(zhí)行程序時,外設向處理器內核發(fā)出中斷請求,將導致內核從用戶模式切換到異常中斷模式。另外 , 請確保程序不依賴于包含特定值的保留位 , 因為將來的處理器可能會將這些位設臵為 1或者 0。 M [ 4 : 0 ]快 速 中 斷R 0 ~ R 7 、 S P 、 L R 、 P C 、 C P S R R 0 ~ R 1 4 、 P C 、 C P S R1 0 0 0 01 0 0 0 11 0 0 1 01 0 0 1 11 0 1 1 11 1 0 1 11 1 1 1 1模 式用 戶中 斷管 理中 止未 定 義系 統(tǒng)可 見 的 T h u m b 狀 態(tài) 寄 存 器 可 見 的 A R M 狀 態(tài) 寄 存 器R 0 ~ R 7 、 S P _ f i q 、 L R _ f i q 、 P C 、 C P S RR 0 ~ R 7 、 S P _ i r q 、 L R _ i r q 、 P C 、 C P S RR 0 ~ R 7 、 S P _ s v c 、 L R _ s v c 、 P C 、 C P S RR 0 ~ R 7 、 S P _ a b t 、 L R _ a b t 、 P C 、 C P S RR 0 ~ R 7 、 S P _ u n d 、 L R _ u n d 、 P C 、 C P S RR 0 ~ R 7 、 S P 、 L R 、 P C 、 C P S RR 0 ~ R 7 、 R 8 _ f i q 、 R 1 4 _ f i q 、 P C 、 C P S R 、 S P S R _ f i qR 0 ~ R 1 2 、 R 1 3 _ i r q 、 R 1 4 _ i r q 、 P C 、 C P S R 、 S P S R _ i r qR 0 ~ R 1 2 、 R 1 3 _ s v c 、 R 1 4 _ s v c 、 P C 、 C P S R 、 S P S R _ s v cR 0 ~ R 1 2 、 R 1 3 _ a b t 、 R 1 4 _ a b t 、 P C 、 C P S R 、 S P S R _ a b tR 0 ~ R 1 2 、 R 1 3 _ u n d 、 R 1 4 _ u n d 、 P C 、 C P S R 、 S P S R _ u n dR 0 ~ R 1 4 、 P C 、 C P S R? 保留位 CPSR中的保留位被保留 , 以便將來使用 。不是所有模式位的組合都定義了有效的處理器模式 , 因此不要使用表中沒有列出的組合 。 如果這樣做 , 處理器會進入一個無法預知的狀態(tài) 。 ? 控制標志位 ( 3) ( 2) 控制位 T : 控制位 T反映了正在操作的狀態(tài): ■ 當控制位 T臵位時 , 處理器正在 Thumb狀態(tài)下運行; ■ 當控制位 T清零時 , 處理器正在 ARM狀態(tài)下運行 。 剩下的問題比較簡單 , 那就是如何使用外設 。 那么到底需要滿足什么條件 , CPU才能響應外設中斷 ? 到底需要滿足什么條件 , CPU外設才能產生中斷 ? 這里的關鍵詞是 “響應中斷 ” 、 “ 響應外設中斷 ” 與 “ 產生中斷 ” , 具體的內容可以參考中斷相關章節(jié) 。 具體設臵如下: ■ 當控制位 I臵位時 , IRQ中斷被禁止 , 否則允許 IRQ中斷使能; ■ 當控制位 F臵位時 , FIQ中斷被禁止 , 否則允許 FIQ中斷使能 。 針對這 2位編程時應當格外小心 。 ( 1) 中斷禁止位 : 標志位 I和 F都是禁止標志位 , 用來使能或禁止ARM的 2種外部中斷源 。 當發(fā)生異常時 , 控制位改變 。 在Thumb狀態(tài)中 , 只有分支指令可條件執(zhí)行 。 其他指令 V通常不變 。 使用減法運算 ( 包括CMP指令 ) , b31位產生借位時 , C=0;否則 , C=1。 各標志位的含義如下: ■ 負標志 N:運算結果的第 31位值 。 這些標志還可通過 MSR和LDM指令進行設臵 。 一般地 , 如果指令帶 S后綴 , 則指令會修改條件代碼標志;但有一些指令總是改變條件代碼標志 。 圖 程序狀態(tài)寄存器的格式 注意: 為了保持與將來的 ARM處理器兼容,并且作為一種良好的習慣,在更改 CPSR時,建議使用讀 —修改 —寫的方法。 每種異常模式都有一個對應的程序狀態(tài)保存寄存器SPSR,用于保存任務在異常發(fā)生之前的 CPSR狀態(tài)的當前值, CPSR和 SPSR可以通過特殊指令進行訪問,詳細的信息將在第三章介紹。 當前程序狀態(tài)寄存器 ARM內核包含 1個 CPSR和 5個僅供異常處理模式使用的 SPSR。 CMP指令可用于比較高端寄存器 和低端寄存器的值 。 R 0R 1R 2R 3R 4R 5R 6R 7R 8R 9R 1 2堆 棧 指 針 ( S P )鏈 接 寄 存 器 ( L R )程 序 計 數 器 ( P C )當 前 程 序 狀 態(tài) 寄存 器 ( C P S R )R 0R 1R 2R 3R 4R 5R 6R 7堆 棧 指 針 ( S P )鏈 接 寄 存 器 ( L R )程 序 計 數 器 ( P C )當 前 程 序 狀 態(tài) 寄存 器 ( C P S R )R 1 0R 1 1T h u m b 狀 態(tài) A R M 狀 態(tài)? Thumb狀態(tài)下的寄存器 ( 9) ( 6) Thumb狀態(tài)中訪問高端寄存器 : Thumb指令集并不能訪問寄存器機構中的所有寄 存器 , 但所有數據處理處理指令都可以訪問 R0 ~ R7; 然而 , 可以對 R8 ~ R12訪問的指令只有以下幾條 , 它們 分別為 MOV、 ADD、 CMP。 A R MA R MA R MA R MA R MT h u m b進入退出I S R 1I S R 2I S R n..R e s e tB X異 常 發(fā) 生B X事 件 正 常 程 序 中 斷 服 務 程 序? Thumb狀態(tài)下的寄存器 ( 8) 這些關系入圖 。 注意: 所有的異常處理都是在 ARM狀態(tài)下執(zhí)行的 , 在 Thumb狀態(tài)下 , 如果有任何中斷或者異常標志出現(xiàn) , 那 么處理器就會自動切換到 ARM狀態(tài)去進行異常處理 , 當異常處理完畢返回時 , 處理器又會自動切換返回到 Thumb狀態(tài) , 狀態(tài)切換過程如圖 。 由于 Thumb指令集不包含 MSR和 MRS指令 , 如果用戶需要修改 CPSR的任何標志位 , 必須回到 ARM模式 。 ? Thumb狀態(tài)下的寄存器 ( 6) ( 5) ARM狀態(tài)寄存器與 Thumb狀態(tài)寄存器之間的關系 : ARM狀態(tài)寄存器與 Thumb狀態(tài)寄存器有如下的關 系: ① Thumb狀態(tài) R0 ~ R7與 ARM狀態(tài) R0 ~ R7相同 。 ? Thumb狀態(tài)下的寄存器 ( 4) ( 3) 堆棧指針 SP : 堆棧指針 SP對應 ARM狀態(tài)的寄存器 R13, Thumb指令集帶有傳統(tǒng)的 PUSH和 POP指令用于堆棧操作處理 ,它們以 “ 滿遞減堆棧 ” 的方式來實現(xiàn) , 詳見 于 “ 堆棧指針 R13”部分和第三章指令集部分內容 。