<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í)間:2016-11-21 來(lái)源:網(wǎng)絡(luò ) 收藏
6.1 ARM 體系的異常中斷
6.1.1 異常中斷的種類(lèi)
當ARM 系統正常的程序執行流程發(fā)生暫時(shí)的停止時(shí),稱(chēng)之為異常,ARM 系統對異常的
響應過(guò)程稱(chēng)之為異常中斷。例如當ARM 系統檢測到外部的復位信號有效,ARM 系統的程
序就會(huì )跳轉到復位處理程序。在處理異常之前,ARM 內核保存當前的處理器狀態(tài),這樣當
處理程序結束時(shí)可以恢復執行原來(lái)的程序。當然ARM 體系的產(chǎn)生異常中斷后,會(huì )按照一定
的程序進(jìn)行中斷處理。下面我們分別介紹ARM 系統異常,ARM 體系異常中斷包括復位、
未定義的指令、軟件中斷,指令預取中斷等。
●復位(Reset ):當處理器的復位引腳有效時(shí),系統產(chǎn)生復位異常中斷,程序跳轉到復位異
常中斷處理程序處執行。復位異常中斷通常用在下面兩種情況:①系統加電時(shí) ②系統復位
時(shí)。
●未定義的指令(undefined instruction):當ARM 處理器或者時(shí)系統中是協(xié)處理器認為當前指
令未定義時(shí),產(chǎn)生未定義指令異常中斷??梢酝ㄟ^(guò)該異常中斷機仿真浮點(diǎn)向量的運算。
●軟件中斷(Soft interrupt SWI):這時(shí)有用戶(hù)定義的中斷指令??捎糜谟脩?hù)模式下的程序調
試特權操作指令。在實(shí)際的操作中可以通過(guò)該機制實(shí)現系統功能的調用。
●指令預取中止(Prefech Abort) :如果處理器預取的指令的地址不存在,或者該地址不允許
當前指令訪(fǎng)問(wèn),當該預取的指令執行時(shí),處理器產(chǎn)生指令預取中止異常中斷。
數據訪(fǎng)問(wèn)中止(Data Abort):如果數據訪(fǎng)問(wèn)指令的目標地址不存在,或許該地址不允許當前
指令訪(fǎng)問(wèn),處理器產(chǎn)生。
●外部中斷請求(IRQ):當處理器的外部中斷請求引腳有效,而且 CPSR 寄存器的 1 位控
制位被清除時(shí),處理器產(chǎn)生外部中斷請求(IRQ)異常中斷。系統中個(gè)外設通常通過(guò)該異常
中斷請求處理器服務(wù)。
●快速中斷請求(FIQ ):當處理器外部快速中斷請求引腳有效,而且 CPSR 寄存器的 F
制位被清除時(shí),處理器產(chǎn)生外部中斷請求(FIQ )異常中斷。
6.1.2 處理異常中斷的寄存器
中止模式(Abort abt ) 用于虛擬存儲及存儲保護
未定義指令模式(Undefined und ) 用于支持通過(guò)軟件仿真硬件的協(xié)處理器
系統模式(System sys) 用于運行特權級的操作系統
各種不同的處理器模式可能有對應于該處理器的物理寄存器組,如表 6.2 所示。其中,
R13_svc 表示特權模式下的R13 寄存器,R_13abt 表示中止模式下的R13 寄存器,其余的各
寄存器名稱(chēng)含義類(lèi)推。
表 6.2 各處理器模式物理寄存器組
用戶(hù)模式 系統模式 特權模式 中止模式 未定義指令模式 外部中斷模式 快速中斷模式
R0 R0 R0 R0 R0 R0 R0
R1 R1 R1 R1 R1 R1 R1
R2 R2 R2 R2 R2 R2 R2
R3 R3 R3 R3 R3 R3 R3
R4 R4 R4 R4 R4 R4 R4
R5 R5 R5 R5 R5 R5 R5
R6 R6 R6 R6 R6 R6 R6
R7 R7 R7 R7 R7 R7 R7
R8 R8 R8 R8 R8 R8 R8_fiq
R9 R9 R9 R9 R9 R9 R9_fiq
R10 R10 R10 R10 R10 R10 R10_fiq
R11 R11 R11 R11 R11 R11 R11_fiq
R12 R12 R12 R12 R12 R12 R12_fiq
R13 R13 R13_svc R13_abt R13_und R13_irq R13_fiq
R14 R14 R14_svc R14_abt R14_und R14_irq R14_fiq
PC PC PC PC PC PC PC
CPSR CPSR CPSR CPSR CPSR CPSR CPSR
SPSR_svs SPSR_abt SPSR_und SPSR_irq SPSR_fiq
如果異常中斷處理程序中使用它自己的物理寄存器之外的其他寄存器,異常中段處理程序
必須保存和恢復這些寄存器。
上表中各物理寄存器的名稱(chēng)在A(yíng)RM 匯編語(yǔ)言中并沒(méi)有被預定義。用戶(hù)使用這些寄存器時(shí),
必須使用偽操作RN 來(lái)定義這些名稱(chēng)。例如我們要使用寄存器R13_abt 可以使用下面的語(yǔ)句。
R13_abt RN R13
當幾個(gè)異常中斷同時(shí)發(fā)生時(shí),就必須按照一定的次序來(lái)處理這些異常中斷。在A(yíng)RM 中通
過(guò)給各異常中斷賦予一定的優(yōu)先級來(lái)實(shí)現這種處理次序。當然有些異常中斷時(shí)不可能同時(shí)發(fā)
生的,如指令預取中止異常中斷和阮籍異常中斷時(shí)由同一條指令的執行觸發(fā),它們時(shí)不可能
同時(shí)發(fā)生的。處理器執行一個(gè)特定的異常中斷的過(guò)程中,稱(chēng)為處理器處于特定的中斷模式。
各異常中斷的中斷向量地址以及中斷的處理優(yōu)先級如表 6.3 所示。
表 6.3 各異常中斷的中斷向量地址以及中斷的處理優(yōu)先級
中斷向量地址 異常中斷類(lèi)型 異常中斷模式 優(yōu)先級(6 級最低)
0x0 復位 特權模式(SVC) 1
0x4 未定義的指令 未定義的指令中止模式 6
0x8 軟件中斷 特權模式 6
0x10 數據訪(fǎng)問(wèn)中止 中止模式 2
0x14 保留 未使用 未使用
0x18 外部中斷請求 外部中斷模式 4
0x1c 快速中斷請求 快速中斷模式 3
6.1.4 進(jìn)入異常中斷
ARM 處理器對異常中斷的響應過(guò)程如下:
(1) 保存處理器當前狀態(tài)、中斷屏蔽位以及各條件標志位。這是通過(guò)將當前程序狀態(tài)寄
存器 CPSR 的內容保存到將要執行的異常中斷對應的SPSR 寄存器中實(shí)現的。各異
常中斷有自己的物理 SPSR 寄存器。
(2 ) 設置當前程序狀態(tài)寄存器CPSR 中相應的位。包括設置CPSR 中的位,使處理器進(jìn)
入相應的執行模式;設置 CPSR 中的位,禁止IRQ 中斷,當進(jìn)入FIQ 模式時(shí),禁
止FIQ 中斷。
(3) 將寄存器lr_mode 設置成返回地址。
(4 ) 將程序計數器值(PC ),設置成該異常中斷的中斷向量地址,從而跳轉到相應的異
常中斷處理程序執行。
下面我們將分別介紹各種異常中斷響應時(shí)ARM 系統執行的指令。
1.響應復位異常中斷
當處理器的復位引腳有效時(shí),處理器中止當前指令。當處理器的復位引腳變成無(wú)效時(shí),
處理器開(kāi)始執行下面的操作。
R14_svc=UNPREDICTABLE value
SPSR_svs=UNPREDICTABLE value
CPSR[4:0]=0b10011
CPSR[5]=0
CPSR[6]=1
CPSR[7]=1
If high vectors configured then
PC=0Xffff0000
Else
PC=0x00000000
2. 響應未定義指令異常中斷
處理器響應未定義指令異常中斷時(shí)的處理過(guò)程如下面的偽指令所示。
R14_und=address of next interaction after the undefined instruction
SPSR_und=CPSR
CPSR[4:0]=0b11011
CPSR[5]=0
CPSR[7]=1
if high vectors configured then
PC=0Xffff0004
Else
PC=0x00000004
3. 響應 SWI 異常中斷
處理器響應 SWI 異常中斷時(shí)的處理過(guò)程如下面的偽代碼所示。
R14_svc=address of next instruction after the SWI instruction
SPSR_svc=CPSR
CPSR[4:0]=0b10011
CPSR[5]=0
If high vectors configured then
PC=0Xffff0000
Else
PC=0x00000000
4. 響應指令預取中止異常中斷
處理響應指令預取中止異常中斷時(shí)的處理過(guò)程如下面的偽代碼所示。
R14_aht=address of the aborted instruction + 4
SPSR_abt=CPSR
CPSR[4:0]=0b10111
CPSR[5]=0
CPSR[6]=1
CPSR[7]=1
If high vectors configured then
PC=0Xffff001C
Else
PC=0x0000001c
6.1.5 退出異常中斷
ARM 系統處理完中斷后從異常中斷處理程序中返回包括下面的步驟。
● 恢復被中斷的程序的處理狀態(tài),即將 SPSR_mode 寄存器內容復制到當前程序狀態(tài)
寄存器 CPSR中。
● 返回到發(fā)生異常中斷的指令的下一條指令處執行。即將 lr_mode 寄存器的內容復
制程序計數器 PC 中。
因為整個(gè)應用系統時(shí)從復位異常中斷處理程序執行的,所以復位異常中斷處理程序不需要返
回。
實(shí)際上,當異常中斷發(fā)生時(shí),程序程序計數器 PC 所致的位置對于各種不同的異常中斷是
不同的。同樣,返回地址對于各種不同的異常中斷也是不同的。
下面我們分別介紹各種異常中斷處理程序的返回方法。
1.SWI 和未定義指令異常中斷處理程序的返回
SWI 和未定義指令異常中斷是由當前執行的指令自身產(chǎn)生的,當 SWI 和未定義指令異常中斷
產(chǎn)生時(shí),程序及順氣 PC的值還未更新,它指向當前指令后面第 2 指令(對于 ARM指令來(lái)說(shuō),
它指向當前指令地址加 8 個(gè)字節的位置;對于 Thumb 指令來(lái)說(shuō),它指向當前指令地址加 4
個(gè)字節的位置)。當 SWI 和未定義指令異常中斷發(fā)生時(shí),處理器將值(PC-4)保存到異常模
式下的寄存器 lr_mode中。這時(shí)(PC-4)即指向當前的下一條指令。因此返回操作可以通過(guò)
下面的指令來(lái)實(shí)現:
MOV PC,LR
該指令將寄存器 LR 中的值復制到程序計數器 PC 中,實(shí)現程序返回,同時(shí)將 SPSR_mode
寄存器內容復制到當前程序狀態(tài)寄存器 CPSR 中。
當異常中斷處理程序中使用了數據棧時(shí),可以通過(guò)下面的指令在進(jìn)入異常中斷處理程序時(shí)
保存被中斷程序的執行現場(chǎng),在退出異常中斷處理程序時(shí)恢復被中斷程序執行現場(chǎng)。異常中
斷處理程序中使用的數據棧由用戶(hù)提供。
STMFD SP! ,(reglist lr)
; ...
LDMFD SP! ,reglist pc)^
在上述指令中,reglist 是異常中斷處理程序使用的寄存器立表。標識符^指示將
SPSR_mode 寄存器內容復制到當前程序狀態(tài)寄存器 CPSR 中。該指令只能在特權模式下使用。
2.IRQ和 FIQ 異常中斷處理程序的返回
通常處理器執行完當前指令后,查詢(xún) IRQ 中斷引腳及 FIQ 中斷引腳,并且查看系統時(shí)否允
許 IRQ 中斷及 FIQ 中斷。如果有中斷引腳有效,并且系統允許該中斷產(chǎn)生,處理器將產(chǎn)生
IRQ 異常中斷或 FIQ 異常中斷。當 IRQ 和FIQ 異常中斷產(chǎn)生時(shí),程序計數器 PC 的值也經(jīng)更
新,它指向當前指令后面第 3 條指令(對預 ARM 指令來(lái)說(shuō),它指向當前指令地址加 12 個(gè)字
節的位置;對于 Thumb 指令來(lái)說(shuō),它指向當前指令地址加 6 個(gè)字節的位置)。當 IRQ 和 FIQ
異常中斷發(fā)生時(shí),處理器將值(PC-4)保存到異常模式下的寄存器 lr_mode 中。這時(shí)(PC-4)
即指向當前指令后的第 2 條指令。因此返回操作可以通過(guò)下面的指令來(lái)實(shí)現:
SUBS PC , LD, #4
該指令將寄存器LR中的值減4后,復制到程序計數器PC中,實(shí)現程序返回,同時(shí)將SPSR_mode
寄存器內容復制到當前程序狀態(tài)寄存器 CPSR 中。
當異常中斷處理程序中使用了數據棧時(shí),可以通過(guò)下面的指令進(jìn)入異常中斷處理程序時(shí)保存
被中斷程序的執行現場(chǎng)。異常中斷處理程序中使用的數據棧由用戶(hù)提供。
SUBS LR,LR,#4
STMFD SP!,{reglistl,lr}
; ...
LDMFD SP!{reglist ,pc}^
在上述指令中,reglist 是異常中斷處理程序中使用的寄存器列表。標識符^指示將
SPSR_mode 寄存器內容復制到當前程序程序寄存器 CPSR 中。該指令只能在特權模式下使用。
3.預取中止異常中斷處理程序的返回
在指令預取時(shí),如果目標地址時(shí)非法的,該指令將被標記稱(chēng)有問(wèn)題的指令。這時(shí),流水線(xiàn)上
該指令之前的指令繼續執行。當執行到該被標記稱(chēng)有問(wèn)題的指令時(shí),處理器產(chǎn)生指令預取中
止異常中斷。
當發(fā)生指令預取中止異常中斷時(shí),程序要返回到該有問(wèn)題的指令處,重新讀取并執行該
指令。因此指令預取中止異常中斷程序應該返回到產(chǎn)生該指令預取中止異常中斷的指令處。
而不是像前面兩種情況下返回到發(fā)生中斷的指令的下一條指令。
指令預取中止異常中斷時(shí)由當前執行的指令自身產(chǎn)生的,當指令預取中止異常中斷產(chǎn)生
時(shí),程序計數器 PC 的值還未更新,指向它當前指令后面第 2 條指令(對于 ARM 指令來(lái)說(shuō),
它指向當前指令地址加 8 各字節的位置;對于 Thumb 指令來(lái)說(shuō),它指向當前指令地址 4個(gè)字
節的位置)。當指令預取中止異常中斷發(fā)生時(shí),處理器將值(PC-4)保存到異常模式下的寄
存器 lr_mode 中。這時(shí)(PC-4)即指向當前指令的下一條指令。因此返回操作可以通過(guò)下面
的指令來(lái)實(shí)現:
SUSB PC , LR ,#4
該指令將寄存器 LR 中的值減 4 后,復制到程序計數器 PC 中,實(shí)現程序的返回,同時(shí)將
SPSR_mode 寄存器內容復制到當前程序狀態(tài)寄存器 CPSR 中。
當異常中斷處理程序中使用了數據棧時(shí),可以通過(guò)下面的指令在進(jìn)入異常中斷處理程序
時(shí)保存被中斷程序的執行現場(chǎng),在推出異常中斷處理程序時(shí)恢復被中斷程序的執行現場(chǎng)。異
常中斷處理程序中使用的數據棧由用戶(hù)提供。
SUBS LR ,LR ,#4
STMFD SP! ,{reglist ,lr}
;…
LDMFD SP!,{reglist ,pc}^
在上述指令中,reglist 是異常中斷處理程序中使用的寄存器列表。標識符^指示將
SPSR_mode 寄存器內容復制到當前程序狀態(tài)寄存器 CPSR 中。該指令只能在特權模式下使用。
4.數據訪(fǎng)問(wèn)中止異常中斷處理程序返回
當發(fā)生數據訪(fǎng)問(wèn)中止異常中斷時(shí),程序要返回到該有問(wèn)題的數據訪(fǎng)問(wèn)處,重新訪(fǎng)問(wèn)該數
據,因此數據訪(fǎng)問(wèn)中止異常中斷程序應該返回到產(chǎn)生該數據訪(fǎng)問(wèn)中止異常中斷的指令
處,而不是像前面兩種情況下返回到當前指令的下一條指令。
數據訪(fǎng)問(wèn)中止異常中斷是由數據訪(fǎng)問(wèn)指令產(chǎn)生的,當數據訪(fǎng)問(wèn)中止異常中斷產(chǎn)生
時(shí),程序計數器 PC 的值已經(jīng)更新,它指向當前指令后面第二條指令(對于 ARM 指令來(lái)
說(shuō),它指向當前指令地址加 8 個(gè)字節的位置;對于 Thumb指令來(lái)說(shuō),它指向當前指令地
址加 4 個(gè)字節的位置)。當數據訪(fǎng)問(wèn)中止異常中斷發(fā)生時(shí),處理器將值(PC-4)保存到
異常模式下的寄存器 lr_mode 中。這時(shí)(PC-4)即指向當前指令的后第二條指令。因此
返回操作可以通過(guò)下面的指令來(lái)實(shí)現:
SUSB PC ,LR #8
該指令將寄存器 LR 中的值減 8 后,復制到程序計數器 PC中,實(shí)現程序返回,同
時(shí)將 SPSR_mode 寄存器內容復制到當前程序狀態(tài)寄存器 CPSR中。
當異常中斷處理程序中使用了數據棧時(shí),可以通過(guò)下面的指令在進(jìn)入異常中斷處理
程序時(shí)保存被中斷程序保存的執行現場(chǎng),在退出異常中斷處理程序時(shí)恢復被中斷程序的
執行現場(chǎng)。異常中斷處理程序中使用的數據棧由用戶(hù)提供。
SUSB LR ,LR #8
STMFD SP ! ,{eglist ,lr}
;...
LDMFD SP !{reglist,pc}^
在上述指令中,reglist是異常中斷處理程序中使用的寄存器列表。標識符^指示將
SPSR_mode 寄存器內容復制到當前程序狀態(tài)寄存器 CPSR 中。該指令只能在特權模式下
使用。



關(guān)鍵詞: ARM體系異常中

評論


技術(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>