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