在ARM體系中,通常有以下3種方式控制程序的執(zhí)行流程:
? 在正常程序執(zhí)行過(guò)程中,每執(zhí)行一條ARM指令,程序計(jì)數(shù)器寄存器(PC)的值加4個(gè)字節(jié);每執(zhí)行一條Thumb指令,程序計(jì)數(shù)器寄存器(PC)的值加2個(gè)字節(jié)。整個(gè)過(guò)程是順序執(zhí)行。
? 通過(guò)跳轉(zhuǎn)指令,程序可以跳轉(zhuǎn)到特定的地址標(biāo)號(hào)處執(zhí)行,或者跳轉(zhuǎn)到特定的子程序處執(zhí)行。其中,B指令用于執(zhí)行跳轉(zhuǎn)操作;BL指令在執(zhí)行跳轉(zhuǎn)操作的同時(shí),保存子程序的返回地址;BX指令在執(zhí)行跳轉(zhuǎn)操作的同時(shí),根據(jù)目標(biāo)地址的最低位可以將程序狀態(tài)切換到Thumb狀態(tài);BLX指令執(zhí)行3個(gè)操作:跳轉(zhuǎn)到目標(biāo)地址處執(zhí)行,保存了子程序的返回地址,根據(jù)目標(biāo)地址的最低位可以將程序狀態(tài)切換到Thumb狀態(tài)。
? 當(dāng)異常中斷發(fā)生時(shí),系統(tǒng)執(zhí)行完當(dāng)前指令后,將跳轉(zhuǎn)到相應(yīng)的異常中斷處理程序處執(zhí)行。在當(dāng)異常中斷處理程序執(zhí)行完成后,程序返回到發(fā)生中斷的指令的下一條指令處執(zhí)行。在進(jìn)入異常中斷處理程序時(shí),要保存被中斷的程序的執(zhí)行現(xiàn)場(chǎng),在從異常中斷處理程序退出時(shí),要恢復(fù)被中斷的程序的執(zhí)行現(xiàn)場(chǎng)。
ARM體系中異常中斷種類:
? 復(fù)位(Reset):當(dāng)處理器的復(fù)位引腳有效時(shí),系統(tǒng)產(chǎn)生復(fù)位異常中斷,程序跳轉(zhuǎn)到復(fù)位異常中斷處理程序處執(zhí)行。復(fù)位異常中斷通常用在下面兩種情況:系統(tǒng)加電時(shí)和系統(tǒng)復(fù)位時(shí)。跳轉(zhuǎn)到復(fù)位中斷向量處執(zhí)行,稱為軟復(fù)位。
? 未定義指令(Undefined Instruction):當(dāng)ARM處理器或者是系統(tǒng)中的協(xié)處理器認(rèn)為當(dāng)前指令未定義時(shí),產(chǎn)生未定義的指令異常中斷。
? 軟件中斷(Software Interrupt SWI):這是一個(gè)由用戶定義的中斷指令。可用于用戶模式下的程序調(diào)用特權(quán)操作指令。在實(shí)時(shí)操作系統(tǒng)中可以通過(guò)該機(jī)制實(shí)現(xiàn)系統(tǒng)功能調(diào)用。
? 指令預(yù)取中止(Prefetch Abort):如果處理器預(yù)取的指令的地址不存在,或者該地址不允許當(dāng)前指令訪問(wèn),當(dāng)該被預(yù)取的指令執(zhí)行時(shí),處理器產(chǎn)生指令預(yù)取中止異常中斷。
? 數(shù)據(jù)訪問(wèn)中止(Data Abort):如果數(shù)據(jù)訪問(wèn)指令的目標(biāo)地址不存在,或者該地址不允許當(dāng)前指令訪問(wèn),處理器產(chǎn)生數(shù)據(jù)訪問(wèn)中止異常中斷。
? 外部中斷請(qǐng)求(IRQ):當(dāng)處理器的外部中斷請(qǐng)求引腳有效,而且CPSR寄存器的I控制位被清除時(shí),處理器產(chǎn)生外部中斷請(qǐng)求(IRQ)異常中斷。系統(tǒng)中各外設(shè)通常通過(guò)該異常中斷請(qǐng)求處理器服務(wù)。
? 快速中斷請(qǐng)求(FIQ):當(dāng)處理器的外部快速中斷請(qǐng)求引腳有效,而且CPSR寄存器的F控制位被清除時(shí),處理器產(chǎn)生外部中斷請(qǐng)求(FIQ)異常中斷。
對(duì)異常中斷的響應(yīng)過(guò)程(這幾點(diǎn)都是ARM核自己已經(jīng)完成的動(dòng)作):
? 保存處理器當(dāng)前狀態(tài)、中斷屏蔽位以及各條件標(biāo)志為。這是通過(guò)將當(dāng)前程序狀態(tài)寄存器CPSR的內(nèi)容保存到將要執(zhí)行的異常中斷對(duì)應(yīng)的SPSR寄存器中實(shí)現(xiàn)的。各異常中斷有自己的物理SPSR寄存器。
? 設(shè)置當(dāng)前程序狀態(tài)寄存器CPSR中相應(yīng)的為。包括:設(shè)置CPSR中的位,使處理器進(jìn)入當(dāng)前相應(yīng)的執(zhí)行模式(處理器模式);設(shè)置CPSR中的位,禁止IRQ中斷,當(dāng)進(jìn)入FIQ模式時(shí),禁止FIQ中斷。
? 將寄存器lr_mode設(shè)置成返回地址。
? 將程序計(jì)數(shù)器值(PC),設(shè)置成該異常中斷的中斷向量地址,從而跳轉(zhuǎn)到相應(yīng)的異常中斷處理程序處執(zhí)行。
從異常中斷處理程序中返回(這些返回動(dòng)作是需要自己寫代碼完成的):
? 恢復(fù)被中斷的程序的處理器狀態(tài),即將SPSR_mode寄存器內(nèi)容復(fù)制到CPSR中。
? 返回到發(fā)生異常中斷的指令的下一條指令執(zhí)行,即將lr_mode寄存器的內(nèi)容復(fù)制到程序計(jì)算器PC中。
復(fù)位異常中斷處理程序不需要返回。在復(fù)位異常中斷處理程序開(kāi)始整個(gè)用戶程序的執(zhí)行,因而它不需要返回。
-
寄存器
+關(guān)注
關(guān)注
31文章
5343瀏覽量
120426 -
ARM處理器
+關(guān)注
關(guān)注
6文章
360瀏覽量
41760
原文標(biāo)題:ARM異常中斷處理
文章出處:【微信號(hào):mcugeek,微信公眾號(hào):MCU開(kāi)發(fā)加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論