新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM中斷異常處理的返回

        ARM中斷異常處理的返回

        作者: 時間:2016-11-09 來源:網絡 收藏
        舉個小例子,下面是一段ARM匯編代碼:
        地址

        指令

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

        0x3000

        BL add

        0x3004

        MOV r0,#0

        0x3008

        MOV r1,#1

        0x300C

        MOV r2,#2

        AREA test,CODE,READONLY
        ENTRY
        Start
        MOV r0,#1
        MOV r1,#1
        BL add
        MOV r0,#0
        MOV r1,#1
        Add
        ADD r0,r0,r1
        MOV r0,r0,r1
        END

        當0x3000處的BL指令執行時,會把PC(=0x3008)保存到LR寄存器里面,也就是LR=0x3008。接下來處理器會立即對LR進行一個自動的更新動作:LR=LR-0x4,這樣,LR里面的地址為0x3008 – 0x4 = 03004,它是指令”MOV r0,#0”的地址,所以當從子程序add返回時,LR里面正好是正確的返回地址。既是下一條要執行的指令的地址。

        一、中斷異常處理函數調用
        異常就是正在執行的指令,由于各種軟件或硬件故障被打斷,比如,在讀數據或指令時,訪問存儲器失敗、產生了一個外部硬件中斷等。當這些情況發生時,在ARM系統里,由異常和中斷處理程序做出相應的處理,當處理完成后,要返回到被中止的指令,使被中止的指令能夠繼續正常執行下去。因此,確定異常和中斷處理程序的返回地址是一個非常重要的問題。

        1、中斷處理

        當外部中斷IRQ和FIQ(Fast Interrpt Request,快速中斷請求)發生時,ARM核完成一部分工作。當然,這些工作是任何異常發生時都必須要做的,所以ARM處理器就會自動帶我們完成。 其它重要的工作,必須由程序員來完成。ARM處理器處理的事包括從用戶模式切換到IRQ模式、狀態寄存器值的變化及跳轉。比如說,處理器自動跳轉到從0x0地址開始的異常中斷向量表的0x18處,在向量表的0x18處,最簡單的指令為”B HandlerIRQ”。

        那程序員所要關心的就是實現具體的異常處理程序(HandlerIRQ)。當用ARM匯編語言實現HandlerIRQ函數的時候,如何確定HandlerIRQ函數正確地返回地址,使被中止的指令能夠繼續正常執行下去。

        比較常用的中斷處理程序結構如下:

        HandlerIRQ ;中斷響應,從向量表直接跳來

        SUB r14,r14,#4;計算返回地址

        STMFD r13,{r0-r3,r14} ;保護現場,一般只需要保護{r0-r3,lr}

        BL irqHandler ;跳到具體的異常處理函數

        LDMFD r13,{r0-r3,pc}^ ;恢復現場

        有程序可以看出,通過”SUB R14,R14,#4”計算中斷函數的返回地址。那有人一定會問,為什么計算返回地址的時候要減去4呢?

        地址

        指令

        0x3000

        BL add

        0x3004

        MOV r0,#0

        0x3008

        MOV r1,#1

        0x300C

        MOV r2,#2

        我們看上個表,比如在執行地址為0x3004的move指令時,突然來了一個IRQ中斷,這個中斷打斷了move指令的執行,這個時候就要去跳轉到異常處理函數,之后還要返回0x3004地址重新執行move指令。當中斷發生時,LR里面保存了用戶模式下PC的值,那么當執行地址為0x3004的move指令時,PC的值應該是0x300C,前面介紹過,當發生跳轉時,處理器會對LR進行一個自動的更新動作:LR=LR-0x4,這樣LR里面的地址是0x300C-0x04=0x3008。但是0x3008并不是我們要的地址,因為中斷發生在地址為0x3004的move指令執行的時候,所以中斷處理完后應該返回這個地址。 這就是在計算返回地址的時候LR減去4的原因。對于FIQ中斷和預取指中止異常,計算返回地址方法和IRQ相同。

        我的理解:本身PC總是指向當前指令的下兩條指令的地址,PC的值為當前指令的地址值加8個字節。發生跳轉時,LR=LR-04,所以子程序返回時處理器自動計算LR=LR+08-04(LR+04),剛好是執行下一條指令。而中斷后是要返回發生中斷的當前指令繼續執行,所以應該在LR返回后再減去一條指令地址04,即LR=LR-04。

        以下我的整理:

        2 、ARM處理器對異常的響應步驟:

        a. 保護LR;

        b. 將CPSR到相應的SPSR中;

        c. 根據異常類型強制設置CPSR的運行模式位;

        d. 跳轉異常處理程序。

        3、 ARM處理器對異常的返回步驟:

        a. LR,LR減去相應的偏移量后送到PC;

        b. 將SPSR回CPSR中;

        c.清楚中斷禁止位。

        二、各中斷類型及優先級和返回值:

        1、FIQ(Fast Interrupt Request)

        FIQ異常是為了數據傳輸或通道處理而設計的。CPSR中的F位:=1 禁止FIQ中斷,=0允許中斷。只能在特權模式下才能改變F的狀態??捎赏獠繉FIQ引腳輸入低電平也能產生FIQ。返回指令: SUBS PC,R14_fiq,#4.

        2、IRQ(Interrupt Request)

        IRQ異常屬于正常的終端請求,可以在nIRQ引腳輸入低電平產生。CPSR中的I位: =1 禁止IRQ中斷,=0允許IRQ中斷,只能在特權模式下才能改變I的狀態。返回指令:SUBS PC,R14_irq,#4.

        3、Abort:中止

        產生中止異常意味著對存儲器的訪問失敗。

        a:指令預取中止:發生在指令預取時。中斷后PC=PC+8,返回指令:SUBS PC,R14_abt,#4.

        b:數據中止:發生在數據訪問時。中斷后PC=PC+12,返回指令: SUBS PC,R14_abt,#8.

        4、Software Interrupt

        SWI用于進入管理模式,用于請求執行特定的管理功能。返回地址:MOV PC,R14_svc.



        關鍵詞: ARM中斷異常處

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 稻城县| 宁陕县| 金山区| 勐海县| 玉林市| 平阴县| 祥云县| 肃南| 德兴市| 勐海县| 邯郸市| 南昌县| 凤台县| 株洲县| 台江县| 河东区| 天津市| 台南县| 龙胜| 乐昌市| 烟台市| 中阳县| 紫阳县| 阜新| 昌宁县| 建阳市| 太仓市| 博客| 肥城市| 大厂| 洪泽县| 济南市| 凤庆县| 延边| 克什克腾旗| 青龙| 瓦房店市| 恩施市| 乌兰浩特市| 民县| 尉氏县|