ARM 體系的異常中斷
6.1.1 異常中斷的種類(lèi)
響應過(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) 用于運行特權級的操作系統
R13_svc 表示特權模式下的R13 寄存器,R_13abt 表示中止模式下的R13 寄存器,其余的各
寄存器名稱(chēng)含義類(lèi)推。
用戶(hù)模式 系統模式 特權模式 中止模式 未定義指令模式 外部中斷模式 快速中斷模式
CPSR CPSR CPSR CPSR CPSR CPSR CPSR
必須保存和恢復這些寄存器。
必須使用偽操作RN 來(lái)定義這些名稱(chēng)。例如我們要使用寄存器R13_abt 可以使用下面的語(yǔ)句。
過(guò)給各異常中斷賦予一定的優(yōu)先級來(lái)實(shí)現這種處理次序。當然有些異常中斷時(shí)不可能同時(shí)發(fā)
生的,如指令預取中止異常中斷和阮籍異常中斷時(shí)由同一條指令的執行觸發(fā),它們時(shí)不可能
同時(shí)發(fā)生的。處理器執行一個(gè)特定的異常中斷的過(guò)程中,稱(chēng)為處理器處于特定的中斷模式。
各異常中斷的中斷向量地址以及中斷的處理優(yōu)先級如表 6.3 所示。
中斷向量地址 異常中斷類(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)入異常中斷
6.1.5 退出異常中斷
ARM 系統處理完中斷后從異常中斷處理程序中返回包括下面的步驟。
因為整個(gè)應用系統時(shí)從復位異常中斷處理程序執行的,所以復位異常中斷處理程序不需要返
回。
不同的。同樣,返回地址對于各種不同的異常中斷也是不同的。
下面我們分別介紹各種異常中斷處理程序的返回方法。
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
寄存器內容復制到當前程序狀態(tài)寄存器 CPSR 中。
保存被中斷程序的執行現場(chǎng),在退出異常中斷處理程序時(shí)恢復被中斷程序執行現場(chǎng)。異常中
斷處理程序中使用的數據棧由用戶(hù)提供。
SPSR_mode 寄存器內容復制到當前程序狀態(tài)寄存器 CPSR 中。該指令只能在特權模式下使用。
2.IRQ和 FIQ 異常中斷處理程序的返回
許 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í)現:
該指令將寄存器LR中的值減4后,復制到程序計數器PC中,實(shí)現程序返回,同時(shí)將SPSR_mode
寄存器內容復制到當前程序狀態(tài)寄存器 CPSR 中。
當異常中斷處理程序中使用了數據棧時(shí),可以通過(guò)下面的指令進(jìn)入異常中斷處理程序時(shí)保存
被中斷程序的執行現場(chǎng)。異常中斷處理程序中使用的數據棧由用戶(hù)提供。
SPSR_mode 寄存器內容復制到當前程序程序寄存器 CPSR 中。該指令只能在特權模式下使用。
3.預取中止異常中斷處理程序的返回
在指令預取時(shí),如果目標地址時(shí)非法的,該指令將被標記稱(chēng)有問(wèn)題的指令。這時(shí),流水線(xiàn)上
該指令之前的指令繼續執行。當執行到該被標記稱(chēng)有問(wèn)題的指令時(shí),處理器產(chǎn)生指令預取中
止異常中斷。
指令。因此指令預取中止異常中斷程序應該返回到產(chǎn)生該指令預取中止異常中斷的指令處。
而不是像前面兩種情況下返回到發(fā)生中斷的指令的下一條指令。
時(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í)保存被中斷程序的執行現場(chǎng),在推出異常中斷處理程序時(shí)恢復被中斷程序的執行現場(chǎng)。異
常中斷處理程序中使用的數據棧由用戶(hù)提供。
SPSR_mode 寄存器內容復制到當前程序狀態(tài)寄存器 CPSR 中。該指令只能在特權模式下使用。
4.數據訪(fǎng)問(wèn)中止異常中斷處理程序返回
評論