日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

arm中断保护和恢复_ARM中断返回的详细分析

發(fā)布時間:2024/10/6 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 arm中断保护和恢复_ARM中断返回的详细分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原標題:ARM中斷返回的詳細分析

在ARM體系中,通常有以下3種方式控制程序的執(zhí)行流程:

1、在正常執(zhí)行過程中,每執(zhí)行一條ARM指令,程序計數(shù)器PC的值加4個字節(jié);每執(zhí)行一條Thumb指令,程序計數(shù)器PC加2個字節(jié)。整個過程是順序執(zhí)行的;

2、跳轉(zhuǎn) B指令執(zhí)行跳轉(zhuǎn)操作; BL指令在執(zhí)行跳轉(zhuǎn)的同時,保存子程序返回地址; BX指令,執(zhí)行跳轉(zhuǎn)的同時,根據(jù)目標地址的最低位,可以將程序狀態(tài)切換到Thumb狀態(tài); BLX指令執(zhí)行上述3個操作;

3、當異常中斷發(fā)生時,系統(tǒng)執(zhí)行完當前指令后,將跳轉(zhuǎn)到相應的異常中斷處理程序處執(zhí)行。在進入異常中斷處理程序時,要保存被中斷的程序的執(zhí)行現(xiàn)場,在從異常中斷處理程序退出時,要恢復被中斷的程序的執(zhí)行現(xiàn)場。當異常中斷處理程序執(zhí)行完成后,程序返回到發(fā)生中斷的指令的下一條指令處執(zhí)行。

異常中斷種類、異常中斷向量地址和異常中斷優(yōu)先級別見下表:

ARM運行的幾種處理器模式如上表所示。其中,應用程序通常運行在用戶模式下!

為了說明異常中斷執(zhí)行過程,先了解各處理器模式下的寄存器組,如下表:

重點:ARM處理器對異常中斷的響應過程:

(一)、保存當前程序狀態(tài)寄存器CPSR到對應異常中斷的處理器模式下的SPSR中;

(二)、設(shè)置當前程序狀態(tài)寄存器CPSR的處理器模式位M(4:0)為對應的處理器模式,并禁止IRQ中斷(設(shè)置I位=1);當進入的是FIQ模式時,禁止FIQ中斷(設(shè)置F位=1);

(三)、將對應異常中斷的處理器模式下的LR設(shè)置成返回地址;

(四)、將程序計數(shù)器PC值,設(shè)置成該異常中斷向量地址,從而跳轉(zhuǎn)到相應的異常中斷處理程序處執(zhí)行。

上述處理器對異常中斷的響應過程可以用偽代碼描述如下:

R14=return Link

SPSR=CPSR

CPSR[4:0]=exception mde number

CPSR[5] = 0 //所有異常均在ARM狀態(tài)下處理 (本句出自《基于ARM的嵌入式系統(tǒng)開發(fā)與實例》P32)

if(==Reset or FIQ )then

CPSR[6]=1 //禁止FIQ中斷

CPSR[7] =1 //禁止IRQ中斷

PC = exception vetor address

程序?qū)⒆詣犹D(zhuǎn)到對應異常中斷的處理程序中。

上述過程,完全由處理器自動完成,所以,當發(fā)生一種異常中斷時,寄存器R14 、CPSR、SPSR和PC的值將是上述的結(jié)果!結(jié)果如下圖所示:

下面是引用別人的文章

ARM處理器中主要有7個異常(2個中斷異常):

1、復位異常;在以ARM為核的單片機中,常把下列事件作為引起復位的原因。

? 上電復位:在上電后,復位使內(nèi)部達到預定的狀態(tài),特別是程序跳到初始入口;

? 復位引腳上的復位脈沖:這是由外部其他控制信號引起的;

? 對系統(tǒng)電源檢測發(fā)現(xiàn)過壓或欠壓;

? 時鐘異常復位。

ARM處理器復位后,處理器硬件將進行以下操作:

? 強制進入管理模式;0b10011

? 強制進入ARM狀態(tài);T=0

? 跳轉(zhuǎn)到絕對地址PC=0x00000000處執(zhí)行;

? 禁止IRQ中斷和FIQ中斷。I=1,F=1;

復位后,程序狀態(tài)寄存器如下:

...... I F T M4 M3 M2 M1 M0

1 1 0 1 0 0 1 1

上電復位后,進入管理模式,執(zhí)行操作系統(tǒng)程序,一般用做對系統(tǒng)初始化,例如開中斷等;然后切換到用戶模式,開始執(zhí)行正常的用戶程序。

切換到用戶模式可使用下列程序:

MRS R0,CPSR ;讀狀態(tài)寄存器

BIC R0,R0,#03 ;把末兩位清0

MSR CPRS_c,R0 ;把修改后的值加載給狀態(tài)寄存器,切換結(jié)束

...... ;用戶程序

2、未定義指令異常;由于ARM使用32位代碼,包含的信息量很大,可達2的31方(4G)。ARM指令集不能用盡所有代碼。當ARM處理器遇到無法譯碼的指令時就會發(fā)生未定義指令異常。進入中斷處理程序。

ARM的未定義指令異常有以下兩種情況:

(1)遇到一條無法執(zhí)行的指令,此指令沒有定義;

(2)執(zhí)行一條對協(xié)處理器的操作指令,在正常情況下,協(xié)處理器應該應答,但協(xié)處理器沒有應答。

未定義異常中斷時,處理器硬件將進行以下操作:

把下一條指令的地址拷貝給LR;

把程序狀態(tài)寄存器CPSR拷貝給SPSR_und;

強制進入未定義模式; 0b11011

強制進入到ARM模式;T=0

跳轉(zhuǎn)到絕對地址PC=0x00000004處執(zhí)行;

禁止IRQ中斷。 I=0

狀態(tài)寄存器中的F位不變。

進入中斷后,程序狀態(tài)寄存器如下:

...... I F T M4 M3 M2 M1 M0

1 x 0 1 1 0 1 1

使用下列指令退出異常中斷,返回原程序 。

MOVS PC,R14.

3、軟件中斷異常;是由指令SWI引起的。程序在執(zhí)行這一指令后,進入異常中斷。

{下面是《ARM體系結(jié)構(gòu)與編程》書中的一段摘錄}

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

該指令將寄存器LR中的值復制到程序計數(shù)器PC中實現(xiàn)程序返回,同時將SPSR_mode寄存器內(nèi)容復制到當前程序狀態(tài)寄存器CPSR中。**********{摘錄結(jié)束}

處理器響應中斷,硬件執(zhí)行如下的操作。

把下一條指令的地址拷貝給LR;

把程序狀態(tài)寄存器CPSR拷貝給SPSR_svc;

強制進入管理模式;0b10011

強制進入到ARM狀態(tài);T=0

跳轉(zhuǎn)到絕對地址PC=0x00000008處執(zhí)行;

禁止IRQ中斷。 I=1; F保持不變;

進入中斷后的程序狀態(tài)寄存器如下:

...... I F T M4 M3 M2 M1 M0

1 x 0 1 0 0 1 1

軟件中斷處理程序完成后,使用下列指令返回到原中斷處:MOVS PC,R14.

4、預取指中止異常;由程序存儲器引起的中止異常叫做預取指中止異常;由數(shù)據(jù)存儲器引起的中止異常叫做數(shù)據(jù)中止異常。由于ARM的指令是3級流水線結(jié)構(gòu),讀取指令周期是提前進行的,因此把讀取指令的過程一般稱預取指。如果在取得指令的同時程序存儲器發(fā)出中止信號,則ARM處理器把這一條指令標記位無效,然后等待執(zhí)行。

{下面是《ARM體系結(jié)構(gòu)與編程》書中的一段摘錄}

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

當發(fā)生指令預取中止異常中斷時,程序要返回到該有問題的指令處,重新讀取并執(zhí)行該指令。因此指令預取中止異常中斷程序應該返回到產(chǎn)生該指令預取中止異常中斷的指令處,而不是像前面兩種情況下返回到發(fā)生中斷的指令的下一條指令。

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

該指令將寄存器LR中的值減4后,復制到程序計數(shù)器PC中,實現(xiàn)程序返回,同時將SPSR_mode寄存器內(nèi)容復制到當前程序狀態(tài)寄存器CPSR中。*************{摘錄結(jié)束}

有兩種可能如下:

當執(zhí)行這條指令前程序發(fā)生跳轉(zhuǎn),則這條無效指令不引起異常中斷;

當執(zhí)行到這條指令時,處理器會發(fā)生預取指中止異常,引起中斷。

當進入預取指異常中斷時,處理器硬件響應中斷,執(zhí)行以下的操作:

把中斷時PC的地址拷貝給LR;

把程序狀態(tài)寄存器CPSR拷貝給SPSR_abt;

強制進入中止異常模式;0b10111

強制進入到ARM狀態(tài);T=0;

跳轉(zhuǎn)到絕對地址PC=0x0000000C處執(zhí)行;

禁止IRQ中斷。 I=1;

進入中斷后,程序狀態(tài)寄存器如下:

...... I F T M4 M3 M2 M1 M0

1 x 0 1 0 1 1 1

預取指中止異常中斷返回時,應該執(zhí)行下列指令:SUBS PC,R14,#4.

5、數(shù)據(jù)中止異常;ARM處理器訪問數(shù)據(jù)存儲器時,在讀取數(shù)據(jù)的同時數(shù)據(jù)存儲器發(fā)出了中止信號,引起數(shù)據(jù)中止異常。

當進入預取數(shù)據(jù)異常中斷時,處理器硬件響應中斷,執(zhí)行以下的操作:

把中斷時的PC的地址拷貝給LR;

把程序狀態(tài)寄存器CPSR拷貝給SPSR_abt;

強制進入中止異常模式;

強制進入到ARM狀態(tài);

跳轉(zhuǎn)到絕對地址PC=0x00000010處執(zhí)行;

禁止IRQ中斷。

進入中斷后,程序狀態(tài)寄存器如下:

...... I F T M4 M3 M2 M1 M0

1 x 0 1 0 1 1 1

數(shù)據(jù)中止異常中斷服務程序返回時,使用下列指令:SUBS PC,R14,#8

上述指令是返回到中斷時所執(zhí)行的指令,目的是再一次從數(shù)據(jù)存儲器中讀取數(shù)據(jù)。如果不再一次讀取數(shù)據(jù),則執(zhí)行下一條指令,此時使用下列指令返回: SUBS PC,R14,#4

6、中斷請求(IRQ)異常;例如:定時器中斷、串行口通訊中斷、外部信號中斷和A/D處理中斷等。IRQ中斷是可屏蔽的。

{下面是《ARM體系結(jié)構(gòu)與編程》書中的一段摘錄}P269

************ 通常當處理器執(zhí)行完當前指令后,查詢IRQ中斷引腳及FIQ中斷引腳,并且查看系統(tǒng)是否允許IRQ及FIQ中斷。如果有中斷引腳有效,并且系統(tǒng)允許該中斷產(chǎn)生,處理器將產(chǎn)生IRQ或FIQ異常中斷。 這時,程序計數(shù)器PC的值已經(jīng)更新,它指向當前指令后面的第3條指令(對于ARM指令來說,它指向當前指令地址+12字節(jié)位置;對于Thumb指令來說,它指向當前指令地址+6字節(jié)的位置)。處理器這時將值(PC-4)保存到異常模式下的寄存器LR_mode中。這時(PC-4)即指向當前指令后面的第2條指令。因此返回操作可以通過下面的指令實現(xiàn): SUBS PC, LR, #4

該指令將寄存器LR中的值減4后,復制到程序計數(shù)器PC中,實現(xiàn)程序返回,同時將SPSR_mode寄存器內(nèi)容復制到當前程序狀態(tài)寄存器CPSR中。**********{摘錄結(jié)束}

在狀態(tài)寄存器中的I位就是IRQ的屏蔽位。當I=1時。則屏蔽IRQ中斷,當I=0時,則允許中斷。處理器復位后置I為1,關(guān)閉中斷。

當發(fā)生IRQ中斷時,處理器硬件響應中斷,執(zhí)行下列操作:

把中斷時的PC的地址值拷貝給LR;

把程序狀態(tài)寄存器CPSR拷貝給SPSR_irq;

強制進入IRQ異常模式;

強制進入到ARM狀態(tài);

跳轉(zhuǎn)到絕對地址PC=0x00000018處執(zhí)行;

禁止IRQ中斷。

進入中斷后,程序狀態(tài)寄存器如下:

...... I F T M4 M3 M2 M1 M0

1 x 0 1 0 0 1 0

完成中斷處理后,程序執(zhí)行下列返回原中斷處:SUBS PC.R14,#4.

7、快速中斷(FIQ)請求異常;FIQ快速中斷是可屏蔽的。在狀態(tài)寄存器中的F位就是FIQ的屏蔽位。當F=1時。則屏蔽FIQ中斷,當F=0時,則允許中斷。處理器復

位后置F為1,關(guān)閉中斷。

當發(fā)生FIQ中斷時,處理器硬件響應中斷,執(zhí)行下列操作:

? 把中斷時的PC的地址值拷貝給LR;

把程序狀態(tài)寄存器CPSR拷貝給SPSR_fiq;

強制進入FIQ異常模式;

強制進入到ARM狀態(tài);

跳轉(zhuǎn)到絕對地址PC=0x0000001C處執(zhí)行;

禁止FIQ中斷。

進入中斷后,程序狀態(tài)寄存器如下:

...... I F T M4 M3 M2 M1 M0

1 x 0 1 0 0 0 1

完成中斷處理后,程序執(zhí)行下列返回原中斷處:SUBS PC.R14,#4

特 別推薦

責任編輯:

總結(jié)

以上是生活随笔為你收集整理的arm中断保护和恢复_ARM中断返回的详细分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。