ARM編程概要

ARM 181瀏覽

1. ARM微處理器工作狀態

?

從編程的角度看,ARM微處理器的工作狀態一般有兩種,并可在兩種狀態之間切換:

- 第一種為ARM狀態,此時處理器執行32位的字對齊的ARM指令;

- 第二種為Thumb狀態,此時處理器執行16位的、半字對齊的Thumb指令。

當ARM微處理器執行32位的ARM指令集時,工作在ARM狀態;

當ARM微處理器執行16位的Thumb指令集時,工作在Thumb狀態。在程序的執行
過程中,微處理器可以
隨時在兩種工作狀態之間切換,并且,處理器工作狀態的轉變并不影響處理器的工作模式和相應寄存器中的內容。

?

2.
ARM
微處理器

狀態切換方法

?

ARM微處理器在開始執行代碼時,應該處于ARM狀態。

進入Thumb狀態:
當操作數寄存器的狀態位(位0)為1時,可以采用執行BX指令的方法,使微處理器從ARM狀態切換到Thumb狀態。

進入ARM狀態:?
? 當操作數寄存器的狀態位為0時,執行BX指令時可以使微處理器從Thumb狀態切換到ARM狀態。

?

在其它情況下也能進行切換:

?

在處理器進行異常處理時,
把PC指針放入異
常模式鏈接寄存器中,并從異常向量地址開始執行程序,也可以使處理器切換到ARM狀態。

當處理器處于Thumb狀
態時發生異常(如IRQ、FIQ、Undef、Abort、SWI等),則異常處理返回時,自動切換到Thumb狀態。

也就是說在異常處理在ARM狀態下執行, 異常處理完了就會返回THUMB狀態(前提是在THUMB狀態出出現的異常)。

?

3.ARM體系結構存儲器格式

ARM體系結構將存儲器看作是從零地址開始的字節的線性組合。從零字節到三字節放置第一個存儲的字數據,從第四個字節到第七個字節放置第二個存儲的
字數
據,依次排列。作為32位的微處理器,ARM體系結構所支持的最大尋址空間為4GB(232字節)。

ARM體系結構可以用兩種方法存儲字數據,稱之為大端格式和小端格式,具體說明如下:

大端格式:

在這種格式中,字數據的高字節存儲在低地址中,而字數據的低字節則存放在高地址中,如圖5所示。

?


圖5
以大端格式存儲字數據

?

小端格式:

與大端存儲格式相反,在小端存儲格式中,低地址中存放的是字數據的低字節,高地址存放的是字數據的高字節。如圖6所示。


圖6
以小端格式存儲字數據

指令長度及數據類型

ARM微處理器的指令長度可以是32位(在ARM狀態下),也可以為16位(在Thumb狀態下)。

ARM微處理器中支持字節(8位)、半字(16位)、字(32位)三種數據類型,
其中,字需要4字節對齊(地址的低兩位為0)、半字需要2字節對齊
(地址的最低
位為0)。

?

處理器模式

ARM微處理器支持7種運行模式,分別為:

用戶模式(usr):ARM處理器正常的程序執行狀態。

─ 快速中斷模式(fiq):用于高速數據傳輸或通道處理。

─ 外部中斷模式(irq):用于通用的中斷處理。

─ 管理模式(svc):操作系統使用的保護模式。

─ 數據訪問終止模式(abt):當數據或指令預取終止時進入該模式,可用于虛擬存儲及存儲保護。

系統模式(sys):運行具有特權的操作系統任務。

─ 未定義指令中止模式(und):當未定義的指令執行時進入該模式,可用于支持硬件協處理器的軟件仿真。

ARM微處理器的運行模式可以通過軟件改變,也可以通過外部中斷或異常處理改變。

大多數的應用程序運行在用戶模式下,當處理器運行在用戶模式下時,某些被保護的系統資源是不能被訪問的。

除用戶模式以外,其余的所有6種模式稱之為非用戶模式,或特權模式(Privileged
Modes);其中除去用戶模式和系統模式以外的5種又稱為異常模式
(Exception Modes),常用于處理中斷或異常,以及需要訪問受保護的系統資源等情況。

?

寄存器組織

ARM微處理器共有37個32位寄存器,其中31個為通用寄存器,6個為狀態寄存器。但是這些寄存器不能被同時訪問,具體哪些寄存器是可編程訪問
的,取決
微處理器的工作狀態及具體的運行模式。但在任何時候,通用寄存器R14~R0、程序計數器PC、一個或兩個狀態寄存器都是可訪問的。

?

ARM狀態下寄存器組織

通用寄存器:

通用寄存器包括R0~R15,可以分為三類:

─ 未分組寄存器R0~R7;

─ 分組寄存器R8~R14

─ 程序計數器PC(R15)

?

未分組寄存器R0~R7:

在所有的運行模式下,未分組寄存器都指向同一個物理寄存器,他們未被系統用作特殊的用途,因此,在中斷或異常處理進行運行模式轉換時,由于不同的
處理器運行模式均使用相同的物理寄存器,可能會造成寄存器中數據的破壞,這一點在進行程序設計時應引起注意。

?

分組寄存器R8~R14

對于分組寄存器,他們每一次所訪問的物理寄存器與處理器當前的運行模式有關。

對于R8~R12來說,每個寄存器對應兩個不同的物理寄存器,當使用fiq模式時,訪問寄存器R8_fiq~R12_fiq;當使用除fiq模式以
外的其他模式時,訪問寄
存器R8_usr~R12_usr。

對于R13、R14來說,每個寄存器對應6個不同的物理寄存器,其中的一個是用戶模式與系統模式共用,另外5個物理寄存器對應于其他5種不同的運行
模式。

采用以下的記號來區分不同的物理寄存器:

R13_<mode>

R14_<mode>

其中,mode為以下幾種模式之一:usr、fiq、irq、svc、abt、und。



存器R13詳解:

寄存器R13在ARM指令中常用作堆棧指針,但這只是一種習慣用法
,用戶也可使用其他的寄存器作為堆棧指針。而在Thumb指令集中,某些指令強制
性的要求使用
R13作為堆棧指針。

?


存器R14詳解:

由于處理器的每種運行模式均有自己獨立的物理寄存器R13,在用戶應用程序的初始化部分,一般都要初始化每種模式下的R13,使其指向該運行模式的
棧空間,
這樣,當程序的運行進入異常模式時,可以將需要保護的寄存器放入R13所指向的堆棧,而當程序從異常模式返回時,則從對應的堆棧中恢復,采用這種方式可以
保證異常發生后程序的正常執行。

R14也稱作子程序連接寄存器(Subroutine Link
Register)或連接寄存器LR。當執行BL子程序調用指令時,R14中得到R15(程序計數器PC)的備份。其他情況
下,R14用作通用寄存器。與之類似,當發生中斷或異常時,對應的分組寄存器R14_svc、R14_irq、R14_fiq、R14_abt和
R14_und用來保存R15的返回值。

寄存器R14常用在如下的情況:

在每一種運行模式下,都可用R14保存子程序的返回地址,當用BL或BLX指令調用子程序時,將PC的當前值拷貝給R14,執行完子程序后,又將
R14的值拷貝回PC,
即可完成子程序的調用返回。以上的描述可用指令完成:

1、執行以下任意一條指令:

MOV ? ? ? PC,LR
BX ? ? ? ? ? LR

2、在子程序入口處使用以下指令將R14存入堆棧:

STMFD ? ? ? SP!,{<Regs>,LR}

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

LDMFD ? ? ? SP!,{<Regs>,PC}

R14也可作為通用寄存器。

?

程序計數器PC(R15)詳解:

?

寄存器R15用作程序計數器(PC)。在ARM狀態下,位[1:0]為0,位[31:2]用于保存PC;在Thumb狀態下,位[0]為0,位
[31:1]用于保存PC;雖然可以用作通用
寄存器,但是有一些指令在使用R15時有一些特殊限制,若不注意,執行的結果將是不可預料的。在ARM狀態下,PC的0和1位是0,在Thumb狀態
下,PC的0位是0。

R15雖然也可用作通用寄存器,但一般不這么使用,因為對R15的使用有一些特殊的限制,當違反了這些限制時,程序的執行結果是未知的。

由于ARM體系結構采用了多級流水線技術,對于ARM指令集而言,PC總是指向當前指令的下兩條指令的地址,即PC的值為當前指令的地址值加8個字
節。

?


圖7
ARM狀態下的寄存器組織

?

在ARM狀態下,任一時刻可以訪問以上所討論的16個通用寄存器和一到兩個狀態寄存器。在非用戶模式(特權模式)下,則可訪問到特定模式分組寄存器,
圖7說明在每一種運行模式下,哪一些寄存器是可以訪問的。


當前程序狀態寄存器詳解:

寄存器R16用作CPSR(Current Program Status
Register,當前程序狀態寄存器),CPSR可在任何運行模式下被訪問,它包括條件標志位、中斷禁止位、當
前處理器模式標志位,以及其他一些相關的控制和狀態位。

每一種運行模式下又都有一個專用的物理狀態寄存器,稱為SPSR(Saved Program Status
Register,備份的程序狀態寄存器),當異常發生時,SPSR用
于保存CPSR的當前值,從異常退出時則可由SPSR來恢復CPSR。

由于用戶模式和系統模式不屬于異常模式,他們沒有SPSR,當在這兩種模式下訪問SPSR,結果是未知的。



Thumb狀態下寄存器組織

?

humb狀態下的寄存器集是ARM狀態下寄存器集的一個子集,程序可以直接訪問8個通用寄存器(R7~R0)、程序計數器(PC)、堆棧指針
(SP)、連接寄存
器(LR)和CPSR。同時,在每一種特權模式下都有一組SP、LR和SPSR。圖8表明Thumb狀態下的寄存器組織。


圖8
Thumb狀態下寄存器組織

Thumb狀態下的寄存器組織與ARM狀態下的寄存器組織的關系:

─ Thumb狀態下和ARM狀態下的R0~R7是相同的。

─ Thumb狀態下和ARM狀態下的CPSR和所有的SPSR是相同的。

─ Thumb狀態下的SP對應于ARM狀態下的R13。

─ Thumb狀態下的LR對應于ARM狀態下的R14。

─ Thumb狀態下的程序計數器對應于ARM狀態下R15

以上的對應關系如圖9所示:


圖9
Thumb狀態下的寄存器組織

訪問THUMB狀態下的高位寄存器(Hi-registers):

在Thumb狀態下,高位寄存器R8~R15并不是標準寄存器集的一部分,但可使用匯編語言程序受限制的訪問這些寄存器,將其用作快速的暫存器。使
用帶特殊變
量的MOV指令,數據可以在低位寄存器和高位寄存器之間進行傳送;高位寄存器的值可以使用CMP和ADD指令進行比較或加上低位寄存器中的值。

?

程序狀態寄存器

ARM體系結構包含一個當前程序狀態寄存器(CPSR)和五個備份的程序狀態寄存器(SPSRs)。備份的程序狀態寄存器用來進行異常處理,其功能
包括:

─ 保存ALU中的當前操作信息。

─ 控制允許和禁止中斷。

─ 設置處理器的運行模式。

程序狀態寄存器的每一位的安排如圖10所示:


圖10
程序狀態寄存器格式

條件碼標志(Condition Code Flags)

N、Z、C、V均為條件碼標志位。它們的內容可被算術或邏輯運算的結果所改變,并且可以決定某條指令是否被執行。

在ARM狀態下,絕大多數的指令都是有條件執行的。

在Thumb狀態下,僅有分支指令是有條件執行的。

條件碼標志各位的具體含義如表1所示。

表1 條件碼標志的具體含義

?

?

標志位

?

?

含 ?? 義

?

?

N

?

?

當用兩個補碼表示的帶符號數進行運算時,N=1
表示運算的結果為負數;N=0
表示運算的結果為正數或零;

?

?

Z

?

?

Z=1 表示運算的結果為零;Z=0表示運算的結果為非零;

?

?

C

?

?

可以有4種方法設置C的值:

?

?


加法運算(包括比較指令CMN):當運算結果產生了進位時(無符號數溢出),
C=1,否則C=0。

?

?

─ 減法運算(包括比較指令CMP):當運算時產生了借位(無符號數溢出),
C=0,否則C=1。

?

?

─ 對于包含移位操作的非加/減運算指令,C為移出值的最后一位。

?

?

─ 對于其他的非加/減運算指令,C的值通常不改變。

?

?

V

?

?

可以有2種方法設置V的值:

?

?


對于加/減法運算指令,當操作數和運算結果為二進制的補碼表示的帶符號數時,
V=1表示符號位溢出。

?

?

─ 對于其他的非加/減運算指令,C的值通常不改變。

?

?

Q

?

?

在ARM v5及以上版本的E系列處理器中,用

Q標志位指示增強的DSP運算指令是否發生了溢出。在其他版本的處理器中,
Q標志位無定義。

?

?

?

控制位

?

?

PSR的低8位(包括
I、F、T和

M[4:0])稱為控制位,當發生異常時這些位可以被改變。如果處理器運行特權模式,這些位也可以由程序修改。

?

?

─? 中斷禁止位I、
F:

?

?

I=1 ? 禁止IRQ中斷。

?

?

F=1 ? 禁止FIQ中斷。

?

?

─? T標志位:該位反映處理器的運行狀態。

?

?

對于ARM體系結構v5及以上的版本的
T系列處理器,當該位為1時,程序運行于Thumb狀態,否則運行于
ARM狀態。

?

?

對于ARM體系結構v5及以上的版本的非
T系列處理器,當該位為1時,執行下一條指令以引起為定義的指令異常;當該位為
0時,表示運行于ARM狀態。

?

?

─? 運行模式位M[4:
0]:M0、M1、
M2、M3、M4是模式位。這些位決定了處理器的運行模式。具體含義如表
2所示。

?

?

表2 運行模式位M[4:
0]的具體含義

?

?

M[4:0]

?

?

處理器模式

?

?

可訪問寄存器

?

?

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

?

?

未定義模式

lang="DE">PC, lang="DE">CPSR,
SPSR_und, lang="DE">R14_und,R13_und,
R12~ lang="DE">R0

?

?

0b11111

?

?

系統模式

?

?

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

?

?

由表2可知,并不是所有的運行模式位的組合都是有效地,其他的組合結果會導致處理器進入一個不可恢復的狀態。

?

?

?

保留位

?

?

PSR中的其余位為保留位,當改變PSR中的條件碼標志位或者控制位時,保留位不要被改變,在程序中也不要使用保留位來存儲數據。保留位將用于
ARM版本的擴展。

?

異常(Exceptions)

當正常的程序執行流程發生暫時的停止時,稱之為異常,示例處理一個外部的中斷請求。
在處理異常之前,當前處理器的狀態必須保留,這樣當異常處理完成之后,
當前程序可以繼續執行。處理器允許多個異常同時發生,它們將會按固定的優先級進行處理。

?

?

ARM體系結構中的異常,與8位
/16位體系結構的中斷有很大的相似之處,但異常與中斷的概念并不完全等同。

?

ARM體系結構所支持的異常類型

ARM體系結構所支持的異常及具體含義如表3所示。

?

?

表3? ARM體系結構所支持的異常

?

?

異常類型

?

?

具體含義

?

?

復位

?

?

當處理器的復位電平有效時,產生復位異常,程序跳轉到復位異常處理程序處執行。

?

?

未定義指令

?

?

當ARM處理器或協處理器遇到不能處理的指令時,產生未定義指令異常。可使用該異常機制進行軟件仿真。

?

?

軟件中斷

?

?

該異常由執行SWI指令產生,可用于用戶模式下的程序調用特權操作指令。可使用該異常機制實現系統功能調用。

?

?

指令預取中止

?

?

若處理器預取指令的地址不存在,或該地址不允許當前指令訪問,存儲器會向處理器發出中止信號,但當預取的指令被執行時,才會產生指令預取中止異常。

?

?

數據中止

?

?

若處理器數據訪問指令的地址不存在,或該地址不允許當前指令訪問時,產生數據中止異常。

?

?

IRQ(外部中斷請求)

?

?

當處理器的外部中斷請求引腳有效,且CPSR中的I位為
0時,產生IRQ異常。系統的外設可通過該異常請求中斷服務。

?

?

FIQ(快速中斷請求)

?

?

當處理器的快速中斷請求引腳有效,且CPSR中的F位為
0時,產生FIQ異常。

?

?

?

對異常響應

?

當一個異常出現以后,ARM微處理器會執行以下幾步操作:

?

?

1、將下一條指令的地址存入相應連接寄存器LR,以便程序在處理異常返回時能從正確的位置重新開始執行。若異常是從
ARM狀態進入,LR寄存器中保存的是下一條指令的地址(當前
PC+4或PC+
8,與異常的類型有關);若異常是從Thumb狀態進入,則在

LR寄存器中保存當前PC的偏移量,這樣,異常處理程序就不需要確定異常是從何種狀態進入的。示例:在軟件中斷異常
SWI,指令 MOV
PC,R14_svc總是返回到下一條指令,不管
SWI是在ARM狀態執行,還是在Thumb狀態執行。

?

?

2、將CPSR復制到相應的
SPSR中。

?

?

3、根據異常類型,強制設置CPSR的運行模式位。

?

?

4、強制PC從相關的異常向量地址取下一條指令執行,從而跳轉到相應的異常處理程序處。

?

?

還可以設置中斷禁止位,以禁止中斷發生。

?

?

如果異常發生時,處理器處于Thumb狀態,則當異常向量地址加載入PC時,處理器自動切換到
ARM狀態。

?

?

ARM微處理器對異常的響應過程用偽碼可以描述為:

?

?

size="2">R14_<Exception_Mode> = Return
Link

?

?

size="2">SPSR_<Exception_Mode> = CPSR

?

?

size="2">CPSR[4:0] = Exception Mode Number

?

?

size="2">CPSR[5] = 0 ? ? ? ?
? ? ? ? ? ?? ;當運行于
ARM工作狀態時

?

?

?

size="2">?

?

size="2">If <Exception_Mode> == Reset
or FIQ then

?

?

size="2">? ? ? ? ? ?
? ? ? ? ? ? ? ?? ? ??
;響應FIQ異常時,禁止新的FIQ異常

?

?

size="2">CPSR[6] = 1 ? ? ??

?

?

size="2">CPSR[7] = 1

?

?

size="2">PC = Exception Vector Address

?

?

2.8.3 從異常返回

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

?

?

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

?

?

2、將SPSR復制回
CPSR中。

?

?

3、若在進入異常處理時設置了中斷禁止位,要在此清除。

?

?

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

?

?

2.8.4 各類異常具體描述

FIQ(Fast Interrupt Request)

?

?

FIQ異常是為了支持數據傳輸或者通道處理而設計的。在ARM狀態下,系統有足夠的私有寄存器,從而可以避免對寄存器保存的需求,并減小了系統上下文切換
的開銷。

?

?

若將CPSR的F位置為
1,則會禁止FIQ中斷,若將CPSR的
F位清零,處理器會在指令執行時檢查FIQ的輸入。注意只有在特權模式下才能改變
F位的狀態。

?

?

可由外部通過對處理器上的nFIQ引腳輸入低電平產生FIQ。不管是在
ARM狀態還是在Thumb狀態下進入FIQ模式,
FIQ處理程序均會執行以下指令從FIQ模式返回:

?

?

SUBS ? PC,R14_fiq ,#4

?

?

該指令將寄存器R14_fiq的值減去4后,復制到程序計數器

PC中,從而實現從異常處理程序中的返回,同時將SPSR_mode寄存器的內容復制到當前程序狀態寄存器
CPSR中。

?

?

IRQ(Interrupt Request)

?

?

IRQ異常屬于正常的中斷請求,可通過對處理器的nIRQ引腳輸入低電平產生,
IRQ的優先級低于FIQ,當程序執行進入FIQ異常時,
IRQ可能被屏蔽。

?

?

若將CPSR的I位置為
1,則會禁止IRQ中斷,若將CPSR的
I位清零,處理器會在指令執行完之前檢查IRQ的輸入。注意只有在特權模式下才能改變
I位的狀態。

?

?

不管是在ARM狀態還是在Thumb狀態下進入
IRQ模式,IRQ處理程序均會執行以下指令從IRQ模式返回:

?

?

SUBS? PC , R14_irq , #4

?

?

該指令將寄存器R14_irq的值減去4后,復制到程序計數器

PC中,從而實現從異常處理程序中的返回,同時將SPSR_mode寄存器的內容復制到當前程序狀態寄存器
CPSR中。

?

?

ABORT(中止)

?

?

產生中止異常意味著對存儲器的訪問失敗。ARM微處理器在存儲器訪問周期內檢查是否發生中止異常。

?

?

中止異常包括兩種類型:

?

?

─? 指令預取中止:發生在指令預取時。

?

?

─? 數據中止:發生在數據訪問時。

?

?

當指令預取訪問存儲器失敗時,存儲器系統向ARM處理器發出存儲器中止(Abort)信號,預取的指令被記為無效,但只有當處理器試圖執行無效指令時,指
令預取中止異常才會發生,如果指令未被執行,示例在指令流水線中發生了跳轉,則預取指令中止不會發生。

?

?

若數據中止發生,系統的響應與指令的類型有關。

?

?

當確定了中止的原因后,Abort處理程序均會執行以下指令從中止模式返回,無論是在
ARM狀態還是Thumb狀態:

?

?

SUBS PC, R14_abt, #4 ? ??
;指令預取中止

?

?

SUBS PC, R14_abt, #8 ? ??
;數據中止

?

?

以上指令恢復PC(從R14_abt)和
CPSR(從SPSR_abt)的值,并重新執行中止的指令。

?

?

?

Software Interruupt(軟件中斷)

?

?

軟件中斷指令(SWI)用于進入管理模式,常用于請求執行特定的管理功能。軟件中斷處理程序執行以下指令從
SWI模式返回,無論是在ARM狀態還是Thumb狀態:

?

?

MOV? PC , R14_svc

?

?

以上指令恢復PC(從R14_svc)和
CPSR(從SPSR_svc)的值,并返回到SWI的下一條指令。

?

?

Undefined Instruction(未定義指令)

?

?

當ARM處理器遇到不能處理的指令時,會產生未定義指令異常。采用這種機制,可以通過軟件仿真擴展
ARM或Thumb指令集。

?

?

在仿真未定義指令后,處理器執行以下程序返回,無論是在ARM狀態還是Thumb狀態:

?

?

MOVS PC, R14_und

?

?

以上指令恢復PC(從R14_und)和
CPSR(從SPSR_und)的值,并返回到未定義指令后的下一條指令。

?

?

?

2.8.5異常進入/退出小節

表4總結了進入異常處理時保存在相應R14中的
PC值,及在退出異常處理時推薦使用的指令。

?

?

表4? 異常進入/退出

?

?

?

返回指令

?

?

以前的狀態

?

?

注意

?

?

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

?

?

lang="DE">MOVS PC,
lang="DE">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是產生數據中止的加載或存儲指令的地址。

?

?

4、系統復位時,保存在R14_svc中的值是不可預知的。

?

?

2.8.6
異常向量(Exception Vectors)

? ? 表5顯示異常向量地址。

?

?

表5 異常向量表

?

?

地 址

?

?

異 常

?

?

進入模式

?

?

0x0000,0000

?

?

復位

?

?

管理模式

?

?

0x0000,0004

?

?

未定義指令

?

?

未定義模式

?

?

0x0000,0008

?

?

軟件中斷

?

?

管理模式

?

?

0x0000,000C

?

?

中止(預取指令)

?

?

中止模式

?

?

0x0000,0010

?

?

中止(數據)

?

?

中止模式

?

?

0x0000,0014

?

?

保留

?

?

保留

?

?

0x0000,0018

?

?

IRQ

?

?

IRQ

?

?

0x0000,001C

?

?

FIQ

?

?

FIQ

?

?

2.8.7異常優先級(Exception
Priorities)

當多個異常同時發生時,系統根據固定的優先級決定異常的處理次序。異常優先級由高到低的排列次序如表6所示。

?

?

表6 異常優先級

?

?

優先級

?

?

異? 常

?

?

1(最高)

?

?

復位

?

?

2

?

?

數據中止

?

?

3

?

?

FIQ

?

?

4

?

?

IRQ

?

?

5

?

?

預取指令中止

?

?

6(最低)

?

?

未定義指令、SWI

?

?

2.8.8 應用程序中的異常處理

當系統運行時,異常可能會隨時發生,為保證在ARM處理器發生異常時不至于處于未知狀態,在應用程序的設計中,首先要進行異常處理,采用的方式是在異常向
量表中的特定位置放置一條跳轉指令,跳轉到異常處理程序,當

ARM處理器發生異常時,程序計數器PC會被強制設置為對應的異常向量,從而跳轉到異常處理程序,當異常處理完成以后,返回到主程序繼續執行。

?

七星彩走势图2元网官网