arm中断保护和恢复_ARM中断返回的详细分析
原標題:ARM中斷返回的詳細分析
在ARM體系中,通常有以下3種方式控制程序的執行流程:
1、在正常執行過程中,每執行一條ARM指令,程序計數器PC的值加4個字節;每執行一條Thumb指令,程序計數器PC加2個字節。整個過程是順序執行的;
2、跳轉 B指令執行跳轉操作; BL指令在執行跳轉的同時,保存子程序返回地址; BX指令,執行跳轉的同時,根據目標地址的最低位,可以將程序狀態切換到Thumb狀態; BLX指令執行上述3個操作;
3、當異常中斷發生時,系統執行完當前指令后,將跳轉到相應的異常中斷處理程序處執行。在進入異常中斷處理程序時,要保存被中斷的程序的執行現場,在從異常中斷處理程序退出時,要恢復被中斷的程序的執行現場。當異常中斷處理程序執行完成后,程序返回到發生中斷的指令的下一條指令處執行。
異常中斷種類、異常中斷向量地址和異常中斷優先級別見下表:
ARM運行的幾種處理器模式如上表所示。其中,應用程序通常運行在用戶模式下!
為了說明異常中斷執行過程,先了解各處理器模式下的寄存器組,如下表:
重點:ARM處理器對異常中斷的響應過程:
(一)、保存當前程序狀態寄存器CPSR到對應異常中斷的處理器模式下的SPSR中;
(二)、設置當前程序狀態寄存器CPSR的處理器模式位M(4:0)為對應的處理器模式,并禁止IRQ中斷(設置I位=1);當進入的是FIQ模式時,禁止FIQ中斷(設置F位=1);
(三)、將對應異常中斷的處理器模式下的LR設置成返回地址;
(四)、將程序計數器PC值,設置成該異常中斷向量地址,從而跳轉到相應的異常中斷處理程序處執行。
上述處理器對異常中斷的響應過程可以用偽代碼描述如下:
R14=return Link
SPSR=CPSR
CPSR[4:0]=exception mde number
CPSR[5] = 0 //所有異常均在ARM狀態下處理 (本句出自《基于ARM的嵌入式系統開發與實例》P32)
if(==Reset or FIQ )then
CPSR[6]=1 //禁止FIQ中斷
CPSR[7] =1 //禁止IRQ中斷
PC = exception vetor address
程序將自動跳轉到對應異常中斷的處理程序中。
上述過程,完全由處理器自動完成,所以,當發生一種異常中斷時,寄存器R14 、CPSR、SPSR和PC的值將是上述的結果!結果如下圖所示:
下面是引用別人的文章
ARM處理器中主要有7個異常(2個中斷異常):
1、復位異常;在以ARM為核的單片機中,常把下列事件作為引起復位的原因。
? 上電復位:在上電后,復位使內部達到預定的狀態,特別是程序跳到初始入口;
? 復位引腳上的復位脈沖:這是由外部其他控制信號引起的;
? 對系統電源檢測發現過壓或欠壓;
? 時鐘異常復位。
ARM處理器復位后,處理器硬件將進行以下操作:
? 強制進入管理模式;0b10011
? 強制進入ARM狀態;T=0
? 跳轉到絕對地址PC=0x00000000處執行;
? 禁止IRQ中斷和FIQ中斷。I=1,F=1;
復位后,程序狀態寄存器如下:
...... I F T M4 M3 M2 M1 M0
1 1 0 1 0 0 1 1
上電復位后,進入管理模式,執行操作系統程序,一般用做對系統初始化,例如開中斷等;然后切換到用戶模式,開始執行正常的用戶程序。
切換到用戶模式可使用下列程序:
MRS R0,CPSR ;讀狀態寄存器
BIC R0,R0,#03 ;把末兩位清0
MSR CPRS_c,R0 ;把修改后的值加載給狀態寄存器,切換結束
...... ;用戶程序
2、未定義指令異常;由于ARM使用32位代碼,包含的信息量很大,可達2的31方(4G)。ARM指令集不能用盡所有代碼。當ARM處理器遇到無法譯碼的指令時就會發生未定義指令異常。進入中斷處理程序。
ARM的未定義指令異常有以下兩種情況:
(1)遇到一條無法執行的指令,此指令沒有定義;
(2)執行一條對協處理器的操作指令,在正常情況下,協處理器應該應答,但協處理器沒有應答。
未定義異常中斷時,處理器硬件將進行以下操作:
把下一條指令的地址拷貝給LR;
把程序狀態寄存器CPSR拷貝給SPSR_und;
強制進入未定義模式; 0b11011
強制進入到ARM模式;T=0
跳轉到絕對地址PC=0x00000004處執行;
禁止IRQ中斷。 I=0
狀態寄存器中的F位不變。
進入中斷后,程序狀態寄存器如下:
...... I F T M4 M3 M2 M1 M0
1 x 0 1 1 0 1 1
使用下列指令退出異常中斷,返回原程序 。
MOVS PC,R14.
3、軟件中斷異常;是由指令SWI引起的。程序在執行這一指令后,進入異常中斷。
{下面是《ARM體系結構與編程》書中的一段摘錄}
********SWI和未定義指令異常中斷是由當前執行的指令自身產生的。 當SWI和未定義指令異常中斷產生時,程序計數器PC的值還未更新,它指向當前指令后面第2條指令(對于ARM指令來說+8字節;對于Thumb指令來說+4字節的位置)。當SWI和未定義指令異常中斷產生時,處理器將值(PC-4)保存到異常模式下的寄存器LR_mode中。這時(PC-4)即指向當前指令的下一條指令地址。因此返回操作可以通過下面的指令來實現: MOV PC,LR
該指令將寄存器LR中的值復制到程序計數器PC中實現程序返回,同時將SPSR_mode寄存器內容復制到當前程序狀態寄存器CPSR中。**********{摘錄結束}
處理器響應中斷,硬件執行如下的操作。
把下一條指令的地址拷貝給LR;
把程序狀態寄存器CPSR拷貝給SPSR_svc;
強制進入管理模式;0b10011
強制進入到ARM狀態;T=0
跳轉到絕對地址PC=0x00000008處執行;
禁止IRQ中斷。 I=1; F保持不變;
進入中斷后的程序狀態寄存器如下:
...... I F T M4 M3 M2 M1 M0
1 x 0 1 0 0 1 1
軟件中斷處理程序完成后,使用下列指令返回到原中斷處:MOVS PC,R14.
4、預取指中止異常;由程序存儲器引起的中止異常叫做預取指中止異常;由數據存儲器引起的中止異常叫做數據中止異常。由于ARM的指令是3級流水線結構,讀取指令周期是提前進行的,因此把讀取指令的過程一般稱預取指。如果在取得指令的同時程序存儲器發出中止信號,則ARM處理器把這一條指令標記位無效,然后等待執行。
{下面是《ARM體系結構與編程》書中的一段摘錄}
************在指令預取時,如果目標地址是非法的,該指令將被標記成有問題的指令。這時,流水線上該指令之前的指令繼續執行。當執行到該被標記成有問題的指令時,處理器產生指令預取中止異常中斷。
當發生指令預取中止異常中斷時,程序要返回到該有問題的指令處,重新讀取并執行該指令。因此指令預取中止異常中斷程序應該返回到產生該指令預取中止異常中斷的指令處,而不是像前面兩種情況下返回到發生中斷的指令的下一條指令。
指令預取中止異常中斷是由當前執行的指令自身產生的,當指令預取中止異常中斷產生時,程序計數器PC的值還未更新,它指向當前指令后面第2條指令(對于ARM指令來說,它指向當前指令地址加8個字節的w位置;對于Thumb指令來說,它指向當前指令地址加4個字節的位置)。當指令預取中止異常中斷產生時,處理器將(PC-4)值保存到異常模式下的寄存器LR_mode中。這時(PC-4)即指向當前指令的下一條指令。因此返回操作可以通過下面的指令來實現:SUBS PC,LR,#4
該指令將寄存器LR中的值減4后,復制到程序計數器PC中,實現程序返回,同時將SPSR_mode寄存器內容復制到當前程序狀態寄存器CPSR中。*************{摘錄結束}
有兩種可能如下:
當執行這條指令前程序發生跳轉,則這條無效指令不引起異常中斷;
當執行到這條指令時,處理器會發生預取指中止異常,引起中斷。
當進入預取指異常中斷時,處理器硬件響應中斷,執行以下的操作:
把中斷時PC的地址拷貝給LR;
把程序狀態寄存器CPSR拷貝給SPSR_abt;
強制進入中止異常模式;0b10111
強制進入到ARM狀態;T=0;
跳轉到絕對地址PC=0x0000000C處執行;
禁止IRQ中斷。 I=1;
進入中斷后,程序狀態寄存器如下:
...... I F T M4 M3 M2 M1 M0
1 x 0 1 0 1 1 1
預取指中止異常中斷返回時,應該執行下列指令:SUBS PC,R14,#4.
5、數據中止異常;ARM處理器訪問數據存儲器時,在讀取數據的同時數據存儲器發出了中止信號,引起數據中止異常。
當進入預取數據異常中斷時,處理器硬件響應中斷,執行以下的操作:
把中斷時的PC的地址拷貝給LR;
把程序狀態寄存器CPSR拷貝給SPSR_abt;
強制進入中止異常模式;
強制進入到ARM狀態;
跳轉到絕對地址PC=0x00000010處執行;
禁止IRQ中斷。
進入中斷后,程序狀態寄存器如下:
...... I F T M4 M3 M2 M1 M0
1 x 0 1 0 1 1 1
數據中止異常中斷服務程序返回時,使用下列指令:SUBS PC,R14,#8
上述指令是返回到中斷時所執行的指令,目的是再一次從數據存儲器中讀取數據。如果不再一次讀取數據,則執行下一條指令,此時使用下列指令返回: SUBS PC,R14,#4
6、中斷請求(IRQ)異常;例如:定時器中斷、串行口通訊中斷、外部信號中斷和A/D處理中斷等。IRQ中斷是可屏蔽的。
{下面是《ARM體系結構與編程》書中的一段摘錄}P269
************ 通常當處理器執行完當前指令后,查詢IRQ中斷引腳及FIQ中斷引腳,并且查看系統是否允許IRQ及FIQ中斷。如果有中斷引腳有效,并且系統允許該中斷產生,處理器將產生IRQ或FIQ異常中斷。 這時,程序計數器PC的值已經更新,它指向當前指令后面的第3條指令(對于ARM指令來說,它指向當前指令地址+12字節位置;對于Thumb指令來說,它指向當前指令地址+6字節的位置)。處理器這時將值(PC-4)保存到異常模式下的寄存器LR_mode中。這時(PC-4)即指向當前指令后面的第2條指令。因此返回操作可以通過下面的指令實現: SUBS PC, LR, #4
該指令將寄存器LR中的值減4后,復制到程序計數器PC中,實現程序返回,同時將SPSR_mode寄存器內容復制到當前程序狀態寄存器CPSR中。**********{摘錄結束}
在狀態寄存器中的I位就是IRQ的屏蔽位。當I=1時。則屏蔽IRQ中斷,當I=0時,則允許中斷。處理器復位后置I為1,關閉中斷。
當發生IRQ中斷時,處理器硬件響應中斷,執行下列操作:
把中斷時的PC的地址值拷貝給LR;
把程序狀態寄存器CPSR拷貝給SPSR_irq;
強制進入IRQ異常模式;
強制進入到ARM狀態;
跳轉到絕對地址PC=0x00000018處執行;
禁止IRQ中斷。
進入中斷后,程序狀態寄存器如下:
...... I F T M4 M3 M2 M1 M0
1 x 0 1 0 0 1 0
完成中斷處理后,程序執行下列返回原中斷處:SUBS PC.R14,#4.
7、快速中斷(FIQ)請求異常;FIQ快速中斷是可屏蔽的。在狀態寄存器中的F位就是FIQ的屏蔽位。當F=1時。則屏蔽FIQ中斷,當F=0時,則允許中斷。處理器復
位后置F為1,關閉中斷。
當發生FIQ中斷時,處理器硬件響應中斷,執行下列操作:
? 把中斷時的PC的地址值拷貝給LR;
把程序狀態寄存器CPSR拷貝給SPSR_fiq;
強制進入FIQ異常模式;
強制進入到ARM狀態;
跳轉到絕對地址PC=0x0000001C處執行;
禁止FIQ中斷。
進入中斷后,程序狀態寄存器如下:
...... I F T M4 M3 M2 M1 M0
1 x 0 1 0 0 0 1
完成中斷處理后,程序執行下列返回原中斷處:SUBS PC.R14,#4
特 別推薦
責任編輯:
總結
以上是生活随笔為你收集整理的arm中断保护和恢复_ARM中断返回的详细分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 曲线拟合_Python实现
- 下一篇: bst latex 最大作者数_late