新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM微處理器的編程模型之:異常中斷處理

        ARM微處理器的編程模型之:異常中斷處理

        作者: 時間:2013-09-13 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/257085.htm

        3.4.5 從異常處理程序中返回

        當一個異常處理返回時,一共有3件事情需要處理:通用寄存器的恢復、狀態寄存器的恢復以及PC指針的恢復。通用寄存器的恢復采用一般的堆棧操作指令即可,下面重點介紹狀態寄存器的恢復以及PC指針的恢復。

        1.恢復被中斷程序的處理器狀態

        PC和CPSR的恢復可以通過一條指令來實現,下面是3個例子。

        · MOVS PC,LR

        · SUBS PC,LR,#4

        · LDMFD SP!,{PC}^

        這幾條指令是普通的數據處理指令,特殊之處在于它們把程序計數器寄存器PC作為目標寄存器,并且帶了特殊的后綴“S”或“^”。其中“S”或“^”的作用就是使指令在執行時,同時完成從SPSR到CPSR的拷貝,達到恢復狀態寄存器的目的。

        2.異常的返回地址

        異常返回時,另一個非常重要的問題就是返回地址的確定。前面提到過,處理器進入異常時會有一個保存LR的動作,但是該保持值并不一定是正確中斷的返回地址。以一個簡單的指令執行流水狀態圖來對此加以說明,如圖3.7所示。

        圖3.7 3級流水線示例

        架構里,PC值指向當前執行指令地址加8。也就是說,當執行指令A(地址0x8000)時,PC等于0x8000+8=0x8008,即等于指令C的地址。假設指令A是BL指令,則當執行時,會把PC值(0x8008)保存到LR寄存器。但是,接下來處理器會對LR進行一次自動調整,使LR=LR-0x4。所以,最終保存在LR里面的是圖3.5中所示的B指令地址。所以當從BL返回時,LR里面正好是正確的返回地址。

        同樣的跳轉機制在所有的LR自動保存操作中都存在。當進入中斷響應時,處理器對保存的LR也進行一次自動調整,并且跳轉動作也是LR=LR-0x04。由此,就可以對不同異常類型的返回地址依次比較。

        假設在指令B處(地址0x8004)發生了異常,進入異常相應后,LR經過跳轉保存的地址值應該是C的地址0x8008。

        (1)軟中斷異常

        如果發生軟中斷異常,即指令B為SWI指令,從SWI中斷返回后下一條執行指令就是C,正好是LR寄存器保存的地址,所以只有直接把LR恢復給PC即可。

        (2)IRQ或FIQ異常

        如果發生的是IRQ或FIQ異常,因為外部中斷請求中斷了正在執行的指令B,當中斷返回后,需要重新回到B指令執行,也就是說,返回地址應該是B(0x8004),需要把LR減4送PC。

        (3)Data Abort數據中止異常

        在指令B處進入的相應,但導致的原因卻應該是上一條指令A。當中斷處理程序恢復后,要回到A重新執行導致數據異常的指令,因此返回地址應該是LR加8。

        為方便起見,表3.7總結了各異常和返回地址的關系

        表3.7 異常和返回地址

        異 常

        地 址

        用 途

        復位

        復位沒有定義LR

        數據中止

        LR-8

        指向導致數據中止異常的指令

        FIQ

        LR-4

        指向發生異常時正在執行的指令

        IRQ

        LR-4

        指向發生異常時正在執行的指令

        預取指令中止

        LR-4

        指向導致預取指令異常的那條指令

        SWI

        LR

        執行SWI指令的下一條指令

        未定義指令

        LR

        指向未定義指令的下一條指令

        3.4.6 在應用程序中安裝異常處理程序

        1.使用匯編語言安裝異常處理程序

        如果系統啟動不依賴于Debug或Debug monitor軟件,可以使用匯編語言在系統啟動時直接安裝異常處理程序。

        下面的例子顯示了系統從0x0地址啟動,直接安裝異常處理程序的方法。

        Vector_Init_Block

        LDR PC, Reset_Addr

        LDR PC, Undefined_Addr

        LDR PC, SWI_Addr

        LDR PC, Prefetch_Addr

        LDR PC, Abort_Addr

        NOP ;保留向量

        LDR PC, IRQ_Addr

        LDR PC, FIQ_Addr

        Reset_Addr DCD Start_Boot

        Undefined_Addr DCD Undefined_Handler

        SWI_Addr DCD SWI_Handler

        Prefetch_Addr DCD Prefetch_Handler

        Abort_Addr DCD Abort_Handler

        DCD 0 ;保留向量

        IRQ_Addr DCD IRQ_Handler

        FIQ_Addr DCD FIQ_Handler



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 庄河市| 旅游| 西华县| 儋州市| 乳山市| 尉氏县| 增城市| 霍州市| 乌兰察布市| 凌云县| 汽车| 静乐县| 滕州市| 开化县| 咸宁市| 兰州市| 新龙县| 沂水县| 赣州市| 清苑县| 永寿县| 昭觉县| 民县| 辉县市| 和平区| 镇安县| 嘉禾县| 塘沽区| 新津县| 霍林郭勒市| 凌源市| 新源县| 金昌市| 乌兰察布市| 上饶县| 郴州市| 沙坪坝区| 大荔县| 石景山区| 依安县| 微山县|