<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM微處理器的編程模型之:異常中斷處理

ARM微處理器的編程模型之:異常中斷處理

作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/257085.htm

3.4.5 從異常處理程序中返回

當一個(gè)異常處理返回時(shí),一共有3件事情需要處理:通用寄存器的恢復、狀態(tài)寄存器的恢復以及PC指針的恢復。通用寄存器的恢復采用一般的堆棧操作指令即可,下面重點(diǎn)介紹狀態(tài)寄存器的恢復以及PC指針的恢復。

1.恢復被中斷程序的處理器狀態(tài)

PC和CPSR的恢復可以通過(guò)一條指令來(lái)實(shí)現,下面是3個(gè)例子。

· MOVS PC,LR

· SUBS PC,LR,#4

· LDMFD SP!,{PC}^

這幾條指令是普通的數據處理指令,特殊之處在于它們把程序計數器寄存器PC作為目標寄存器,并且帶了特殊的后綴“S”或“^”。其中“S”或“^”的作用就是使指令在執行時(shí),同時(shí)完成從SPSR到CPSR的拷貝,達到恢復狀態(tài)寄存器的目的。

2.異常的返回地址

異常返回時(shí),另一個(gè)非常重要的問(wèn)題就是返回地址的確定。前面提到過(guò),處理器進(jìn)入異常時(shí)會(huì )有一個(gè)保存LR的動(dòng)作,但是該保持值并不一定是正確中斷的返回地址。以一個(gè)簡(jiǎn)單的指令執行流水狀態(tài)圖來(lái)對此加以說(shuō)明,如圖3.7所示。

圖3.7 3級流水線(xiàn)示例

架構里,PC值指向當前執行指令地址加8。也就是說(shuō),當執行指令A(地址0x8000)時(shí),PC等于0x8000+8=0x8008,即等于指令C的地址。假設指令A是BL指令,則當執行時(shí),會(huì )把PC值(0x8008)保存到LR寄存器。但是,接下來(lái)處理器會(huì )對LR進(jìn)行一次自動(dòng)調整,使LR=LR-0x4。所以,最終保存在LR里面的是圖3.5中所示的B指令地址。所以當從BL返回時(shí),LR里面正好是正確的返回地址。

同樣的跳轉機制在所有的LR自動(dòng)保存操作中都存在。當進(jìn)入中斷響應時(shí),處理器對保存的LR也進(jìn)行一次自動(dòng)調整,并且跳轉動(dòng)作也是LR=LR-0x04。由此,就可以對不同異常類(lèi)型的返回地址依次比較。

假設在指令B處(地址0x8004)發(fā)生了異常,進(jìn)入異常相應后,LR經(jīng)過(guò)跳轉保存的地址值應該是C的地址0x8008。

(1)軟中斷異常

如果發(fā)生軟中斷異常,即指令B為SWI指令,從SWI中斷返回后下一條執行指令就是C,正好是LR寄存器保存的地址,所以只有直接把LR恢復給PC即可。

(2)IRQ或FIQ異常

如果發(fā)生的是IRQ或FIQ異常,因為外部中斷請求中斷了正在執行的指令B,當中斷返回后,需要重新回到B指令執行,也就是說(shuō),返回地址應該是B(0x8004),需要把LR減4送PC。

(3)Data Abort數據中止異常

在指令B處進(jìn)入的相應,但導致的原因卻應該是上一條指令A。當中斷處理程序恢復后,要回到A重新執行導致數據異常的指令,因此返回地址應該是LR加8。

為方便起見(jiàn),表3.7總結了各異常和返回地址的關(guān)系

表3.7 異常和返回地址

異 常

地 址

用 途

復位

復位沒(méi)有定義LR

數據中止

LR-8

指向導致數據中止異常的指令

FIQ

LR-4

指向發(fā)生異常時(shí)正在執行的指令

IRQ

LR-4

指向發(fā)生異常時(shí)正在執行的指令

預取指令中止

LR-4

指向導致預取指令異常的那條指令

SWI

LR

執行SWI指令的下一條指令

未定義指令

LR

指向未定義指令的下一條指令

3.4.6 在應用程序中安裝異常處理程序

1.使用匯編語(yǔ)言安裝異常處理程序

如果系統啟動(dòng)不依賴(lài)于Debug或Debug monitor軟件,可以使用匯編語(yǔ)言在系統啟動(dòng)時(shí)直接安裝異常處理程序。

下面的例子顯示了系統從0x0地址啟動(dòng),直接安裝異常處理程序的方法。

Vector_Init_Block

LDR PC, Reset_Addr

LDR PC, Undefined_Addr

LDR PC, SWI_Addr

LDR PC, Prefetch_Addr

LDR PC, Abort_Addr

NOP ;保留向量

LDR PC, IRQ_Addr

LDR PC, FIQ_Addr

Reset_Addr DCD Start_Boot

Undefined_Addr DCD Undefined_Handler

SWI_Addr DCD SWI_Handler

Prefetch_Addr DCD Prefetch_Handler

Abort_Addr DCD Abort_Handler

DCD 0 ;保留向量

IRQ_Addr DCD IRQ_Handler

FIQ_Addr DCD FIQ_Handler



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>