新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM 體系的異常中斷

        ARM 體系的異常中斷

        作者: 時間:2016-11-21 來源:網絡 收藏
        6.1 ARM 體系的異常中斷
        6.1.1 異常中斷的種類
        當ARM 系統正常的程序執行流程發生暫時的停止時,稱之為異常,ARM 系統對異常的
        響應過程稱之為異常中斷。例如當ARM 系統檢測到外部的復位信號有效,ARM 系統的程
        序就會跳轉到復位處理程序。在處理異常之前,ARM 內核保存當前的處理器狀態,這樣當
        處理程序結束時可以恢復執行原來的程序。當然ARM 體系的產生異常中斷后,會按照一定
        的程序進行中斷處理。下面我們分別介紹ARM 系統異常,ARM 體系異常中斷包括復位、
        未定義的指令、軟件中斷,指令預取中斷等。
        ●復位(Reset ):當處理器的復位引腳有效時,系統產生復位異常中斷,程序跳轉到復位異
        常中斷處理程序處執行。復位異常中斷通常用在下面兩種情況:①系統加電時 ②系統復位
        時。
        ●未定義的指令(undefined instruction):當ARM 處理器或者時系統中是協處理器認為當前指
        令未定義時,產生未定義指令異常中斷。可以通過該異常中斷機仿真浮點向量的運算。
        ●軟件中斷(Soft interrupt SWI):這時有用戶定義的中斷指令。可用于用戶模式下的程序調
        試特權操作指令。在實際的操作中可以通過該機制實現系統功能的調用。
        ●指令預取中止(Prefech Abort) :如果處理器預取的指令的地址不存在,或者該地址不允許
        當前指令訪問,當該預取的指令執行時,處理器產生指令預取中止異常中斷。
        數據訪問中止(Data Abort):如果數據訪問指令的目標地址不存在,或許該地址不允許當前
        指令訪問,處理器產生。
        ●外部中斷請求(IRQ):當處理器的外部中斷請求引腳有效,而且 CPSR 寄存器的 1 位控
        制位被清除時,處理器產生外部中斷請求(IRQ)異常中斷。系統中個外設通常通過該異常
        中斷請求處理器服務。
        ●快速中斷請求(FIQ ):當處理器外部快速中斷請求引腳有效,而且 CPSR 寄存器的 F
        制位被清除時,處理器產生外部中斷請求(FIQ )異常中斷。
        6.1.2 處理異常中斷的寄存器
        中止模式(Abort abt ) 用于虛擬存儲及存儲保護
        未定義指令模式(Undefined und ) 用于支持通過軟件仿真硬件的協處理器
        系統模式(System sys) 用于運行特權級的操作系統
        各種不同的處理器模式可能有對應于該處理器的物理寄存器組,如表 6.2 所示。其中,
        R13_svc 表示特權模式下的R13 寄存器,R_13abt 表示中止模式下的R13 寄存器,其余的各
        寄存器名稱含義類推。
        表 6.2 各處理器模式物理寄存器組
        用戶模式 系統模式 特權模式 中止模式 未定義指令模式 外部中斷模式 快速中斷模式
        R0 R0 R0 R0 R0 R0 R0
        R1 R1 R1 R1 R1 R1 R1
        R2 R2 R2 R2 R2 R2 R2
        R3 R3 R3 R3 R3 R3 R3
        R4 R4 R4 R4 R4 R4 R4
        R5 R5 R5 R5 R5 R5 R5
        R6 R6 R6 R6 R6 R6 R6
        R7 R7 R7 R7 R7 R7 R7
        R8 R8 R8 R8 R8 R8 R8_fiq
        R9 R9 R9 R9 R9 R9 R9_fiq
        R10 R10 R10 R10 R10 R10 R10_fiq
        R11 R11 R11 R11 R11 R11 R11_fiq
        R12 R12 R12 R12 R12 R12 R12_fiq
        R13 R13 R13_svc R13_abt R13_und R13_irq R13_fiq
        R14 R14 R14_svc R14_abt R14_und R14_irq R14_fiq
        PC PC PC PC PC PC PC
        CPSR CPSR CPSR CPSR CPSR CPSR CPSR
        SPSR_svs SPSR_abt SPSR_und SPSR_irq SPSR_fiq
        如果異常中斷處理程序中使用它自己的物理寄存器之外的其他寄存器,異常中段處理程序
        必須保存和恢復這些寄存器。
        上表中各物理寄存器的名稱在ARM 匯編語言中并沒有被預定義。用戶使用這些寄存器時,
        必須使用偽操作RN 來定義這些名稱。例如我們要使用寄存器R13_abt 可以使用下面的語句。
        R13_abt RN R13
        當幾個異常中斷同時發生時,就必須按照一定的次序來處理這些異常中斷。在ARM 中通
        過給各異常中斷賦予一定的優先級來實現這種處理次序。當然有些異常中斷時不可能同時發
        生的,如指令預取中止異常中斷和阮籍異常中斷時由同一條指令的執行觸發,它們時不可能
        同時發生的。處理器執行一個特定的異常中斷的過程中,稱為處理器處于特定的中斷模式。
        各異常中斷的中斷向量地址以及中斷的處理優先級如表 6.3 所示。
        表 6.3 各異常中斷的中斷向量地址以及中斷的處理優先級
        中斷向量地址 異常中斷類型 異常中斷模式 優先級(6 級最低)
        0x0 復位 特權模式(SVC) 1
        0x4 未定義的指令 未定義的指令中止模式 6
        0x8 軟件中斷 特權模式 6
        0x10 數據訪問中止 中止模式 2
        0x14 保留 未使用 未使用
        0x18 外部中斷請求 外部中斷模式 4
        0x1c 快速中斷請求 快速中斷模式 3
        6.1.4 進入異常中斷
        ARM 處理器對異常中斷的響應過程如下:
        (1) 保存處理器當前狀態、中斷屏蔽位以及各條件標志位。這是通過將當前程序狀態寄
        存器 CPSR 的內容保存到將要執行的異常中斷對應的SPSR 寄存器中實現的。各異
        常中斷有自己的物理 SPSR 寄存器。
        (2 ) 設置當前程序狀態寄存器CPSR 中相應的位。包括設置CPSR 中的位,使處理器進
        入相應的執行模式;設置 CPSR 中的位,禁止IRQ 中斷,當進入FIQ 模式時,禁
        止FIQ 中斷。
        (3) 將寄存器lr_mode 設置成返回地址。
        (4 ) 將程序計數器值(PC ),設置成該異常中斷的中斷向量地址,從而跳轉到相應的異
        常中斷處理程序執行。
        下面我們將分別介紹各種異常中斷響應時ARM 系統執行的指令。
        1.響應復位異常中斷
        當處理器的復位引腳有效時,處理器中止當前指令。當處理器的復位引腳變成無效時,
        處理器開始執行下面的操作。
        R14_svc=UNPREDICTABLE value
        SPSR_svs=UNPREDICTABLE value
        CPSR[4:0]=0b10011
        CPSR[5]=0
        CPSR[6]=1
        CPSR[7]=1
        If high vectors configured then
        PC=0Xffff0000
        Else
        PC=0x00000000
        2. 響應未定義指令異常中斷
        處理器響應未定義指令異常中斷時的處理過程如下面的偽指令所示。
        R14_und=address of next interaction after the undefined instruction
        SPSR_und=CPSR
        CPSR[4:0]=0b11011
        CPSR[5]=0
        CPSR[7]=1
        if high vectors configured then
        PC=0Xffff0004
        Else
        PC=0x00000004
        3. 響應 SWI 異常中斷
        處理器響應 SWI 異常中斷時的處理過程如下面的偽代碼所示。
        R14_svc=address of next instruction after the SWI instruction
        SPSR_svc=CPSR
        CPSR[4:0]=0b10011
        CPSR[5]=0
        If high vectors configured then
        PC=0Xffff0000
        Else
        PC=0x00000000
        4. 響應指令預取中止異常中斷
        處理響應指令預取中止異常中斷時的處理過程如下面的偽代碼所示。
        R14_aht=address of the aborted instruction + 4
        SPSR_abt=CPSR
        CPSR[4:0]=0b10111
        CPSR[5]=0
        CPSR[6]=1
        CPSR[7]=1
        If high vectors configured then
        PC=0Xffff001C
        Else
        PC=0x0000001c
        6.1.5 退出異常中斷
        ARM 系統處理完中斷后從異常中斷處理程序中返回包括下面的步驟。
        ● 恢復被中斷的程序的處理狀態,即將 SPSR_mode 寄存器內容復制到當前程序狀態
        寄存器 CPSR中。
        ● 返回到發生異常中斷的指令的下一條指令處執行。即將 lr_mode 寄存器的內容復
        制程序計數器 PC 中。
        因為整個應用系統時從復位異常中斷處理程序執行的,所以復位異常中斷處理程序不需要返
        回。
        實際上,當異常中斷發生時,程序程序計數器 PC 所致的位置對于各種不同的異常中斷是
        不同的。同樣,返回地址對于各種不同的異常中斷也是不同的。
        下面我們分別介紹各種異常中斷處理程序的返回方法。
        1.SWI 和未定義指令異常中斷處理程序的返回
        SWI 和未定義指令異常中斷是由當前執行的指令自身產生的,當 SWI 和未定義指令異常中斷
        產生時,程序及順氣 PC的值還未更新,它指向當前指令后面第 2 指令(對于 ARM指令來說,
        它指向當前指令地址加 8 個字節的位置;對于 Thumb 指令來說,它指向當前指令地址加 4
        個字節的位置)。當 SWI 和未定義指令異常中斷發生時,處理器將值(PC-4)保存到異常模
        式下的寄存器 lr_mode中。這時(PC-4)即指向當前的下一條指令。因此返回操作可以通過
        下面的指令來實現:
        MOV PC,LR
        該指令將寄存器 LR 中的值復制到程序計數器 PC 中,實現程序返回,同時將 SPSR_mode
        寄存器內容復制到當前程序狀態寄存器 CPSR 中。
        當異常中斷處理程序中使用了數據棧時,可以通過下面的指令在進入異常中斷處理程序時
        保存被中斷程序的執行現場,在退出異常中斷處理程序時恢復被中斷程序執行現場。異常中
        斷處理程序中使用的數據棧由用戶提供。
        STMFD SP! ,(reglist lr)
        ; ...
        LDMFD SP! ,reglist pc)^
        在上述指令中,reglist 是異常中斷處理程序使用的寄存器立表。標識符^指示將
        SPSR_mode 寄存器內容復制到當前程序狀態寄存器 CPSR 中。該指令只能在特權模式下使用。
        2.IRQ和 FIQ 異常中斷處理程序的返回
        通常處理器執行完當前指令后,查詢 IRQ 中斷引腳及 FIQ 中斷引腳,并且查看系統時否允
        許 IRQ 中斷及 FIQ 中斷。如果有中斷引腳有效,并且系統允許該中斷產生,處理器將產生
        IRQ 異常中斷或 FIQ 異常中斷。當 IRQ 和FIQ 異常中斷產生時,程序計數器 PC 的值也經更
        新,它指向當前指令后面第 3 條指令(對預 ARM 指令來說,它指向當前指令地址加 12 個字
        節的位置;對于 Thumb 指令來說,它指向當前指令地址加 6 個字節的位置)。當 IRQ 和 FIQ
        異常中斷發生時,處理器將值(PC-4)保存到異常模式下的寄存器 lr_mode 中。這時(PC-4)
        即指向當前指令后的第 2 條指令。因此返回操作可以通過下面的指令來實現:
        SUBS PC , LD, #4
        該指令將寄存器LR中的值減4后,復制到程序計數器PC中,實現程序返回,同時將SPSR_mode
        寄存器內容復制到當前程序狀態寄存器 CPSR 中。
        當異常中斷處理程序中使用了數據棧時,可以通過下面的指令進入異常中斷處理程序時保存
        被中斷程序的執行現場。異常中斷處理程序中使用的數據棧由用戶提供。
        SUBS LR,LR,#4
        STMFD SP!,{reglistl,lr}
        ; ...
        LDMFD SP!{reglist ,pc}^
        在上述指令中,reglist 是異常中斷處理程序中使用的寄存器列表。標識符^指示將
        SPSR_mode 寄存器內容復制到當前程序程序寄存器 CPSR 中。該指令只能在特權模式下使用。
        3.預取中止異常中斷處理程序的返回
        在指令預取時,如果目標地址時非法的,該指令將被標記稱有問題的指令。這時,流水線上
        該指令之前的指令繼續執行。當執行到該被標記稱有問題的指令時,處理器產生指令預取中
        止異常中斷。
        當發生指令預取中止異常中斷時,程序要返回到該有問題的指令處,重新讀取并執行該
        指令。因此指令預取中止異常中斷程序應該返回到產生該指令預取中止異常中斷的指令處。
        而不是像前面兩種情況下返回到發生中斷的指令的下一條指令。
        指令預取中止異常中斷時由當前執行的指令自身產生的,當指令預取中止異常中斷產生
        時,程序計數器 PC 的值還未更新,指向它當前指令后面第 2 條指令(對于 ARM 指令來說,
        它指向當前指令地址加 8 各字節的位置;對于 Thumb 指令來說,它指向當前指令地址 4個字
        節的位置)。當指令預取中止異常中斷發生時,處理器將值(PC-4)保存到異常模式下的寄
        存器 lr_mode 中。這時(PC-4)即指向當前指令的下一條指令。因此返回操作可以通過下面
        的指令來實現:
        SUSB PC , LR ,#4
        該指令將寄存器 LR 中的值減 4 后,復制到程序計數器 PC 中,實現程序的返回,同時將
        SPSR_mode 寄存器內容復制到當前程序狀態寄存器 CPSR 中。
        當異常中斷處理程序中使用了數據棧時,可以通過下面的指令在進入異常中斷處理程序
        時保存被中斷程序的執行現場,在推出異常中斷處理程序時恢復被中斷程序的執行現場。異
        常中斷處理程序中使用的數據棧由用戶提供。
        SUBS LR ,LR ,#4
        STMFD SP! ,{reglist ,lr}
        ;…
        LDMFD SP!,{reglist ,pc}^
        在上述指令中,reglist 是異常中斷處理程序中使用的寄存器列表。標識符^指示將
        SPSR_mode 寄存器內容復制到當前程序狀態寄存器 CPSR 中。該指令只能在特權模式下使用。
        4.數據訪問中止異常中斷處理程序返回
        當發生數據訪問中止異常中斷時,程序要返回到該有問題的數據訪問處,重新訪問該數
        據,因此數據訪問中止異常中斷程序應該返回到產生該數據訪問中止異常中斷的指令
        處,而不是像前面兩種情況下返回到當前指令的下一條指令。
        數據訪問中止異常中斷是由數據訪問指令產生的,當數據訪問中止異常中斷產生
        時,程序計數器 PC 的值已經更新,它指向當前指令后面第二條指令(對于 ARM 指令來
        說,它指向當前指令地址加 8 個字節的位置;對于 Thumb指令來說,它指向當前指令地
        址加 4 個字節的位置)。當數據訪問中止異常中斷發生時,處理器將值(PC-4)保存到
        異常模式下的寄存器 lr_mode 中。這時(PC-4)即指向當前指令的后第二條指令。因此
        返回操作可以通過下面的指令來實現:
        SUSB PC ,LR #8
        該指令將寄存器 LR 中的值減 8 后,復制到程序計數器 PC中,實現程序返回,同
        時將 SPSR_mode 寄存器內容復制到當前程序狀態寄存器 CPSR中。
        當異常中斷處理程序中使用了數據棧時,可以通過下面的指令在進入異常中斷處理
        程序時保存被中斷程序保存的執行現場,在退出異常中斷處理程序時恢復被中斷程序的
        執行現場。異常中斷處理程序中使用的數據棧由用戶提供。
        SUSB LR ,LR #8
        STMFD SP ! ,{eglist ,lr}
        ;...
        LDMFD SP !{reglist,pc}^
        在上述指令中,reglist是異常中斷處理程序中使用的寄存器列表。標識符^指示將
        SPSR_mode 寄存器內容復制到當前程序狀態寄存器 CPSR 中。該指令只能在特權模式下
        使用。



        關鍵詞: ARM體系異常中

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 伊通| 禄丰县| 东辽县| 嘉祥县| 库车县| 长泰县| 大足县| 藁城市| 岢岚县| 安徽省| 武胜县| 乐至县| 广安市| 拉萨市| 乌拉特后旗| 乌鲁木齐县| 延寿县| 呼玛县| 循化| 平罗县| 潼关县| 龙口市| 清水河县| 辽中县| 施秉县| 许昌市| 屯门区| 天柱县| 鄂尔多斯市| 梁河县| 休宁县| 岳阳县| 乐亭县| 象山县| 南投市| 凤城市| 望奎县| 涿鹿县| 高唐县| 信阳市| 宜城市|