<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應用系統開(kāi)發(fā)詳解 第2章 ARM微處理器的編程模型

ARM應用系統開(kāi)發(fā)詳解 第2章 ARM微處理器的編程模型

作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò ) 收藏
本章簡(jiǎn)介ARM微處理器編程模型的一些基本概念,包括工作狀態(tài)切換、數據的存儲格式、處理器異常等,通過(guò)對本章的閱讀,希望讀者能了解ARM微處理器的基本工作原理和一些與程序設計相關(guān)的基本技術(shù)細節,為以后的程序設計打下基礎。

本章的主要內容:

本文引用地址:http://dyxdggzs.com/article/201611/318745.htm

- 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)的。

2.5.1 ARM狀態(tài)下的寄存器組織

通用寄存器:

通用寄存器包括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!,{,LR}

對應的,使用以下指令可以完成子程序返回:

LDMFD SP!,{,PC}

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,結果是未知的。

2.5.2Thumb狀態(tài)下的寄存器組織

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)行比較或加上低位寄存器中的值。

2.5.3程序狀態(tài)寄存器

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位體系結構的中斷有很大的相似之處,但異常與中斷的概念并不完全等同。

2.6.1 ARM體系結構所支持的異常類(lèi)型

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異常。

2.6.2對異常的響應

當一個(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_ = Return Link

SPSR_ = CPSR

CPSR[4:0] = Exception Mode Number

CPSR[5] = 0;當運行于A(yíng)RM工作狀態(tài)時(shí)

If == Reset or FIQ then

;當響應FIQ異常時(shí),禁止新的FIQ異常

CPSR[6] = 1

CPSR[7] = 1

PC = Exception Vector Address

2.6.3從異常返回

異常處理完畢之后,ARM微處理器會(huì )執行以下幾步操作從異常返回:

1、將連接寄存器LR的值減去相應的偏移量后送到PC中。

2、將SPSR回CPSR中。

3、若在進(jìn)入異常處理時(shí)設置了中斷禁止位,要在此清除。

可以認為應用程序總是從復位異常處理程序開(kāi)始執行的,因此復位異常處理程序不需要返回。

2.6.4各類(lè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.6.5異常進(jìn)入/退出小節

表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.6.6異常向量(Exception Vectors)

表2-5顯示異常向量地址。

表2-5異常向量表

地址

異常

進(jìn)入模式

0x0000,0000

復位

管理模式

0x0000,0004

未定義指令

未定義模式

0x0000,0008

軟件中斷

管理模式

0x0000,000C

中止(預取指令)

中止模式

0x0000,0010

中止(數據)

中止模式

0x0000,0014

保留

保留

0x0000,0018

IRQ

IRQ

0x0000,001C

FIQ

FIQ

2.6.7異常優(yōu)先級(Exception Priorities)

當多個(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

2.6.8應用程序中的異常處理

當系統運行時(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體系結構的基本內容,是系統軟、硬件設計的基礎。



關(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>