2.1 ARM微處理器的工作狀態(tài)
從編程的角度看,,ARM微處理器的工作狀態(tài)一般有兩種,并可在兩種狀態(tài)之間切換:
- 第一種為ARM狀態(tài),,此時(shí)處理器執(zhí)行32位的字對(duì)齊的ARM指令,;
- 第二種為Thumb狀態(tài),,此時(shí)處理器執(zhí)行16位的,、半字對(duì)齊的Thumb指令。
當(dāng)ARM微處理器執(zhí)行32位的ARM指令集時(shí),,工作在ARM狀態(tài),;當(dāng)ARM微處理器執(zhí)行16位的Thumb指令集時(shí),工作在Thumb狀態(tài),。在程序的執(zhí)行過(guò)程中,,微處理器可以隨時(shí)在兩種工作狀態(tài)之間切換,并且,,處理器工作狀態(tài)的轉(zhuǎn)變并不影響處理器的工作模式和相應(yīng)寄存器中的內(nèi)容,。
狀態(tài)切換方法:
ARM指令集和Thumb指令集均有切換處理器狀態(tài)的指令,,并可在兩種工作狀態(tài)之間切換,但ARM微處理器在開(kāi)始執(zhí)行代碼時(shí),,應(yīng)該處于ARM狀態(tài)。
進(jìn)入Thumb狀態(tài):當(dāng)操作數(shù)寄存器的狀態(tài)位(位0)為1時(shí),,可以采用執(zhí)行BX指令的方法,,使微處理器從ARM狀態(tài)切換到Thumb狀態(tài)。此外,,當(dāng)處理器處于Thumb狀態(tài)時(shí)發(fā)生異常(如IRQ,、FIQ,、Undef,、Abort、SWI等),,則異常處理返回時(shí),,自動(dòng)切換到Thumb狀態(tài)。
進(jìn)入ARM狀態(tài):當(dāng)操作數(shù)寄存器的狀態(tài)位為0時(shí),,執(zhí)行BX指令時(shí)可以使微處理器從Thumb狀態(tài)切換到ARM狀態(tài),。此外,,在處理器進(jìn)行異常處理時(shí),,把PC指針?lè)湃氘惓DJ芥溄蛹拇嫫髦?,并從異常向量地址開(kāi)始執(zhí)行程序,也可以使處理器切換到ARM狀態(tài),。
2.2 ARM體系結(jié)構(gòu)的存儲(chǔ)器格式
ARM體系結(jié)構(gòu)將存儲(chǔ)器看作是從零地址開(kāi)始的字節(jié)的線性組合,。從零字節(jié)到三字節(jié)放置第一個(gè)存儲(chǔ)的字?jǐn)?shù)據(jù),從第四個(gè)字節(jié)到第七個(gè)字節(jié)放置第二個(gè)存儲(chǔ)的字?jǐn)?shù)據(jù),,依次排列,。作為32位的微處理器,,ARM體系結(jié)構(gòu)所支持的最大尋址空間為4GB(232字節(jié))。
ARM體系結(jié)構(gòu)可以用兩種方法存儲(chǔ)字?jǐn)?shù)據(jù),,稱之為大端格式和小端格式,,具體說(shuō)明如下:
大端格式:
在這種格式中,字?jǐn)?shù)據(jù)的高字節(jié)存儲(chǔ)在低地址中,,而字?jǐn)?shù)據(jù)的低字節(jié)則存放在高地址中,,如圖2.1所示:
小端格式:
與大端存儲(chǔ)格式相反,在小端存儲(chǔ)格式中,,低地址中存放的是字?jǐn)?shù)據(jù)的低字節(jié),,高地址存放的是字?jǐn)?shù)據(jù)的高字節(jié)。如圖2.2所示:
2.3 指令長(zhǎng)度及數(shù)據(jù)類型
ARM微處理器的指令長(zhǎng)度可以是32位(在ARM狀態(tài)下),,也可以為16位(在Thumb狀態(tài)下),。
ARM微處理器中支持字節(jié)(8位)、半字(16位),、字(32位)三種數(shù)據(jù)類型,,其中,字需要4字節(jié)對(duì)齊(地址的低兩位為0),、半字需要2字節(jié)對(duì)齊(地址的最低位為0),。
2.4 處理器模式
ARM微處理器支持7種運(yùn)行模式,分別為:
─ 用戶模式(usr): ARM處理器正常的程序執(zhí)行狀態(tài)
─ 快速中斷模式(fiq): 用于高速數(shù)據(jù)傳輸或通道處理
─ 外部中斷模式(irq): 用于通用的中斷處理
─ 管理模式(svc): 操作系統(tǒng)使用的保護(hù)模式
─ 數(shù)據(jù)訪問(wèn)終止模式(abt): 當(dāng)數(shù)據(jù)或指令預(yù)取終止時(shí)進(jìn)入該模式,,可用于虛擬存儲(chǔ)及存儲(chǔ)保護(hù),。
─ 系統(tǒng)模式(sys): 運(yùn)行具有特權(quán)的操作系統(tǒng)任務(wù)。
─ 未定義指令中止模式(und):當(dāng)未定義的指令執(zhí)行時(shí)進(jìn)入該模式,,可用于支持硬件協(xié)處理器的軟件仿真,。
ARM微處理器的運(yùn)行模式可以通過(guò)軟件改變,也可以通過(guò)外部中斷或異常處理改變,。
大多數(shù)的應(yīng)用程序運(yùn)行在用戶模式下,,當(dāng)處理器運(yùn)行在用戶模式下時(shí),某些被保護(hù)的系統(tǒng)資源是不能被訪問(wèn)的,。
除用戶模式以外,,其余的所有6種模式稱之為非用戶模式,或特權(quán)模式(Privileged Modes),;其中除去用戶模式和系統(tǒng)模式以外的5種又稱為異常模式(Exception Modes),常用于處理中斷或異常,,以及需要訪問(wèn)受保護(hù)的系統(tǒng)資源等情況,。
2.5 寄存器組織
ARM微處理器共有37個(gè)32位寄存器,其中31個(gè)為通用寄存器,,6個(gè)為狀態(tài)寄存器,。但是這些寄存器不能被同時(shí)訪問(wèn),,具體哪些寄存器是可編程訪問(wèn)的,取決微處理器的工作狀態(tài)及具體的運(yùn)行模式,。但在任何時(shí)候,,通用寄存器R14~R0、程序計(jì)數(shù)器PC,、一個(gè)或兩個(gè)狀態(tài)寄存器都是可訪問(wèn)的,。
2.5.1 ARM狀態(tài)下的寄存器組織
通用寄存器:
通用寄存器包括R0~R15,可以分為三類:
─ 未分組寄存器R0~R7,;
─ 分組寄存器R8~R14
─ 程序計(jì)數(shù)器PC(R15)
未分組寄存器R0~R7:
在所有的運(yùn)行模式下,,未分組寄存器都指向同一個(gè)物理寄存器,他們未被系統(tǒng)用作特殊的用途,,因此,,在中斷或異常處理進(jìn)行運(yùn)行模式轉(zhuǎn)換時(shí),由于不同的處理器運(yùn)行模式均使用相同的物理寄存器,,可能會(huì)造成寄存器中數(shù)據(jù)的破壞,,這一點(diǎn)在進(jìn)行程序設(shè)計(jì)時(shí)應(yīng)引起注意。
分組寄存器R8~R14
對(duì)于分組寄存器,,他們每一次所訪問(wèn)的物理寄存器與處理器當(dāng)前的運(yùn)行模式有關(guān),。
對(duì)于R8~R12來(lái)說(shuō),每個(gè)寄存器對(duì)應(yīng)兩個(gè)不同的物理寄存器,,當(dāng)使用fiq模式時(shí),,訪問(wèn)寄存器R8_fiq~R12_fiq;當(dāng)使用除fiq模式以外的其他模式時(shí),,訪問(wèn)寄存器R8_usr~R12_usr,。
對(duì)于R13、R14來(lái)說(shuō),,每個(gè)寄存器對(duì)應(yīng)6個(gè)不同的物理寄存器,,其中的一個(gè)是用戶模式與系統(tǒng)模式共用,另外5個(gè)物理寄存器對(duì)應(yīng)于其他5種不同的運(yùn)行模式,。
采用以下的記號(hào)來(lái)區(qū)分不同的物理寄存器:
R13_<mode>
R14_<mode>
其中,,mode為以下幾種模式之一:usr、fiq,、irq,、svc、abt,、und,。
寄存器R13在ARM指令中常用作堆棧指針,但這只是一種習(xí)慣用法,,用戶也可使用其他的寄存器作為堆棧指針,。而在Thumb指令集中,,某些指令強(qiáng)制性的要求使用R13作為堆棧指針。
由于處理器的每種運(yùn)行模式均有自己獨(dú)立的物理寄存器R13,,在用戶應(yīng)用程序的初始化部分,,一般都要初始化每種模式下的R13,使其指向該運(yùn)行模式的??臻g,,這樣,當(dāng)程序的運(yùn)行進(jìn)入異常模式時(shí),,可以將需要保護(hù)的寄存器放入R13所指向的堆棧,,而當(dāng)程序從異常模式返回時(shí),則從對(duì)應(yīng)的堆棧中恢復(fù),,采用這種方式可以保證異常發(fā)生后程序的正常執(zhí)行,。
R14也稱作子程序連接寄存器(Subroutine Link Register)或連接寄存器LR。當(dāng)執(zhí)行BL子程序調(diào)用指令時(shí),,R14中得到R15(程序計(jì)數(shù)器PC)的備份,。其他情況下,R14用作通用寄存器,。與之類似,,當(dāng)發(fā)生中斷或異常時(shí),對(duì)應(yīng)的分組寄存器R14_svc,、R14_irq,、R14_fiq、R14_abt和R14_und用來(lái)保存R15的返回值,。
寄存器R14常用在如下的情況:
在每一種運(yùn)行模式下,,都可用R14保存子程序的返回地址,當(dāng)用BL或BLX指令調(diào)用子程序時(shí),,將PC的當(dāng)前值拷貝給R14,,執(zhí)行完子程序后,又將R14的值拷貝回PC,,即可完成子程序的調(diào)用返回,。以上的描述可用指令完成:
1、執(zhí)行以下任意一條指令:
MOV PC,,LR
BX LR
2,、在子程序入口處使用以下指令將R14存入堆棧:
STMFD SP!,{<Regs>,LR}
對(duì)應(yīng)的,,使用以下指令可以完成子程序返回:
LDMFD SP,!,{<Regs>,PC}
R14也可作為通用寄存器。
程序計(jì)數(shù)器PC(R15)
寄存器R15用作程序計(jì)數(shù)器(PC),。在ARM狀態(tài)下,,位[1:0]為0,位[31:2]用于保存PC,;在Thumb狀態(tài)下,,位[0]為0,位[31:1]用于保存PC,;雖然可以用作通用寄存器,,但是有一些指令在使用R15時(shí)有一些特殊限制,若不注意,,執(zhí)行的結(jié)果將是不可預(yù)料的,。在ARM狀態(tài)下,PC的0和1位是0,,在Thumb狀態(tài)下,,PC的0位是0。
R15雖然也可用作通用寄存器,,但一般不這么使用,,因?yàn)閷?duì)R15的使用有一些特殊的限制,當(dāng)違反了這些限制時(shí),,程序的執(zhí)行結(jié)果是未知的,。
由于ARM體系結(jié)構(gòu)采用了多級(jí)流水線技術(shù),對(duì)于ARM指令集而言,,PC總是指向當(dāng)前指令的下兩條指令的地址,,即PC的值為當(dāng)前指令的地址值加8個(gè)字節(jié)。
在ARM狀態(tài)下,,任一時(shí)刻可以訪問(wèn)以上所討論的16個(gè)通用寄存器和一到兩個(gè)狀態(tài)寄存器,。在非用戶模式(特權(quán)模式)下,則可訪問(wèn)到特定模式分組寄存器,,圖2.3說(shuō)明在每一種運(yùn)行模式下,,哪一些寄存器是可以訪問(wèn)的。
寄存器R16:
寄存器R16用作CPSR(Current Program Status Register,,當(dāng)前程序狀態(tài)寄存器),,CPSR可在任何運(yùn)行模式下被訪問(wèn),它包括條件標(biāo)志位,、中斷禁止位,、當(dāng)前處理器模式標(biāo)志位,以及其他一些相關(guān)的控制和狀態(tài)位,。
每一種運(yùn)行模式下又都有一個(gè)專用的物理狀態(tài)寄存器,,稱為SPSR(Saved Program Status Register,備份的程序狀態(tài)寄存器),,當(dāng)異常發(fā)生時(shí),,SPSR用于保存CPSR的當(dāng)前值,,從異常退出時(shí)則可由SPSR來(lái)恢復(fù)CPSR。
由于用戶模式和系統(tǒng)模式不屬于異常模式,,他們沒(méi)有SPSR,,當(dāng)在這兩種模式下訪問(wèn)SPSR,結(jié)果是未知的,。
2.5.2 Thumb狀態(tài)下的寄存器組織
Thumb狀態(tài)下的寄存器集是ARM狀態(tài)下寄存器集的一個(gè)子集,,程序可以直接訪問(wèn)8個(gè)通用寄存器(R7~R0)、程序計(jì)數(shù)器(PC),、堆棧指針(SP),、連接寄存器(LR)和CPSR。同時(shí),,在每一種特權(quán)模式下都有一組SP,、LR和SPSR。圖2.4表明Thumb狀態(tài)下的寄存器組織,。
Thumb狀態(tài)下的寄存器組織與ARM狀態(tài)下的寄存器組織的關(guān)系:
─ Thumb狀態(tài)下和ARM狀態(tài)下的R0~R7是相同的,。
─ Thumb狀態(tài)下和ARM狀態(tài)下的CPSR和所有的SPSR是相同的。
─ Thumb狀態(tài)下的SP對(duì)應(yīng)于ARM狀態(tài)下的R13,。
─ Thumb狀態(tài)下的LR對(duì)應(yīng)于ARM狀態(tài)下的R14,。
─ Thumb狀態(tài)下的程序計(jì)數(shù)器對(duì)應(yīng)于ARM狀態(tài)下R15
以上的對(duì)應(yīng)關(guān)系如圖2.5所示:
訪問(wèn)THUMB狀態(tài)下的高位寄存器(Hi-registers):
在Thumb狀態(tài)下,高位寄存器R8~R15并不是標(biāo)準(zhǔn)寄存器集的一部分,,但可使用匯編語(yǔ)言程序受限制的訪問(wèn)這些寄存器,,將其用作快速的暫存器。使用帶特殊變量的MOV指令,,數(shù)據(jù)可以在低位寄存器和高位寄存器之間進(jìn)行傳送,;高位寄存器的值可以使用CMP和ADD指令進(jìn)行比較或加上低位寄存器中的值。
2.5.3 程序狀態(tài)寄存器
ARM體系結(jié)構(gòu)包含一個(gè)當(dāng)前程序狀態(tài)寄存器(CPSR)和五個(gè)備份的程序狀態(tài)寄存器(SPSRs),。備份的程序狀態(tài)寄存器用來(lái)進(jìn)行異常處理,,其功能包括:
─ 保存ALU中的當(dāng)前操作信息
─ 控制允許和禁止中斷
─ 設(shè)置處理器的運(yùn)行模式
程序狀態(tài)寄存器的每一位的安排如圖2.6所示:
條件碼標(biāo)志(Condition Code Flags)
N、Z,、C,、V均為條件碼標(biāo)志位。它們的內(nèi)容可被算術(shù)或邏輯運(yùn)算的結(jié)果所改變,,并且可以決定某條指令是否被執(zhí)行,。
在ARM狀態(tài)下,絕大多數(shù)的指令都是有條件執(zhí)行的,。
在Thumb狀態(tài)下,,僅有分支指令是有條件執(zhí)行的。
條件碼標(biāo)志各位的具體含義如表2-1所示:
表2-1 條件碼標(biāo)志的具體含義
─ T標(biāo)志位:該位反映處理器的運(yùn)行狀態(tài)。
對(duì)于ARM體系結(jié)構(gòu)v5及以上的版本的T系列處理器,,當(dāng)該位為1時(shí),,程序運(yùn)行于Thumb狀態(tài),否則運(yùn)行于ARM狀態(tài),。
對(duì)于ARM體系結(jié)構(gòu)v5及以上的版本的非T系列處理器,,當(dāng)該位為1時(shí),執(zhí)行下一條指令以引起為定義的指令異常,;當(dāng)該位為0時(shí),表示運(yùn)行于ARM狀態(tài),。
─ 運(yùn)行模式位M[4:0]:M0,、M1、M2,、M3,、M4是模式位。這些位決定了處理器的運(yùn)行模式,。具體含義如表2-2所示:
表2-2 運(yùn)行模式位M[4:0]的具體含義
由表2-2可知,,并不是所有的運(yùn)行模式位的組合都是有效地,其他的組合結(jié)果會(huì)導(dǎo)致處理器進(jìn)入一個(gè)不可恢復(fù)的狀態(tài),。
保留位
PSR中的其余位為保留位,,當(dāng)改變PSR中的條件碼標(biāo)志位或者控制位時(shí),保留位不要被改變,,在程序中也不要使用保留位來(lái)存儲(chǔ)數(shù)據(jù),。保留位將用于ARM版本的擴(kuò)展。
2.6 異常(Exceptions)
當(dāng)正常的程序執(zhí)行流程發(fā)生暫時(shí)的停止時(shí),,稱之為異常,,例如處理一個(gè)外部的中斷請(qǐng)求。在處理異常之前,,當(dāng)前處理器的狀態(tài)必須保留,,這樣當(dāng)異常處理完成之后,當(dāng)前程序可以繼續(xù)執(zhí)行,。處理器允許多個(gè)異常同時(shí)發(fā)生,,它們將會(huì)按固定的優(yōu)先級(jí)進(jìn)行處理。
ARM體系結(jié)構(gòu)中的異常,,與8位/16位體系結(jié)構(gòu)的中斷有很大的相似之處,,但異常與中斷的概念并不完全等同。
2.6.1 ARM體系結(jié)構(gòu)所支持的異常類型
ARM體系結(jié)構(gòu)所支持的異常及具體含義如表2-3所示,。
表2-3 ARM體系結(jié)構(gòu)所支持的異常
2.6.2 對(duì)異常的響應(yīng)
當(dāng)一個(gè)異常出現(xiàn)以后,,ARM微處理器會(huì)執(zhí)行以下幾步操作:
1、將下一條指令的地址存入相應(yīng)連接寄存器LR,以便程序在處理異常返回時(shí)能從正確的位置重新開(kāi)始執(zhí)行,。若異常是從ARM狀態(tài)進(jìn)入,,LR寄存器中保存的是下一條指令的地址(當(dāng)前PC+4或PC+8,與異常的類型有關(guān)),;若異常是從Thumb狀態(tài)進(jìn)入,,則在LR寄存器中保存當(dāng)前PC的偏移量,這樣,,異常處理程序就不需要確定異常是從何種狀態(tài)進(jìn)入的,。例如:在軟件中斷異常SWI,指令 MOV PC,,R14_svc總是返回到下一條指令,,不管SWI是在ARM狀態(tài)執(zhí)行,還是在Thumb狀態(tài)執(zhí)行,。
2,、將CPSR復(fù)制到相應(yīng)的SPSR中。
3,、根據(jù)異常類型,,強(qiáng)制設(shè)置CPSR的運(yùn)行模式位。
4,、強(qiáng)制PC從相關(guān)的異常向量地址取下一條指令執(zhí)行,,從而跳轉(zhuǎn)到相應(yīng)的異常處理程序處。
還可以設(shè)置中斷禁止位,,以禁止中斷發(fā)生,。
如果異常發(fā)生時(shí),處理器處于Thumb狀態(tài),,則當(dāng)異常向量地址加載入PC時(shí),,處理器自動(dòng)切換到ARM狀態(tài)。
ARM微處理器對(duì)異常的響應(yīng)過(guò)程用偽碼可以描述為:
R14_<Exception_Mode> = Return Link
SPSR_<Exception_Mode> = CPSR
CPSR[4:0] = Exception Mode Number
CPSR[5] = 0 ,;當(dāng)運(yùn)行于ARM工作狀態(tài)時(shí)
If <Exception_Mode> == Reset or FIQ then
?。划?dāng)響應(yīng)FIQ異常時(shí),,禁止新的FIQ異常
CPSR[6] = 1
CPSR[7] = 1
PC = Exception Vector Address
2.6.3 從異常返回
異常處理完畢之后,,ARM微處理器會(huì)執(zhí)行以下幾步操作從異常返回:
1、將連接寄存器LR的值減去相應(yīng)的偏移量后送到PC中,。
2,、將SPSR復(fù)制回CPSR中。
3,、若在進(jìn)入異常處理時(shí)設(shè)置了中斷禁止位,,要在此清除,。
可以認(rèn)為應(yīng)用程序總是從復(fù)位異常處理程序開(kāi)始執(zhí)行的,因此復(fù)位異常處理程序不需要返回,。
2.6.4 各類異常的具體描述
FIQ(Fast Interrupt Request)
FIQ異常是為了支持?jǐn)?shù)據(jù)傳輸或者通道處理而設(shè)計(jì)的,。在ARM狀態(tài)下,系統(tǒng)有足夠的私有寄存器,,從而可以避免對(duì)寄存器保存的需求,,并減小了系統(tǒng)上下文切換的開(kāi)銷。
若將CPSR的F位置為1,,則會(huì)禁止FIQ中斷,,若將CPSR的F位清零,處理器會(huì)在指令執(zhí)行時(shí)檢查FIQ的輸入,。注意只有在特權(quán)模式下才能改變F位的狀態(tài),。
可由外部通過(guò)對(duì)處理器上的nFIQ引腳輸入低電平產(chǎn)生FIQ。不管是在ARM狀態(tài)還是在Thumb狀態(tài)下進(jìn)入FIQ模式,,F(xiàn)IQ處理程序均會(huì)執(zhí)行以下指令從FIQ模式返回:
SUBS PC,R14_fiq ,#4
該指令將寄存器R14_fiq的值減去4后,復(fù)制到程序計(jì)數(shù)器PC中,,從而實(shí)現(xiàn)從異常處理程序中的返回,,同時(shí)將SPSR_mode寄存器的內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器CPSR中。
IRQ(Interrupt Request)
IRQ異常屬于正常的中斷請(qǐng)求,,可通過(guò)對(duì)處理器的nIRQ引腳輸入低電平產(chǎn)生,,IRQ的優(yōu)先級(jí)低于FIQ,當(dāng)程序執(zhí)行進(jìn)入FIQ異常時(shí),,IRQ可能被屏蔽,。
若將CPSR的I位置為1,則會(huì)禁止IRQ中斷,,若將CPSR的I位清零,,處理器會(huì)在指令執(zhí)行完之前檢查IRQ的輸入。注意只有在特權(quán)模式下才能改變I位的狀態(tài),。
不管是在ARM狀態(tài)還是在Thumb狀態(tài)下進(jìn)入IRQ模式,,IRQ處理程序均會(huì)執(zhí)行以下指令從IRQ模式返回:
SUBS PC , R14_irq , #4
該指令將寄存器R14_irq的值減去4后,復(fù)制到程序計(jì)數(shù)器PC中,,從而實(shí)現(xiàn)從異常處理程序中的返回,,同時(shí)將SPSR_mode寄存器的內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器CPSR中。
ABORT(中止)
產(chǎn)生中止異常意味著對(duì)存儲(chǔ)器的訪問(wèn)失敗,。ARM微處理器在存儲(chǔ)器訪問(wèn)周期內(nèi)檢查是否發(fā)生中止異常,。
中止異常包括兩種類型:
─ 指令預(yù)取中止:發(fā)生在指令預(yù)取時(shí)。
─ 數(shù)據(jù)中止:發(fā)生在數(shù)據(jù)訪問(wèn)時(shí),。
當(dāng)指令預(yù)取訪問(wèn)存儲(chǔ)器失敗時(shí),,存儲(chǔ)器系統(tǒng)向ARM處理器發(fā)出存儲(chǔ)器中止(Abort)信號(hào),預(yù)取的指令被記為無(wú)效,但只有當(dāng)處理器試圖執(zhí)行無(wú)效指令時(shí),,指令預(yù)取中止異常才會(huì)發(fā)生,,如果指令未被執(zhí)行,例如在指令流水線中發(fā)生了跳轉(zhuǎn),,則預(yù)取指令中止不會(huì)發(fā)生,。
若數(shù)據(jù)中止發(fā)生,系統(tǒng)的響應(yīng)與指令的類型有關(guān),。
當(dāng)確定了中止的原因后,,Abort處理程序均會(huì)執(zhí)行以下指令從中止模式返回,無(wú)論是在ARM狀態(tài)還是Thumb狀態(tài):
SUBS PC, R14_abt, #4 ,;指令預(yù)取中止
SUBS PC, R14_abt, #8 ,;數(shù)據(jù)中止
以上指令恢復(fù)PC(從R14_abt)和CPSR(從SPSR_abt)的值,并重新執(zhí)行中止的指令,。
Software Interruupt(軟件中斷)
軟件中斷指令(SWI)用于進(jìn)入管理模式,,常用于請(qǐng)求執(zhí)行特定的管理功能。軟件中斷處理程序執(zhí)行以下指令從SWI模式返回,,無(wú)論是在ARM狀態(tài)還是Thumb狀態(tài):
MOV PC , R14_svc
以上指令恢復(fù)PC(從R14_svc)和CPSR(從SPSR_svc)的值,,并返回到SWI的下一條指令。
Undefined Instruction(未定義指令)
當(dāng)ARM處理器遇到不能處理的指令時(shí),,會(huì)產(chǎn)生未定義指令異常,。采用這種機(jī)制,可以通過(guò)軟件仿真擴(kuò)展ARM或Thumb指令集,。
在仿真未定義指令后,,處理器執(zhí)行以下程序返回,無(wú)論是在ARM狀態(tài)還是Thumb狀態(tài):
MOVS PC, R14_und
以上指令恢復(fù)PC(從R14_und)和CPSR(從SPSR_und)的值,,并返回到未定義指令后的下一條指令,。
2.6.5 異常進(jìn)入/退出小節(jié)
表2-4總結(jié)了進(jìn)入異常處理時(shí)保存在相應(yīng)R14中的PC值,及在退出異常處理時(shí)推薦使用的指令,。
表2-4 異常進(jìn)入/退出
注意:
1,、在此PC應(yīng)是具有預(yù)取中止的BL/SWI/未定義指令所取的地址。
2,、在此PC是從FIQ或IRQ取得不能執(zhí)行的指令的地址,。
3、在此PC是產(chǎn)生數(shù)據(jù)中止的加載或存儲(chǔ)指令的地址,。
4,、系統(tǒng)復(fù)位時(shí),保存在R14_svc中的值是不可預(yù)知的,。
2.6.6 異常向量(Exception Vectors)
表2-5顯示異常向量地址,。
表2-5 異常向量表
2.6.7 異常優(yōu)先級(jí)(Exception Priorities)
當(dāng)多個(gè)異常同時(shí)發(fā)生時(shí),,系統(tǒng)根據(jù)固定的優(yōu)先級(jí)決定異常的處理次序。異常優(yōu)先級(jí)由高到低的排列次序如表2-6所示,。
表2-6 異常優(yōu)先級(jí)
2.6.8 應(yīng)用程序中的異常處理
當(dāng)系統(tǒng)運(yùn)行時(shí),,異常可能會(huì)隨時(shí)發(fā)生,,為保證在ARM處理器發(fā)生異常時(shí)不至于處于未知狀態(tài),,在應(yīng)用程序的設(shè)計(jì)中,首先要進(jìn)行異常處理,,采用的方式是在異常向量表中的特定位置放置一條跳轉(zhuǎn)指令,,跳轉(zhuǎn)到異常處理程序,當(dāng)ARM處理器發(fā)生異常時(shí),,程序計(jì)數(shù)器PC會(huì)被強(qiáng)制設(shè)置為對(duì)應(yīng)的異常向量,,從而跳轉(zhuǎn)到異常處理程序,當(dāng)異常處理完成以后,,返回到主程序繼續(xù)執(zhí)行,。
2.7 本章小節(jié)
本章對(duì)ARM微處理器的體系結(jié)構(gòu)、寄存器的組織,、處理器的工作狀態(tài),、運(yùn)行模式以及處理器異常等內(nèi)容進(jìn)行了描述,這些內(nèi)容也是ARM體系結(jié)構(gòu)的基本內(nèi)容,,是系統(tǒng)軟、硬件設(shè)計(jì)的基礎(chǔ),。