1 / 52

第 三 章 ARM 微處理器剖析

第 三 章 ARM 微處理器剖析. DMATEK CO.,LTD 深圳市長高科技有限公司. 本章將簡介了 ARM 微處理器程式設計模型的基本概念,包括:工作狀態切換、資料的記憶體存放格式、處理器的例外事件等。透過對本章的介紹,希望讀者能瞭解 ARM 微處理器的基本工作原理以及一些與程式設計相關的技術細節,為稍後的程式設計打下基礎。本章的主要內容包括: ■ ARM 微處理器的工作狀態 ■ ARM 系列結構的定址方式與記憶體格式 ■ ARM 微處理器的工作模式 ■ ARM 系列結構的暫存器架構 ■ ARM 微處理器的例外事件狀態.

suchi
Download Presentation

第 三 章 ARM 微處理器剖析

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第三章ARM微處理器剖析 DMATEK CO.,LTD 深圳市長高科技有限公司

  2. 本章將簡介了ARM微處理器程式設計模型的基本概念,包括:工作狀態切換、資料的記憶體存放格式、處理器的例外事件等。透過對本章的介紹,希望讀者能瞭解ARM微處理器的基本工作原理以及一些與程式設計相關的技術細節,為稍後的程式設計打下基礎。本章的主要內容包括:本章將簡介了ARM微處理器程式設計模型的基本概念,包括:工作狀態切換、資料的記憶體存放格式、處理器的例外事件等。透過對本章的介紹,希望讀者能瞭解ARM微處理器的基本工作原理以及一些與程式設計相關的技術細節,為稍後的程式設計打下基礎。本章的主要內容包括: ■ ARM微處理器的工作狀態 ■ ARM系列結構的定址方式與記憶體格式 ■ ARM微處理器的工作模式 ■ ARM系列結構的暫存器架構 ■ ARM微處理器的例外事件狀態

  3. 由於ARM微處理器是32位元,這與我們所常使用的8位元/16位元的微處理器來說,還是有很大的差異。因此在本章開始之前,需要對字元組(Word),半字元組(Half-Word)與位元組(Byte)的概念作一個說明:由於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位元。

  4. 3-1 ARM微處理器的工作狀態: • 從程式的角度來看,ARM微處理器的工作狀態一般有兩種,並可在兩種狀態之間切換: • ARM狀態,此時處理器執行32位元的字元組對齊的ARM指令。 • Thumb狀態,此時處理器執行16位元,半字元組對齊的Thumb指令。 • 當ARM微處理器一開始起動或執行32位元的ARM指令集時,會工作在ARM狀態;當ARM微處理器執行16位元的Thumb指令集時,工作在Thumb狀態。在程式的執行過程中,微處理器可以隨時在兩種工作狀態之間切換,並且處理器工作狀態的轉變並不影響處理器的工作模式和相應暫存器中的內容。而狀態切換方法,如下所列: • ARM指令集和Thumb指令集均有切換處理器狀態的指令,並可在兩種工作狀態之間切換,但ARM微處理器在一開始執行程式碼時,應處於ARM狀態。以下,列出進入這幾種狀態的方式:

  5. 進入Thumb狀態:當運算元暫存器<Rm>的狀態位元(bit-0)為1時,可以採用執行BX指令的方法,使微處理器從ARM狀態切換到Thumb狀態。此外,當處理器處於Thumb狀態時,若是發生了例外事件(如IRQ、FIQ、UNDef、Abort與SWI)的話,則當例外事件處理後返回時,能夠自動切換到Thumb狀態。進入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絕對位址的任一字元位址。

  6. 例如: .code 32 //此處起的程式以ARM指令集編譯 BX r0 //若r0[31:1]為位址label1,r0[0]=1為跳躍至label1處執行時,切換為Thumb指令集狀態 .code 16 //只是從此處的程式為Thumb指令集狀態 label1: //label1程式進入點

  7. 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位元組所組成。

  8. 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的指令。

  9. 此外,位址空間在排列時,需依照某種規格來排列。對於字元組對齊的位址A,定址空間的規則是:此外,位址空間在排列時,需依照某種規格來排列。對於字元組對齊的位址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)格式,具體說明如下:

  10. 圖3-1 以大端格式存儲字元組資料 • 大端(Big Endian)格式 • 在這種格式中,字元組資料的高位元組是存儲在低位址中,而字元組資料的低位元組則存放在高位址中,如圖3-1所示。這一系列的微處理器以Motorola系列的晶片組為主要的代表。 • 字元組對齊的位元組或是半字元組是該位址的最高有效位元組或是半字元組。 • 半字元組對齊的位元組是該位址的半字元組的最高有效的位元組。

  11. 圖3-2以小端格式存儲字元組資料 • 小端(Little Endian)格式 • 與大端存儲格式相反,在小端存儲格式中,低位址中存放的是字元組資料的低位元組,高位址存放的是字元組資料的高位元組。如圖3-2所示,這一系列的微處理器以Atmel系列的晶片組為主要的代表。 • 字元組對齊的位元組或是半字元組是該位址的最低有效的位元組或是半字元組。 • 半字元組對齊的位元組是該位址的半字元組的最低有效的位元組。

  12. 3-3指令長度及資料類型: • ARM微處理器的指令長度可以是32位元(在ARM狀態下),也可以為16位元(在Thumb狀態下)。 • ARM微處理器中支援位元組(8位元),半字元組(16位元)以及字元組(32位元)等三種資料類型。其中,字元組需要4個位元對齊(位址的最低兩位元為0),半字元組需要2個位元組對齊(位址的最低位元為0)。

  13. 3-4ARM處理器模式: • ARM微處理器支援7種執行模式,分別為: • 使用者模式(User Mode,usr):ARM微處理器正常的程式執行狀態 • 快速中斷模式(Fast Interrupt Request Mode,FIQ):應用於高速資料傳輸或通道處理。 • 外部中斷模式(Interrupt Request Mode,IRQ):用於通用的中斷處理。 • 管理者模式(Supervisor Mode,SVC):作業系統使用的保護模式。 • 中止模式(Abort Mode,ABT):當資料或指令預取終止時進入該模式,可用於虛擬儲存及儲存保護。 • 系統模式(System Mode,sys):執行具有特權的作業系統任務。

  14. 未定義指令中止模式(UNDefined Mode,UND):當未定義的指令執行時進入該模式,可用於支援硬體輔助運算器的軟體除錯。 • ARM微處理器的執行模式可以透過軟體改變,也可以透過外部中斷或例外是件處理來改變。 • 大多數的應用程式都是執行在使用者模式下。若是當處理器執行在使用者模式下時,某些被保護的系統資源是不能被存取的。 • 除使用者模式以外,其餘的所有六種模式稱之為非使用者模式,或是特權模式(Privileged Modes);其中除去使用者模式和系統模式以外的五種又稱為例外模式(Exception Modes),常用於處理中斷或例外事件,以及需要存取受保護的系統資源等情況。

  15. 3-5 ARM 內部暫存器剖析: • 整個ARM微處理器的暫存器架構是如圖3-3所示。其中,共有37個32位元暫存器,其中31個為通用暫存器,6個為程式狀態暫存器。但是這些暫存器是不能被同時存取的,至於哪些暫存器是可透過程式來存取的,則取決於微處理器的工作狀態以及目前的執行模式。但在任何時刻,通用暫存器R0~R14、程式計數器PC、一個或兩個程式狀態暫存器都是可存取的。

  16. 圖3-3 ARM狀態下的暫存器架構

  17. 3-5.1 ARM狀態下的暫存器內容 • 以下,分別介紹各種暫存器的內容與特性。 • 通用暫存器 • 通用暫存器包括R0~R15,可以分為三類: • 未分區塊暫存器,R0~R7 • 分區塊暫存器,R8~R14 • 程式計數器,PC(R15)(以下本書大都簡稱為PC)

  18. 未分區塊暫存器,R0~R7 • 在所有的執行模式下,未分區塊暫存器都指向同一個實體暫存器,他們未被系統用作特殊的用途。但是在中斷或例外事件處理進行執行模式轉換時,由於不同的處理器執行模式均使用相同的實體暫存器,可能會造成暫存器中資料被破壞或是被更改。所以在進行程式設計時應該特別地加以注意。 • 分區塊暫存器,R8~R14 • 對於分區塊暫存器,他們每一次所存取的實體暫存器與處理器目前的執行模式有關。 • 對於R8~R12來說,每個暫存器對應兩個不同的實體暫存器。例如,當使用FIQ模式時,存取暫存器是R8_FIQ~R12_FIQ。當使用除了FIQ模式以外的其他模式時,存取暫存器就變成R8_USR~R12_USR。

  19. 對於R13與R14來說,每個暫存器對應6個不同的實體暫存器,其中的一個是使用者模式與系統模式共用,另外5個實體暫存器對應於其他5種不同的執行模式。為了易於辨識,因此採用以下的記號來區分不同的實體暫存器:對於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所指向的堆疊。而當程式從例外模式返回時,則從對應的堆疊中恢復。採用這種方式最主要的原因是可以保證例外事件發生後,程式可以正常執行。

  20. 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也可作為通用暫存器。

  21. 程式計數器,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說明在每一種執行模式下,哪一些暫存器是可以存取的。

  22. 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。如圖3-4所示,為Thumb狀態下的暫存器架構圖。

  23. 圖3-4 Thumb狀態下的暫存器架構

  24. 而Thumb狀態下的暫存器架構與ARM狀態下的暫存器架構的對應關係,如下列所示:而Thumb狀態下的暫存器架構與ARM狀態下的暫存器架構的對應關係,如下列所示: • Thumb狀態下和ARM狀態下的R0~R7是相同的。 • Thumb狀態下和ARM狀態下的CPSR和所有的SPSR是相同的。 • Thumb狀態下的SP對應於ARM狀態下的R13。 • Thumb狀態下的LR對應於ARM狀態下的R14。 • Thumb狀態下的程式計數器對應於ARM狀態下的R15。 • 以上的對應關係如圖3-5所示:

  25. 圖3-5 ARM與Thumb狀態下的暫存器對應圖

  26. 從圖3-5中可以看到,在Thumb狀態下,高位元暫存器(Hi-Registers)R8~R15並不是標準暫存器子集的一部份,但可使用組合語言程式受限制的存取這些暫存器,將其用作快速的暫存器。使用具備特殊變數的MOV指令,資料可以在低位元暫存器和高位元暫存器之間進行傳送;高位元暫存器的值可以使用CMP和ADD指令進行比較或加上低位暫存器中的值。從圖3-5中可以看到,在Thumb狀態下,高位元暫存器(Hi-Registers)R8~R15並不是標準暫存器子集的一部份,但可使用組合語言程式受限制的存取這些暫存器,將其用作快速的暫存器。使用具備特殊變數的MOV指令,資料可以在低位元暫存器和高位元暫存器之間進行傳送;高位元暫存器的值可以使用CMP和ADD指令進行比較或加上低位暫存器中的值。 • 3-5.3 程式狀態暫存器(PSR) • 如圖3-6所示,可以看到ARM系列結構中,包含一個目前程式狀態暫存器(CPSR)和5個備份程式狀態暫存器(SPSR_﹤mode ﹥)。備份程式狀態暫存器是用來進行例外事件處理,其功能包括: • 保存ALU中的當前操作資訊 • 控制允許和除能中斷 • 設定處理器的執行模式

  27. 圖3-6 程式狀態暫存器格式 • 程式狀態暫存器的每一位元的安排如圖3-6所示,以下分別加以探討:

  28. 條件碼旗標欄位(Condition Code Flags) • N、Z、C與V均為條件碼旗標位元。他們的內容可被算術或邏輯運算的結果而有所改變,並且可以決定某條指令是否被執行。 • 在ARM狀態下,絕大多數的指令都是有條件執行的。 • 在Thumb狀態下,僅有分支指令是有條件執行的。 • 條件碼旗標位元的各個位元具體涵義是如表3-1所示:

  29. 表3-1條件碼旗標位元的具體意義表

  30. 控制位元欄位 • 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狀態。

  31. 執行模式位元M[4:0]:M0、M1、M2、M3與M4是模式位元。這些位元決定了處理器的執行模式。而其定義如表3-2所示:執行模式位元M[4:0]:M0、M1、M2、M3與M4是模式位元。這些位元決定了處理器的執行模式。而其定義如表3-2所示: • 表3-2執行模式位元M[4:0]的具體定義表 由表3-2可知,並不是所有的執行模式位元的組合都是有效地,其他的組合結果會導致處理器進入一個不可恢復的狀態。

  32. 保留位元欄位 • PSR中的其餘位元為保留位元,當改變PSR中的條件碼旗標位元或者控制位元時,保留位元不要被改變,在程式中也不要使用保留位元來存儲資料。保留位元將應用於未來ARM版本的擴展上。 • 3-6 例外(Exceptions)事件: • 當正常的程式執行流程發生暫時的停止時,稱之為例外事件。例如,處理一個外部的中斷請求。在處理例外事件之前,目前處理器的狀態必須加以保留,這樣當例外事件處理完成之後,目前程式才可以繼續執行。處理器允許多個例外事件同時發生,它們將會按固定的優先權順序來處理。 • 這種存在ARM系列結構中的例外事件,是與8位元/16位元系列結構中斷有很大的相似之處,但例外事件與中斷的概念並不完全相同。

  33. 3-6.1例外事件類型 • ARM系列結構所支援的例外事件以及其具體含義如表3-3所示。 • 表3-3 ARM系列結構所支援的例外事件類型表

  34. 3-6.2 對例外事件的回應方式 • 當一個例外事件出現以後,會將下一條指令的位元址存入相應鏈結暫存器LR,以便程式在處理例外事件返回時能從正確的位置重新開始執行。若例外事件是從ARM狀態進入的話,LR暫存器中保存的是下一條指令的位元址(目前PC值+4或PC值+8,與例外事件的類型有關);若例外事件是從Thumb狀態進入,則在LR暫存器中保存目前PC的偏移量。這樣,例外事件處理程式就不需要確定例外事件是從何種狀態進入的。例如:在軟體中斷例外SWI事件中,指令 MOV PC,R14_SVC總是會返回到下一條指令,不管SWI是在ARM狀態執行,還是在Thumb狀態執行。當一個例外事件出現以後,ARM微處理器會執行以下幾個步驟來執行,如圖3-7所示:

  35. 正常流程執行 例外事件情況? SPSR_<mode>=CPSR CPSR.M=mode CPSR.I=1 IR_<mode>= 返回參考位址 PC= 例外事件向量 CPSR=SPSR_<mode> PC=返回位址 圖3-7 例外事件發生時,所需執行的步驟流程圖

  36. 相關步驟,如下作深入的說明: • 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狀態。

  37. 3-6.3 從例外事件返回 • 從圖3-7可知,當例外事件處理完畢之後,對程式設計者來說,需同時執行下列的工作: • 1. 將目前程式操作模式的SPSR內容複製到CPSR。 • 2. 根據目前程式操作模式R14鏈結暫存器的值,將返回位址值設定至PC中。返回位址的值須根據R14的值,目前處理器指令集狀態和程式操作模式來計算出。例如,SUBS PC,R14_SVC,#4。 • 3. 若在進入例外處理時設定了中斷除能位元,要在此加以清除掉。 • 此外,我們可以認為應用程式總是從重置例外事件處理程式開始執行的,因此重置例外處理程式是不需要返回的。

  38. 綜合上述,ARM微處理器對例外事件的回應過程可以透過下列的程式碼來加以說明:綜合上述,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

  39. 3-6.4各類型例外事件的具體描述 • 以下,我們進一步地敘述各類型的例外事件的詳細內容: • 重置 • 當系統的電源重新被啟動或是ARM微處理器的重置訊號輸入接腳上,偵測到產生重置電位時,則ARM微處理器就會產生重置例外事件。而ARM重置例外事件處裡的程式通常是用來設定或執行下列的工作,以其整個系統的運作重新正常地執行: • 設定重置例外事件向量表。 • 啟始暫存器與堆疊位址。 • 若系統是包含MMU,則啟始記憶體系統。

  40. 啟始輸出入設備的外部接腳狀態。 • 設定此系統所要用到的中斷。 • 設定處理器指令狀態或是操作模式。 • 設定相當變數的初始值。 • 呼叫主程式。 • 當發生重置例外事件時,目前正在執行的指令會被放棄,但是仍會持續地讀取指令,直到重置訊號輸入接腳恢復到正常電位為止。而此時根據圖3-7的流程圖,微處理器會執行下列的步驟: • 1. 將目前的PC值與CPSR值分別複製到R14_SVC與SPSR_SVC中。

  41. 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

  42. 該指令將暫存器R14_FIQ的值減去4後,複製到PC值中,進而實現從例外事件處理程式中的返回,同時將SPSR_mode暫存器的內容複製到CPSR中。該指令將暫存器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中。

  43. ABORT(中止) • 產生中止例外事件,是意謂著對記憶體的存取失敗。ARM微處理器在記憶體存取週期內檢查是否發生中止例外事件。 中止例外事件,包括兩種類型: • 指令預取中止:發生在指令預期時。 • 資料中止:發生在資料存取時。 • 當指令預取存取記憶體失敗時,記憶體系統向ARM微處理器發出記憶體中止(Abort)信號,預取的指令被記為無效,但只有當處理器試圖執行無效指令時,指令預取中止例外事件才會發生。如果指令未被執行,例如在指令管線中發生了跳躍,則預取指令中止是不會發生的。 若資料中止發生,則系統的回應與指令的類型有關。 當確定了中止的原因後,Abort處理程式均會執行以下指令從中止模式返回,無論是在ARM狀態還是Thumb狀態:

  44. 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的下一條指令。

  45. UNDefined Instruction(未定義指令) • 當ARM微處理器遇到不能處理的指令時,會產生未定義指令例外事件。採用這種機制,可以透過軟體模擬擴展ARM或Thumb指令集。 • 在模擬未定義指令後,處理器執行以下程式返回,無論是在ARM狀態還是Thumb狀態: MOVS PC, R14_UND 以上指令恢復了PC值(從R14_UND)和CPSR(從SPSR_UND)值,並返回到未定義指令後的下一條指令。

  46. 3-6.5 例外事件進入/跳躍 • 最後,如表3-4所示,總結了進入例外事件處理時,保存在相應R14中的PC值,以及在離開例外事件處理時所建議使用的指令。 • 表3-4例外進入/跳躍

  47. 注意: 1. 在此PC應是具有預取中止的BL/SWI/未定義指令所取的位元址。 2. 在此PC是從FIQ或IRQ取得不能執行的指令的位元址。 3. 在此PC是產生資料中止的載入或存回指令的位元址。 4. 系統重置時,保存在R14_SVC中的值是不可預知的。

  48. 3-6.6 例外事件向量(Exception Vectors) • 而表3-5則顯示了例外事件個別的向量位址。當發生相對的例外事件的話,程式就會在此向量位址處開始執行。 • 表3-5例外向量表

  49. 3-6.7 例外事件的優先權順序(Exception Priorities) • 當多個例外事件同時發生時,系統會根據固定的優先權順序來決定例外事件的處理次序。如表3-6所示,例外事件的優先權順序由高到低的排列順序。這個部分類似一般微處理器的中斷優先權順序的功能。 • 表3-6例外事件優先權順序

More Related