新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM應(yīng)用系統(tǒng)開發(fā)詳解 第2章 ARM微處理器的編程模型

ARM應(yīng)用系統(tǒng)開發(fā)詳解 第2章 ARM微處理器的編程模型

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

本章的主要內(nèi)容:

本文引用地址:http://m.butianyuan.cn/article/201611/318745.htm

- ARM微處理器的工作狀態(tài)

- ARM體系結(jié)構(gòu)的存儲(chǔ)器格式

- ARM微處理器的工作模式

- ARM體系結(jié)構(gòu)的寄存器組織

- ARM微處理器的異常狀態(tài)

在開始本章之前,首先對(duì)字(Word)、半字(Half-Word)、字節(jié)(Byte)的概念作一個(gè)說(shuō)明:

字(Word):在ARM體系結(jié)構(gòu)中,字的長(zhǎng)度為32位,而在8位/16位處理器體系結(jié)構(gòu)中,字的長(zhǎng)度一般為16位,請(qǐng)讀者在閱讀時(shí)注意區(qū)分。

半字(Half-Word):在ARM體系結(jié)構(gòu)中,半字的長(zhǎng)度為16位,與8位/16位處理器體系結(jié)構(gòu)中字的長(zhǎng)度一致。

字節(jié)(Byte):在ARM體系結(jié)構(gòu)和8位/16位處理器體系結(jié)構(gòu)中,字節(jié)的長(zhǎng)度均為8位。

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微處理器在開始執(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芥溄蛹拇嫫髦?,并從異常向量地址開始執(zhí)行程序,也可以使處理器切換到ARM狀態(tài)。[異常處理的時(shí)候]

2.2 ARM體系結(jié)構(gòu)的存儲(chǔ)器格式

ARM體系結(jié)構(gòu)將存儲(chǔ)器看作是從零地址開始的字節(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_

R14_

其中,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!,{,LR}

對(duì)應(yīng)的,使用以下指令可以完成子程序返回:

LDMFD SP!,{,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)模式不屬于異常模式,他們沒有SPSR,當(dāng)在這兩種模式下訪問(wèn)SPSR,結(jié)果是未知的。

2.5.2Thumb狀態(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)志的具體含義

標(biāo)志位

含義

N

當(dāng)用兩個(gè)補(bǔ)碼表示的帶符號(hào)數(shù)進(jìn)行運(yùn)算時(shí),N=1表示運(yùn)算的結(jié)果為負(fù)數(shù);N=0表示運(yùn)算的結(jié)果為正數(shù)或零;

Z

Z=1表示運(yùn)算的結(jié)果為零;Z=0表示運(yùn)算的結(jié)果為非零;

C

可以有4種方法設(shè)置C的值:

─ 加法運(yùn)算(包括比較指令CMN):當(dāng)運(yùn)算結(jié)果產(chǎn)生了進(jìn)位時(shí)(無(wú)符號(hào)數(shù)溢出),C=1,否則C=0。

─ 減法運(yùn)算(包括比較指令CMP):當(dāng)運(yùn)算時(shí)產(chǎn)生了借位(無(wú)符號(hào)數(shù)溢出),C=0,否則C=1。

─ 對(duì)于包含移位操作的非加/減運(yùn)算指令,C為移出值的最后一位。

─ 對(duì)于其他的非加/減運(yùn)算指令,C的值通常不改變。

V

可以有2種方法設(shè)置V的值:

─ 對(duì)于加/減法運(yùn)算指令,當(dāng)操作數(shù)和運(yùn)算結(jié)果為二進(jìn)制的補(bǔ)碼表示的帶符號(hào)數(shù)時(shí),V=1表示符號(hào)位溢出。

─ 對(duì)于其他的非加/減運(yùn)算指令,V的值通常不改變。

Q

在ARM v5及以上版本的E系列處理器中,用Q標(biāo)志位指示增強(qiáng)的DSP運(yùn)算指令是否發(fā)生了溢出。在其他版本的處理器中,Q標(biāo)志位無(wú)定義。

控制位

PSR的低8位(包括I、F、T和M[4:0])稱為控制位,當(dāng)發(fā)生異常時(shí)這些位可以被改變。如果處理器運(yùn)行特權(quán)模式,這些位也可以由程序修改。

─中斷禁止位I、F:

I=1禁止IRQ中斷;

F=1禁止FIQ中斷。

─ 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]的具體含義

M[4:0]

處理器模式

可訪問(wèn)的寄存器

0b10000

用戶模式

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

系統(tǒng)模式

PC,CPSR(ARM v4及以上版本), R14~R0

由表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)所支持的異常

異常類型

具體含義

復(fù)位

當(dāng)處理器的復(fù)位電平有效時(shí),產(chǎn)生復(fù)位異常,程序跳轉(zhuǎn)到復(fù)位異常處理程序處執(zhí)行。

未定義指令

當(dāng)ARM處理器或協(xié)處理器遇到不能處理的指令時(shí),產(chǎn)生未定義指令異常??墒褂迷摦惓C(jī)制進(jìn)行軟件仿真。

軟件中斷

該異常由執(zhí)行SWI指令產(chǎn)生,可用于用戶模式下的程序調(diào)用特權(quán)操作指令??墒褂迷摦惓C(jī)制實(shí)現(xiàn)系統(tǒng)功能調(diào)用。

指令預(yù)取中止

若處理器預(yù)取指令的地址不存在,或該地址不允許當(dāng)前指令訪問(wèn),存儲(chǔ)器會(huì)向處理器發(fā)出中止信號(hào),但當(dāng)預(yù)取的指令被執(zhí)行時(shí),才會(huì)產(chǎn)生指令預(yù)取中止異常。

數(shù)據(jù)中止

若處理器數(shù)據(jù)訪問(wèn)指令的地址不存在,或該地址不允許當(dāng)前指令訪問(wèn)時(shí),產(chǎn)生數(shù)據(jù)中止異常。

IRQ(外部中斷請(qǐng)求)

當(dāng)處理器的外部中斷請(qǐng)求引腳有效,且CPSR中的I位為0時(shí),產(chǎn)生IRQ異常。系統(tǒng)的外設(shè)可通過(guò)該異常請(qǐng)求中斷服務(wù)。

FIQ(快速中斷請(qǐng)求)

當(dāng)處理器的快速中斷請(qǐng)求引腳有效,且CPSR中的F位為0時(shí),產(chǎn)生FIQ異常。

2.6.2對(duì)異常的響應(yīng)

當(dāng)一個(gè)異常出現(xiàn)以后,ARM微處理器會(huì)執(zhí)行以下幾步操作:

1、將下一條指令的地址存入相應(yīng)連接寄存器LR,以便程序在處理異常返回時(shí)能從正確的位置重新開始執(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到相應(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_ = Return Link

SPSR_ = CPSR

CPSR[4:0] = Exception Mode Number

CPSR[5] = 0;當(dāng)運(yùn)行于ARM工作狀態(tài)時(shí)

If == 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回CPSR中。

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

可以認(rèn)為應(yīng)用程序總是從復(fù)位異常處理程序開始執(zhí)行的,因此復(fù)位異常處理程序不需要返回。

2.6.4各類異常的具體描述

FIQ(Fast Interrupt Request)

FIQ異常是為了支持?jǐn)?shù)據(jù)傳輸或者通道處理而設(shè)計(jì)的。在ARM狀態(tài)下,系統(tǒng)有足夠的私有寄存器,從而可以避免對(duì)寄存器保存的需求,并減小了系統(tǒng)上下文切換的開銷。

若將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后,到程序計(jì)數(shù)器PC中,從而實(shí)現(xiàn)從異常處理程序中的返回,同時(shí)將SPSR_mode寄存器的內(nèi)容到當(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后,到程序計(jì)數(shù)器PC中,從而實(shí)現(xiàn)從異常處理程序中的返回,同時(shí)將SPSR_mode寄存器的內(nèi)容到當(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)入/退出

返回指令

以前的狀態(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應(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異常向量表

地址

異常

進(jìn)入模式

0x0000,0000

復(fù)位

管理模式

0x0000,0004

未定義指令

未定義模式

0x0000,0008

軟件中斷

管理模式

0x0000,000C

中止(預(yù)取指令)

中止模式

0x0000,0010

中止(數(shù)據(jù))

中止模式

0x0000,0014

保留

保留

0x0000,0018

IRQ

IRQ

0x0000,001C

FIQ

FIQ

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í)

優(yōu)先級(jí)

異常

1(最高)

復(fù)位

2

數(shù)據(jù)中止

3

FIQ

4

IRQ

5

預(yù)取指令中止

6(最低)

未定義指令、SWI

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



關(guān)鍵詞: ARM微處理器編程模

評(píng)論


技術(shù)專區(qū)

關(guān)閉