ARM微處理器剖析

Download Report

Transcript ARM微處理器剖析

第三章
ARM微處理器剖析
DMATEK CO.,LTD
深圳市長高科技有限公司

本章將簡介了ARM微處理器程式設計模型的基本概念,包括:工作狀態切換、資料的記
憶體存放格式、處理器的例外事件等。透過對本章的介紹,希望讀者能瞭解ARM微處理
器的基本工作原理以及一些與程式設計相關的技術細節,為稍後的程式設計打下基礎。
本章的主要內容包括:
■ ARM微處理器的工作狀態
■ ARM系列結構的定址方式與記憶體格式
■ ARM微處理器的工作模式
■ ARM系列結構的暫存器架構
■ ARM微處理器的例外事件狀態
 由於ARM微處理器是32位元,這與我們所常使用的8位元/16位元的微處理器來說
,還是有很大的差異。因此在本章開始之前,需要對字元組(Word),半字元組
(Half-Word)與位元組(Byte)的概念作一個說明:
■ 字元組(Word):在ARM系列結構中,字元組的長度為32位元,而在8位元/16位
元處理器系列結構中,字元組的長度則一般為16位元,請讀者在閱讀時注意區分
。
■ 半字元組(Half-Word):在ARM系列結構中,半字元組的長度為16位元,與8位
元/16位元處理器系列結構中字元組的長度一致。
■ 位元組(Byte):在ARM系列結構和8位元/16位元處理器系列結構中,位元組的
長度均為8位元。
 3-1 ARM微處理器的工作狀態:
 從程式的角度來看,ARM微處理器的工作狀態一般有兩種,並可在兩種狀態之間切
換:
 ARM狀態,此時處理器執行32位元的字元組對齊的ARM指令。
 Thumb狀態,此時處理器執行16位元,半字元組對齊的Thumb指令。
 當ARM微處理器一開始起動或執行32位元的ARM指令集時,會工作在ARM狀態;
當ARM微處理器執行16位元的Thumb指令集時,工作在Thumb狀態。在程式的執
行過程中,微處理器可以隨時在兩種工作狀態之間切換,並且處理器工作狀態的轉
變並不影響處理器的工作模式和相應暫存器中的內容。而狀態切換方法,如下所列
:
 ARM指令集和Thumb指令集均有切換處理器狀態的指令,並可在兩種工作狀態之間
切換,但ARM微處理器在一開始執行程式碼時,應處於ARM狀態。以下,列出進
入這幾種狀態的方式:
 進入Thumb狀態:當運算元暫存器<Rm>的狀態位元(bit-0)為1時,可以採用
執行BX指令的方法,使微處理器從ARM狀態切換到Thumb狀態。此外,當處理器
處於Thumb狀態時,若是發生了例外事件(如IRQ、FIQ、UNDef、Abort與SWI)
的話,則當例外事件處理後返回時,能夠自動切換到Thumb狀態。
 進入ARM狀態:當運算元暫存器<Rm>的狀態位元為0時,執行BX指令時可以使
微處理器從Thumb狀態切換到ARM狀態。此外,微處理器在進行例外事件處理時
,把PC指標器放入例外事件模式的鏈結暫存器(LR)中,並從例外事件向量位址
開始處執行程式,也可以使微處理器切換到ARM狀態。
 在這裡運用切換微處理器狀態的指令是BX。BX指令將暫存器<Rm>的數值複製
到PC中,以達到轉移程式控制權。而透過將根據暫存器<Rm>的最低位元<Rm
>[0]來變更指令集狀態,<Rm>[0]為1,則變更為Thumb指令集狀態;<Rm>
[0]為0,則變更為ARM指令集狀態。此指令可將程式控制權移轉到4GB絕對位址的
任一字元位址。
 例如:
.code 32 //此處起的程式以ARM指令集編譯
BX r0 //若r0[31:1]為位址label1,r0[0]=1為跳躍至label1處執行時,切換為
Thumb指令集狀態
.code 16 //只是從此處的程式為Thumb指令集狀態
label1: //label1程式進入點
 3-2 定址方式與記憶體格式:
 ARM系列結構將記憶體看作是從零位址開始的位元組之線性組合的方式。從第零
位元組到第三位元組放置第一個記憶體的字元組資料,從第四個位元組到第七個
位元組放置第二個記憶體的字元組資料,依次排列。作為32位元的微處理器,
ARM系列結構所支援的最大定址空間為4GB(232位元組)。而ARM系列結構是
使用高達232,8位元單一線性的定址空間。因此,以下列出相關的定址方式與記
憶體格式的特性:
 位元組定址若是無正負號數的話,可定址的範圍:0 ~ 232-1。
 可視為230個32位元的位元組,以字元對齊(word-aligned)的話,則位址可被4
整除。
 字元組對齊的A,是由A,A+1,A+2,A+3位元組所組成。
 V4以上的版本,定址空間可視為由231 個16位元的半字元組所組成。
 若是半字元組對齊(Halfword-aligned)的話,則位址可被2整除,且半字元組對齊
的A,是由A,A+1位元組所組成。
 此外,位址的計算通常使用一般的整數指令來完成。這意謂著,若是所計算的位址
發生了上溢位(overflow)或是下溢位(underflow)的情形的話,就會產生環繞(
wrap around)的現象。如此,位址所計算出的結果會縮減為模數(modulo)232
範圍內。我們就需盡可能將定址的範圍設定在0 ~ 232 -1範圍中。而大部份的跳躍
指令會把所指定的偏移量加上PC來計算目的位元址(位元址+8+偏移量),然後將
此結果再寫回到PC。這時,若是計算結果產生上溢位或是下溢位,則其位址是不可
預期的。
 因此,最好位址向前不可超過0xFFFFFFFF位址,向後不可超過0x00000000位址
。此外,對於每條指令執行之後,根據指令正常地順序執行來加以計算其後的位元
址(目前指令的位元址+4),以決定下一個執行那條指令。若是上溢位的話,那麼
結果是不可預期的。因此程式在執行0xFFFFFFFC的指令後,不應依據順序來執行
位址0x00000000的指令。
 此外,位址空間在排列時,需依照某種規格來排列。對於字元組對齊的位址A,定
址空間的規則是:
 位於位址A的字元組是由:A,A+1,A+2,A+3位元組所組成。
 位於位址A的半字元組是由:A,A+1位元組所組成。
 位於位址A+2的半字元組是由:A+2,A+3位元組所組成。
 位於位址A的字元組是由:A,A+2半字元組所組成。
 而在ARM系列結構可以用兩種方法存取字元組資料,稱之為大端(Big Endian)
格式與小端(Little Endian)格式,具體說明如下:
 大端(Big Endian)格式
 在這種格式中,字元組資料的高位元組是存儲在低位址中,而字元組資料的低位元組
則存放在高位址中,如圖3-1所示。這一系列的微處理器以Motorola系列的晶片組為
主要的代表。
 字元組對齊的位元組或是半字元組是該位址的最高有效位元組或是半字元組。
 半字元組對齊的位元組是該位址的半字元組的最高有效的位元組。
圖3-1 以大端格式存儲字元組資料
 小端(Little Endian)格式
 與大端存儲格式相反,在小端存儲格式中,低位址中存放的是字元組資料的低位
元組,高位址存放的是字元組資料的高位元組。如圖3-2所示,這一系列的微處理
器以Atmel系列的晶片組為主要的代表。
 字元組對齊的位元組或是半字元組是該位址的最低有效的位元組或是半字元組。
 半字元組對齊的位元組是該位址的半字元組的最低有效的位元組
圖3-2以小端格式存儲字元組資料
。
 3-3 指令長度及資料類型:
 ARM微處理器的指令長度可以是32位元(在ARM狀態下),也可以為16位元(在
Thumb狀態下)。
 ARM微處理器中支援位元組(8位元),半字元組(16位元)以及字元組(32位
元)等三種資料類型。其中,字元組需要4個位元對齊(位址的最低兩位元為0)
,半字元組需要2個位元組對齊(位址的最低位元為0)。
 3-4 ARM處理器模式:
 ARM微處理器支援7種執行模式,分別為:
 使用者模式(User Mode,usr):ARM微處理器正常的程式執行狀態
 快速中斷模式(Fast Interrupt Request Mode,FIQ):應用於高速資料傳輸或通
道處理。
 外部中斷模式(Interrupt Request Mode,IRQ):用於通用的中斷處理。
 管理者模式(Supervisor Mode,SVC):作業系統使用的保護模式。
 中止模式(Abort Mode,ABT):當資料或指令預取終止時進入該模式,可用於虛擬
儲存及儲存保護。
 系統模式(System Mode,sys):執行具有特權的作業系統任務。
 未定義指令中止模式(UNDefined Mode,UND):當未定義的指令執行時進入
該模式,可用於支援硬體輔助運算器的軟體除錯。
 ARM微處理器的執行模式可以透過軟體改變,也可以透過外部中斷或例外是件處
理來改變。
 大多數的應用程式都是執行在使用者模式下。若是當處理器執行在使用者模式下
時,某些被保護的系統資源是不能被存取的。
 除使用者模式以外,其餘的所有六種模式稱之為非使用者模式,或是特權模式(
Privileged Modes);其中除去使用者模式和系統模式以外的五種又稱為例外模
式(Exception Modes),常用於處理中斷或例外事件,以及需要存取受保護的
系統資源等情況。
 3-5 ARM 內部暫存器剖析:
 整個ARM微處理器的暫存器架構是如圖3-3所示。其中,共有37個32位元暫存器
,其中31個為通用暫存器,6個為程式狀態暫存器。但是這些暫存器是不能被同
時存取的,至於哪些暫存器是可透過程式來存取的,則取決於微處理器的工作狀
態以及目前的執行模式。但在任何時刻,通用暫存器R0~R14、程式計數器PC、
一個或兩個程式狀態暫存器都是可存取的。
圖3-3 ARM狀態下的暫存器架構
 3-5.1 ARM狀態下的暫存器內容
 以下,分別介紹各種暫存器的內容與特性。
 通用暫存器
 通用暫存器包括R0~R15,可以分為三類:
 未分區塊暫存器,R0~R7
 分區塊暫存器,R8~R14
 程式計數器,PC(R15)(以下本書大都簡稱為PC)
 未分區塊暫存器,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。
 這在圖3-3中,是加上三角的標誌。暫存器R13在ARM指令中常用作堆疊指標(SP)
,但這只是一種習慣用法,使用者也可使用其他的暫存器最為堆疊指標。而在Thumb
指令中,某些指令強制性的要求使用R13作為堆疊指標。
 由於處理器的每種執行模式均有自己獨立的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保存副程式的返回位址。當使用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可以用作通用暫存器,但是有一些指令在使用R15時有一些特殊限制,若不注
意的話,執行的結果將是不可預測的。在ARM狀態下,PC的bit-0和bit-1是0,在
Thumb狀態下,PC值的bit-0則是0。
 R15雖然也可用作通用暫存器,但一般都不這麼使用。因為對R15的使用上還是有
一些特殊限制,若是違反了這些限制時,程式的執行結果則是未知的。
 由於ARM系列結構採用了多級管線的技術,對於ARM指令集而言,PC值總是指
向目前指令的後兩條指令的位元址,也即是PC值為當前指令的位元址值再加上8
個位元組。
 在ARM狀態下,任一時刻可以存取以上所討論的16個通用暫存器與一個到兩個的
狀態暫存器。在非使用者模式(特權模式)下,則可存取到特定模式分區塊暫存
器,圖3-3說明在每一種執行模式下,哪一些暫存器是可以存取的。
 R16暫存器
 R16暫存器是CPSR(Current Program Status Register,目前程式狀態暫存器)
,CPSR可在任何執行模式下被存取,它包括條件旗標位元、中斷除能位元、當
前處理器模式旗標位元,以及其他一些相關的控制和狀態位元。
 每一種執行模式下又都有一個專用的實體狀態暫存器,稱之為SPSR(Saved
Program Status Register,備份程式狀態暫存器)。當例外事件發生時,SPSR
用來保存CPSR的目前值,而從例外事件退出時,則可由SPSR的備分值來恢復
CPSR的暫存器。
 由於使用者模式和系統模式不屬於例外模式,所以都不具有SPSR。若是在這兩
種模式下,來存取SPSR的話,則結果是未知的。
 3-5.2 Thumb狀態下的暫存器架構
 Thumb狀態下的暫存器集是ARM狀態下暫存器集的一個子集,程式可以直接存取
8個通用暫存器(R0~R7)、堆疊指標(SP)、鏈結暫存器(LR)、程式計數器
(PC)和CPSR。同時,在每一種特權模式下都有一組SP、LR和SPSR。如圖34所示,為Thumb狀態下的暫存器架構圖。
圖3-4 Thumb狀態下的暫存器架構
 而Thumb狀態下的暫存器架構與ARM狀態下的暫存器架構的對應關係,如下列所
示:
 Thumb狀態下和ARM狀態下的R0~R7是相同的。
 Thumb狀態下和ARM狀態下的CPSR和所有的SPSR是相同的。
 Thumb狀態下的SP對應於ARM狀態下的R13。
 Thumb狀態下的LR對應於ARM狀態下的R14。
 Thumb狀態下的程式計數器對應於ARM狀態下的R15。
 以上的對應關係如圖3-5所示:
圖3-5 ARM與Thumb狀態下的暫存器對應圖
 從圖3-5中可以看到,在Thumb狀態下,高位元暫存器(Hi-Registers)R8~R15
並不是標準暫存器子集的一部份,但可使用組合語言程式受限制的存取這些暫
存器,將其用作快速的暫存器。使用具備特殊變數的MOV指令,資料可以在低
位元暫存器和高位元暫存器之間進行傳送;高位元暫存器的值可以使用CMP和
ADD指令進行比較或加上低位暫存器中的值。
 3-5.3 程式狀態暫存器(PSR)
 如圖3-6所示,可以看到ARM系列結構中,包含一個目前程式狀態暫存器(
CPSR)和5個備份程式狀態暫存器(SPSR_﹤mode ﹥)。備份程式狀態暫存
器是用來進行例外事件處理,其功能包括:
 保存ALU中的當前操作資訊
 控制允許和除能中斷
 設定處理器的執行模式
 程式狀態暫存器的每一位元的安排如圖3-6所示,以下分別加以探討:
圖3-6 程式狀態暫存器格式
 條件碼旗標欄位(Condition Code Flags)
 N、Z、C與V均為條件碼旗標位元。他們的內容可被算術或邏輯運算的結果而有
所改變,並且可以決定某條指令是否被執行。
 在ARM狀態下,絕大多數的指令都是有條件執行的。
 在Thumb狀態下,僅有分支指令是有條件執行的。
 條件碼旗標位元的各個位元具體涵義是如表3-1所示:
旗標位元
意義
N
負旗標,當用2補數所表示的有號數進行運算時,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的值:
—對於加/減法運算指令,當運算元和運算結果為2補數表示的有號數時,V=1表示有
號位元溢位。
—對於其他的非加/減運算指令,C值通常不改變。
Q
在ARM v5及以上版本的E系列處理器中,用Q旗標位元指示增強的DSP運算指令是否發
生了溢位。在其他版本的處理器中,Q旗標位元無定義。
表3-1條件碼旗標位元的具體意義表
 控制位元欄位
 PSR的低8位元(包括I、F、T和M[4:0])稱為控制位元。當發生例外事件的情況
時,這些位元可以被改變。如果處理器要執行特權模式,這些位元也可以由程式
來加以修改。
 中斷除能位元,I與F:
I =1,除能IRQ中斷。
F=1,除能FIQ中斷。
 T旗標位元:該位元反映處理器的執行狀態。
對於ARM系列結構V5及以上的版本的Thumb系列處理器,當該位元為1時,程式
執行於Thumb狀態,否則執行於ARM狀態。
對於ARM系列結構V5及以上的版本為非Thumb系列處理器,當該位元為1時,執
行下一條指令以引起未定義的例外指令;當該位元為0時,表示執行於ARM狀態
。


執行模式位元M[4:0]:M0、M1、M2、M3與M4是模式位元。這些位元決定了處理器的執行模
式。而其定義如表3-2所示:
表3-2執行模式位元M[4:0]的具體定義表
M[4:0]
處理器模式
可存取的暫存器
0b10000
使用者模式
PC,CPSR,R0-R14
0b10001
FIQ模式
PC,CPSR,SPSR_FIQ,R14_FIQ ~ R8_FIQ,R0 ~ R7
0b10010
IRQ模式
PC,CPSR,SPSR_IRQ,R14_IRQ,R13_IRQ,R0 ~ R12
0b10011
管理模式
PC,CPSR,SPSR_SVC,R14_SVC,R13_SVC,R0 ~ R12
0b10111
中止模式
PC,CPSR,SPSR_ABT,R14_ABT,R13_ABT,R0 ~ R12
0b11011
未定義模式
PC,CPSR,SPSR_UND,R14_UND,R13_UND,R0 ~
R12
0b11111
系統模式
PC,CPSR(ARM v4及以上版本),R0 ~ R14
由表3-2可知,並不是所有的執行模式位元的組合都是有效地,其他的組合結
果會導致處理器進入一個不可恢復的狀態。
 保留位元欄位
 PSR中的其餘位元為保留位元,當改變PSR中的條件碼旗標位元或者控制位元時
,保留位元不要被改變,在程式中也不要使用保留位元來存儲資料。保留位元將應
用於未來ARM版本的擴展上。
 3-6 例外(Exceptions)事件:
 當正常的程式執行流程發生暫時的停止時,稱之為例外事件。例如,處理一個外部
的中斷請求。在處理例外事件之前,目前處理器的狀態必須加以保留,這樣當例外
事件處理完成之後,目前程式才可以繼續執行。處理器允許多個例外事件同時發生
,它們將會按固定的優先權順序來處理。
 這種存在ARM系列結構中的例外事件,是與8位元/16位元系列結構中斷有很大的
相似之處,但例外事件與中斷的概念並不完全相同。
 3-6.1 例外事件類型
 ARM系列結構所支援的例外事件以及其具體含義如表3-3所示。
 表3-3 ARM系列結構所支援的例外事件類型表
例外事件類型
具體含義
重置
當處理器的重置電位(nRESET)有效時,產生重置例外事件,程式會
跳躍到重置例外事件處理程式處開始執行
未定義指令
當ARM微處理器或輔助運算器遇到不能處理的指令時,產生未定義
指令例外事件。但我們可以使用這種例外事件的機制來進行軟體模擬
與除錯的目的。
軟體中斷
該例外事件由執行SWI指令產生,可用於使用者模式下的程式引用特
權操作指令。但我們可使用這種例外事件機制來實現系統功能的引用
。
指令預取中止
若處理器預取指令的位元址是不存在,或是該位址不允許當前
指令存取,記憶體會向處理器發出中止信號,但當預取的指令被執行
時,才會產生指令預取中止例外事件。
資料中止
若處理器資料存取指令的位元址不存在,或該位址不允許當前
指令存取時,產生資料中止例外事件。
IRQ (外部中斷請求)
當處理器的外部中斷請求接腳(nIRQ)有效,且CPSR中的I位元
為0時,產生IRQ例外事件。系統的外部設備可透過該例外事
件來請求中斷服務。
FIQ(快速中斷請求)
當處理器的快速中斷請求接腳(nFIQ)有效,且CPSR中的F
位元為0時,產生FIQ例外事件。
 3-6.2 對例外事件的回應方式
 當一個例外事件出現以後,會將下一條指令的位元址存入相應鏈結暫存器LR,以
便程式在處理例外事件返回時能從正確的位置重新開始執行。若例外事件是從
ARM狀態進入的話,LR暫存器中保存的是下一條指令的位元址(目前PC值+4
或PC值+8,與例外事件的類型有關);若例外事件是從Thumb狀態進入,則在
LR暫存器中保存目前PC的偏移量。這樣,例外事件處理程式就不需要確定例外
事件是從何種狀態進入的。例如:在軟體中斷例外SWI事件中,指令 MOV PC,
R14_SVC總是會返回到下一條指令,不管SWI是在ARM狀態執行,還是在
Thumb狀態執行。當一個例外事件出現以後,ARM微處理器會執行以下幾個步
驟來執行,如圖3-7所示:
正常流程執行
例外事件情況?
SPSR_<mode>=CPSR
CPSR.M=mode
CPSR.I=1
IR_<mode>=
返回參考位址
PC=
例外事件向量
CPSR=SPSR_<mode>
PC=返回位址
圖3-7 例外事件發生時,所需執行的步驟流程圖
 相關步驟,如下作深入的說明:
 1. 將CPSR的內容複製到相對應的程式操作模式的SPSR中。
EX:軟體中斷指令SWI會引發軟體中斷SWI指令例外事件, SPSR_SVC =CPSR
 2. 根據例外事件類型,強制設置CPSR的執行模式位元。將例外事件設定到CPSR中
的程式操作模式位元,並設定中斷除能位元。若發生的例外事件是快速中斷請求,
則一併設定快速中斷除能位元
EX:CPSR_M=0b10011(Supervisor Mode),CPSR_I=1
 3. 將返回位址儲存至相對應操作模式的R14鏈結暫存器中。這返回位址是發生例外
事件時,正常流程下應執行而尚未執行的指令位元址。
EX:R14_SVC=PC – 4
 4. 將例外事件向量填寫到PC中(參考表3-5)。
EX:PC=0x00000008
 如果例外事件發生時,微處理器是處於Thumb狀態的話,則當例外向量位址載入至
PC值時,微處理器就會自動切換回到ARM狀態。
 3-6.3 從例外事件返回
 從圖3-7可知,當例外事件處理完畢之後,對程式設計者來說,需同時執行下列的
工作:
 1. 將目前程式操作模式的SPSR內容複製到CPSR。
 2. 根據目前程式操作模式R14鏈結暫存器的值,將返回位址值設定至PC中。返回
位址的值須根據R14的值,目前處理器指令集狀態和程式操作模式來計算出。例如
,SUBS PC,R14_SVC,#4。
 3. 若在進入例外處理時設定了中斷除能位元,要在此加以清除掉。
 此外,我們可以認為應用程式總是從重置例外事件處理程式開始執行的,因此重置
例外處理程式是不需要返回的。
 綜合上述,ARM微處理器對例外事件的回應過程可以透過下列的程式碼來加以
說明:
R14_<Exception_Mode>=Return Link
SPSR_<Exception_Mode>=CPSR
CPSR[4:0]=Exception Mode Number
CPSR[5]=0
;當執行在arm工作狀態時
If <Exception_Mode>==Reset or FIQ then ;當回應FIQ例外事件時,除能
新的FIQ例外事件
CPSR[6]=1
; 除能快速中斷(FIQ)
CPSR[7]=1
; 除能外部中斷(IRQ)
PC = Exception Vector Address
 3-6.4 各類型例外事件的具體描述
 以下,我們進一步地敘述各類型的例外事件的詳細內容:
 重置
 當系統的電源重新被啟動或是ARM微處理器的重置訊號輸入接腳上,偵測到產生
重置電位時,則ARM微處理器就會產生重置例外事件。而ARM重置例外事件處裡
的程式通常是用來設定或執行下列的工作,以其整個系統的運作重新正常地執行:
 設定重置例外事件向量表。
 啟始暫存器與堆疊位址。
 若系統是包含MMU,則啟始記憶體系統。
 啟始輸出入設備的外部接腳狀態。
 設定此系統所要用到的中斷。
 設定處理器指令狀態或是操作模式。
 設定相當變數的初始值。
 呼叫主程式。
 當發生重置例外事件時,目前正在執行的指令會被放棄,但是仍會持續地讀取指
令,直到重置訊號輸入接腳恢復到正常電位為止。而此時根據圖3-7的流程圖,微
處理器會執行下列的步驟:
 1. 將目前的PC值與CPSR值分別複製到R14_SVC與SPSR_SVC中。

2. 將CPSR中的模式位元設定M[4:0]設定為0b10011(根據表3-2所示)的管理模
式(Supervisor Mode),且中斷要求除能位元I與快速中斷要求除能位元F被設
定為1(禁止,除能),以及指令集狀態位元T被清除為0(設定為ARM指令集狀
態)。

3. PC值被更新為0x00000000,即是跳回到ARM指令集狀態,並從PC位址0開
始執行。
稍候的例外事件,都會進行類似的步驟。

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 Interrupt(軟體中斷)
 軟體中斷指令(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)值,並返回到
未定義指令後的下一條指令。


3-6.5 例外事件進入/跳躍
最後,如表3-4所示,總結了進入例外事件處理時,保存在相應R14中的PC值,以及在離開例
外事件處理時所建議使用的指令。

表3-4例外進入/跳躍
返回指令
之前的狀態
注意
ARM R14_x
Thumb R14_x
BL
MOV PC,R14
PC+4
PC+2
1
SWI
SUBS PC, R14_SVC
PC+4
PC+2
1
UDEF
SUBS 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
RESE
T
NA
4
 注意:
1. 在此PC應是具有預取中止的BL/SWI/未定義指令所取的位元址。
2. 在此PC是從FIQ或IRQ取得不能執行的指令的位元址。
3. 在此PC是產生資料中止的載入或存回指令的位元址。
4. 系統重置時,保存在R14_SVC中的值是不可預知的。

3-6.6 例外事件向量(Exception Vectors)

而表3-5則顯示了例外事件個別的向量位址。當發生相對的例外事件的話,程式就會在此向量
位址處開始執行。

表3-5例外向量表
位址
例外事件
進入模式
0x00000000
重置
管理模式
0x00000004
未定義指令
未定義模式
0x00000008
軟體中斷
管理模式
0x0000000C
中止(預取指令)
中止模式
0x00000010
中止(數據)
中止模式
0x00000014
保留
保留
0x00000018
IRQ
IRQ
0x0000001C
FIQ
FIQ
 3-6.7 例外事件的優先權順序(Exception Priorities)
 當多個例外事件同時發生時,系統會根據固定的優先權順序來決定例外事件的處
理次序。如表3-6所示,例外事件的優先權順序由高到低的排列順序。這個部分類
似一般微處理器的中斷優先權順序的功能。
 表3-6例外事件優先權順序
優先權順序
例外事件
1(最高)
重置
2
資料中止
3
FIQ
4
IRQ
5
預取指令中止
6(最低)
未定義指令、SWI
 3-6.8 應用程式中的例外事件處理
 當系統執行時,例外事件可能會隨時發生。為了保證在ARM微處理器發生例外事
件時不至於處於未知狀態,因此在應用程式的設計中,首先要進行例外事件處理
。這裡,所採用的方式是在例外事件向量表中的特定位置處放置一條跳躍指令,
以跳躍到例外事件處理程式中。當ARM微處理器發生例外事件時,程式計數器PC
會被強制設定為對應的例外事件向量,進而跳躍到例外事件處理程式。最後,當
例外事件處理完成以後,在返回到主程式繼續執行。
 3-7 問題與討論:
 一、ARM 微處理器分成那兩種工作狀態?
 二、字元組在記憶體上依位元組的順序按排可分成那兩種?
 三、ARM處理器支援那7種工作模式。
 四、說明程式計數器的功能。
 五、說明程式狀態暫存器的功能。
 六、ARM支援那些意外事件。
 七、說明ARM是如何進入意外工作模式。