新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM基礎知識教程(三):ARM中異常中斷的種類

        ARM基礎知識教程(三):ARM中異常中斷的種類

        作者: 時間:2016-11-09 來源:網絡 收藏
        **復位(RESET)**

        當處理器復位引腳有效時,系統產生復位異常中斷,程序跳轉到復位異常中斷處理程序處執行。復位異常中斷通常用在下面幾種情況下:系統加電時;系統復位時;跳轉到復位中斷向量處執行成為軟復位。

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

        **未定義的指令**
        ARM處理器或者是系統中的協處理器認為當前指令未定義時,產生未定義的指令異常中斷,可以通過改異常中斷機制仿真浮點向量運算。

        **軟件中斷**
        這是一個由用戶定義的中斷指令。可用于用戶模式下的程序調用特權操作指令。在實時操作系統中可以通過該機制西線系統功能調用。

        **指令與取終止(PrefechAbort)**
        如果處理器預取的指令的地址不存在,或者該地址不允許當前指令訪問,當被預取的指令執行時,處理器產生指令預取終止異常中斷。

        **數據訪問終止(DATAABORT)
        如果數據訪問指令的目標地址不存在,,或者該地址不允許當前指令訪問,處理器產生數據訪問終止異常中斷

        **外部中斷請求(IRQ)**
        當處理器的外部中斷請求引腳有效,而且CPSR的寄存器的I控制位被清除時,處理器產生外部中斷請求異常中斷。系統中個外設通過該異常中斷請求處理服務。

        **快速中斷請求(FIQ)**
        當處理器的外部快速中斷請求引腳有效,而且CPSR的F控制位被清除時,處理器產生外部中斷請求異常中斷

        異常中斷向量表及異常中斷優先級
        中斷向量表指定了個異常中斷及其處理程序的對應關系。他通常存放在存儲地址的低端。在ARM體系中,異常中斷向量表的大小為32字節,其中每個異常中斷占據4個字節大小,保留了4個字節空間。
        每個異常中斷對應的中斷向量表中的4個字節的空間中存放了一個跳轉指令或者一個向PC寄存器中賦值的數據訪問指令。通過這兩種指令,程序將跳轉到相應的異常中斷處理程序處執行。當幾個異常中斷同時發生時,就必須按照一定的次序來處理這些異常中斷。

        各個異常中斷的中斷向量地址以及中斷的處理優先級
        中斷向量地址 異常中斷類型 異常中斷模式 優先級(6最低)
        0x00 復位 特權模式 1
        0x04 未定義的指令 未定義指令終止模式 6
        0x08 軟件中斷 特權模式 6
        0x0C 指令預取終止 終止模式 5
        0x10 數據訪問終止 終止模式 2
        0x14 保留 未使用 未使用
        0x18 外部中斷請求 IRQ模式 4
        0x1C 快速中斷請求 FIQ模式 3

        在應用程序中安裝異常中斷處理程序
        1.使用跳轉指令:可以在異常中斷對應異常向量表中特定位置放置一條跳轉指令,直接跳轉到該異常中斷的處理程序。這種方法有一個缺點,即只能在32M空間范圍內跳轉。
        2.使用數據讀取指令LDR:使用數據讀取指令LDR向程序計數器PC中直接賦值。這種方法分為兩步:先將異常中斷處理程序的絕對地址存放在存放在距離向量表4KB范圍內的一個存儲單元中;再使用數據讀取指令LDR將該單元的內容讀取到程序計數器PC中。 **在系統復位時安裝異常中斷處理程序**
        1.地址0x00處為ROM的情況
        使用數據讀取指令LDR示例如下所示:
        Vector_Init_Block
        LDR PC, Reset_Addr
        LDR PC, Undefined_Addr
        LDR PC, SW_Addr
        LDR PC, Prefeth_Addr
        LDR PC, Abort_Addr
        NOP
        LDR PC, IRQ_Addr
        LDR PC, FIQ_Addr

        Reset_Addr DCD Start_Boot
        Undefined_Addr DCD Undefined_Handle
        SW_Addr DCD SWI_Handle
        Prefeth_Addr DCD Prefeth_Handle
        Abort_Addr DCD Abort_Handle
        DCD 0
        IRQ_Addr DCD IRQ_Handle
        FIQ_Addr DCD FIQ_Handle
        使用跳轉指令的示例如下所示:
        Vector_Init_Block
        BL Reset_Handle
        BL DCD Undefined_Handle
        BL SWI_Handle
        BL Prefeth_Handle
        BL Abort_Handle
        NOP
        BL IRQ_Handle
        BL FIQ_Handle
        2.地址0x00處為RAM的情況
        地址0x00處為RAM時,中斷向量表必須使用數據讀取指令直接指向PC中賦值的形式。而且,必須使用下面的代碼巴中斷向量表從ROM中復制到RAM中地址0x00開始處的存儲空間中:

        MOV r8,#0
        ADR r9,Vector_Init_Block
        ;復制中斷向量表(8字)
        LDMIA r9!,(r0-r7)
        STMIA r8!,(r0-r7)
        ;復制保存各中斷處理函數地址的表(8字words)
        LDMIA r9!,(r0-r7)
        STMIA r8!,(r0-r7)



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 南岸区| 乐都县| 英山县| 吉水县| 万载县| 旅游| 永平县| 黔西县| 页游| 方山县| 达拉特旗| 夏河县| 合水县| 平安县| 出国| 通海县| 孟村| 鹿泉市| 瓦房店市| 大名县| 惠水县| 元谋县| 屏南县| 曲阜市| 正蓝旗| 米脂县| 来安县| 杂多县| 武胜县| 崇义县| 泾川县| 东丰县| 团风县| 天祝| 朝阳县| 宁国市| 江北区| 康定县| 延长县| 巧家县| 阿坝县|