新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM中斷PC返回值分析

        ARM中斷PC返回值分析

        作者: 時間:2016-11-09 來源:網絡 收藏
        在ARM程序的開發過程中,對中斷的處理是很普遍的、也是相當重要的。Realview MDK使用的RVCT編譯器提供了__irq關鍵字,用此關鍵字修飾的函數被作為中斷來函數編譯,即在編譯的過程中,編譯器會自動添加中斷處理過程中現場保護和恢復的代碼,減小程序的開發難度,加快軟件的開發過程。

        在理解__irq關鍵字的作用之前,先看一下ARM核對異常的處理過程。當產生異常時, ARM核拷貝CPSR寄存器的內容SPSR_寄存器中,同時設置適當的CPSR 位、改變處理器狀態進入ARM 態和處理器模式,從而進入相應的異常模式。在設置中斷禁止位禁止相應中斷(如果需要)后,ARM核保存返回地址到LR_,同時設置PC為相應的異常向量。當異常返回時, 異常處理需要從SPSR_寄存器中恢復CPSR的值,同時從LR_恢復PC,具體的異常返回指令如下:

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

        Ø 從SWI和Undef異常返回時使用:

        MOVS PC, LR;

        Ø 從FIQ、IRQ和預取終止返回時使用:

        SUBS PC, LR,#4;

        Ø 從數據異常返回時使用:

        SUBS PC, LR,#8

        在使用上述指令異常返回時,如果LR之前被壓棧的話使用LDM “∧”, 例如:

        LDMFD SP!, {PC}∧

        退出異常處理

        SWI和未定義指令異常中斷是由當前執行的指令自身產生的。當SWI和未定義指令異常中斷產生時,程序計數器PC的值還未更新,它指向當前指令后面第2條指令(對于ARM指令來說+8字節;對于Thumb指令來說+4字節的位置)。當SWI和未定義指令異常中斷產生時,處理器將值(PC-4)保存到異常模式下的寄存器LR_mode中。這時(PC-4)即指向當前指令的下一條指令地址。因此返回操作可以通過下面的指令來實現:MOV PC,LR

        該指令將寄存器LR中的值到程序計數器PC中實現程序返回,同時將SPSR_mode寄存器內容到當前程序狀態寄存器CPSR中。

        在指令預取時,如果目標地址是非法的,該指令將被標記成有問題的指令。這時,流水線上該指令之前的指令繼續執行。當執行到該被標記成有問題的指令時,處理器產生指令預取中止異常中斷。

        當發生指令預取中止異常中斷時,程序要返回到該有問題的指令處,重新讀取并執行該指令。因此指令預取中止異常中斷程序應該返回到產生該指令預取中止異常中斷的指令處,而不是返回到發生中斷的指令的下一條指令。

        指令預取中止異常中斷是由當前執行的指令自身產生的,當指令預取中止異常中斷產生時,程序計數器PC的值還未更新,它指向當前指令后面第2條指令(對于ARM指令來說,它指向當前指令地址加8個字節的w位置;對于Thumb指令來說,它指向當前指令地址加4個字節的位置)。當指令預取中止異常中斷產生時,處理器將(PC-4)值保存到異常模式下的寄存器LR_mode中。這時(PC-4)即指向當前指令的下一條指令。因此返回操作可以通過下面的指令來實現:SUBS PC,LR,#4

        該指令將寄存器LR中的值減4后,到程序計數器PC中,實現程序返回,同時將SPSR_mode寄存器內容到當前程序狀態寄存器CPSR中。

        發生數據訪問異常中斷時,程序要返回到該有問題的指令處,重新訪問該數據,因此數據訪問異常中斷應該返回到產生該數據訪問中止異常中斷的指令處,而不是當前指令的下一條指令。

        數據訪問異常中斷由當前執行的指令自身產生,當數據訪問異常中斷發生時,程序計數器pc的值已經更新,它指向當前指令后面第3條指令(對于ARM指令,它指向當前指令地址加12字節的位置;對于Thumb指令,它指向當前指令地址加6字節的位置)。此時處理器將值(pc-4)保存到lr_abt中,它指向當前指令后面第2條指令,所以返回操作可以通過下面指令實現:subs pc, lr, #8

        該指令將lr中的值減8后傳給程序計數器pc中,實現程序返回,同時將SPSR_abt寄存器內容到當前程序狀態寄存器CPSR中;

        通常處理器執行完當前指令后,查詢IRQ中斷引腳,并查看是否允許IRQ中斷,如果某個中斷引腳有效,并且系統允許該中斷產生,處理器將產生IRQ異常中斷,當IRQ異常中斷產生時,程序計數器pc的值已經更新,它指向當前指令后面第3條指令(對于ARM指令,它指向當前指令地址加12字節的位置;對于Thumb指令,它指向當前指令地址加6字節的位置),當IRQ異常中斷產生時,處理器將值(pc-4)保存到IRQ異常模式下的寄存器lr_irq中,它指向當前指令之后的第2條指令,因此返回操作可以通過下面指令實現:subs pc, lr, #4

        與IRQ異常中斷一樣,處理器執行完當前指令后,查詢FIQ中斷引腳,并查看是否允許FIQ中斷,如果中斷引腳有效,并且系統允許該中斷產生,處理器將產生FIQ異常中斷,當FIQ異常中斷產生時,程序計數器pc的值已經更新,它指向當前指令后面第3條指令(對于ARM指令,它指向當前指令地址加12字節的位置;對于Thumb指令,它指向當前指令地址加6字節的位置),當FIQ異常中斷產生時,處理器將值(pc-4)保存到IRQ異常模式下的寄存器lr_fiq中,它指向當前指令之后的第2條指令,因此返回操作可以通過下面指令實現:subs pc, lr, #4



        關鍵詞: ARM中斷PC返回

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宜兴市| 犍为县| 乐亭县| 衢州市| 锦州市| 军事| 望奎县| 焦作市| 威信县| 重庆市| 达州市| 合江县| 大荔县| 九寨沟县| 恩施市| 安阳市| 枞阳县| 深水埗区| 文化| 长寿区| 安阳县| 定远县| 普洱| 咸丰县| 左权县| 新竹市| 宜都市| 东辽县| 资兴市| 柯坪县| 兖州市| 紫阳县| 尚义县| 杭州市| 梅州市| 若尔盖县| 屏东县| 承德市| 读书| 图木舒克市| 德昌县|