ARM編程模型

ARM 260瀏覽

1. ARM處理器的工作狀態

1)從編程的角度看,ARM微處理器的工作狀態一般有兩種,并可在兩種狀態之間切換:
??? ? ARM狀態:此時處理器執行32位的字對齊的ARM指令;
??? ? Thumb狀態:此時處理器執行16位的、半字對齊的Thumb指令。

2) Thumb和ARM

???? THUMB指令是ARM指令的子集,可以相互調用,只要遵循一定的調用規則,Thumb指令與ARM指令的時間效率和空間效率關系為:
???? ??存儲空間約為ARM代碼的60%~70%
???? ??指令數比ARM代碼多約30%~40%
???? ? 存儲器為32位時ARM代碼比Thumb代碼快約40%
???? ? 存儲器為16位時Thumb比ARM代碼快約40~50%
???? ? 使用Thumb代碼,存儲器的功耗會降低約30%

3. 狀態切換方法
???? ARM指令集和Thumb指令集均有切換處理器狀態的指令,并可在兩種工作狀態之間切換,在開始執行代碼時,應該處于ARM狀態。

??? ? 進入Thumb狀態
?????? 當操作數寄存器的狀態位(位0)為1時,可以采用執行BX指令的方法,使微處理器從ARM狀態切換到Thumb狀態。當處理器處于Thumb狀態時發生異常(如IRQ、FIQ、Undef、Abort、SWI等),則異常處理返回時,自動切換到Thumb狀態。
??? ? 切換到ARM狀態
??????當操作數寄存器的狀態位為0時,執行BX指令時可以使微處理器從Thumb狀態切換到ARM狀態。在處理器進行異常處理時,把PC指針放入異常模式鏈接寄存器中,并從異常向量地址開始執行程序,也可以使處理器切換到ARM狀態。?

2. ARM處理器的工作模式

?ARM有以下7種工作模式:

? ? usr:ARM處理器正常的程序執行狀態
? ? fiq:用于高速數據傳輸或通道處理
? ? irq:用于通用的中斷處理
? ? svc:操作系統使用的保護模式
??? abt:用于虛擬存儲及存儲保護
? ? und:當出現未定義指令終止時進入該模式
??? sys:運行具有特權的操作系統任務

?2.1 用戶模式和特權模式

?? ?? 除了用戶模式之外的其他6種處理器模式稱為特權模式,特權模式中,除系統模式外,其他5種模式又稱為異常模式。
?? ???特權模式下,程序可以訪問所有的系統資源,也可以任意地進行處理器模式的切換。
? ????大多數的用戶程序運行在用戶模式下,此時,應用程序不能夠訪問一些受操作系統保護的系統資源,應用程序也不能直接進行處理器模式的切換。用戶模式下,當需要進行處理器模式切換時,應用程序可以產生異常處理(如SWI),在異常處理中進行處理器模式的切換。

2.2 模式切換

??? ??處理器模式可以通過軟件進行切換,也可以通過外部中斷或者異常處理過程進行切換。
??? ??當應用程序發生異常中斷時,處理器進入相應的異常模式。在每一種異常模式下都有一組寄存器,供相應的異常處理程序使用,這樣就可以保證在進入異常模式時,用戶模式下的寄存器不被破壞。
?? ???系統模式并不是通過異常進入的,它和用戶模式具有完全一樣的寄存器。但是系統模式屬于特權模式,可以訪問所有的系統資源,也可以直接進行處理器模式切換。它主要供操作系統任務使用。通常操作系統的任務需要訪問所有的系統資源,同時該任務仍然使用用戶模式的寄存器組,而不是使用異常模式下相應的寄存器組,這樣可以保證當異常中斷發生時任務狀態不被破壞。??

3. ARM處理器的存儲器格式

??? ARM體系結構所支持的最大尋址空間為4GB(232字節)
??? ARM體系結構將存儲器看作是從零地址開始的字節的線性組合。從零字節到三字節放置第一個存儲的字數據,從第四個字節到第七個字節放置第二個存儲的字數據,依次排列。ARM體系結構可以用兩種方法存儲字數據,稱之為大端格式和小端格式。

?3.1 大端格式

??? 在這種格式中,字數據的高字節存儲在低地址中,而字數據的低字節則存放在高地址中。

?3.2 小端格式

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


3.3 指令長度及數據類型

???? ARM微處理器的指令長度可以是32位(在ARM狀態下),也可以為16位(在Thumb狀態下)。
?? ? ARM微處理器中支持字節(8位)、半字(16位)、字(32位)三種數據類型,其中,字需要4字節對齊(地址的低兩位為0)、半字需要2字節對齊(地址的最低位為0)。
??

4. ARM 處理器的寄存器組織

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

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

???? ? 未分組寄存器R0~R7
?????? 分組寄存器R8~R14
???? ? 程序計數器PC(R15)

?

?

4.1 未分組寄存器R0~R7 (8個物理寄存器)

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

4.2 分組寄存器R8~R12 (5x2=10個物理寄存器)

???? 每次所訪問的物理寄存器與處理器當前的運行模式有關,R8~R12:每個寄存器對應兩個不同的物理寄存器:
???? ? 當使用fiq模式時,訪問寄存器R8_fiq~R12_fiq;
???? ? 當使用除fiq模式以外的其他模式時,訪問寄存器R8_usr~R12_usr。?

4.3 分組寄存器R13~R14 (2x6=12 個物理寄存器)

????? R13、R14:每個寄存器對應6個不同的物理寄存器,其中的一個是用戶模式與系統模式共用,另外5個物理寄存器對應于其他5種不同的運行模式。采用以下的記號來區分不同的物理寄存器:
???? ? R13_<mode>
???? ? R14_<mode>
???? mode為以下幾種之一:usr、fiq、irq、svc、abt、und。

4.3.1 堆棧指針—R13

????? R13在ARM指令中常用作堆棧指針,但這只是一種習慣用法,用戶也可使用其他的寄存器作為堆棧指針。在Thumb指令集中,某些指令強制性的要求使用R13作為堆棧指針。由于處理器的每種運行模式均有自己獨立的物理寄存器R13,在初始化部分,都要初始化每種模式下的R13,這樣,當程序的運行進入異常模式時,可以將需要保護的寄存器放入R13所指向的堆棧,而當程序從異常模式返回時,則從對應的堆棧中恢復。

4.3.2 子程序連接寄存器—R14

???? R14也稱作子程序連接寄存器或連接寄存器LR。當執行BL子程序調用指令時,可以從R14中得到R15(程序計數器PC)的備份。其他情況下,R14用作通用寄存器。
???? 在每一種運行模式下,都可用R14保存子程序的返回地址,當用BL或BLX指令調用子程序時,將PC的當前值拷貝給R14,執行完子程序后,又將R14的值拷貝回PC,即可完成子程序的調用返回。
BL?SUB1
?……
?SUB1:?STMFD?SP!, {<regs>, LR} /*將R14存入堆棧*/
?……
?LDMFD?SP!,{<regs>,PC}/*完成子程序返回 */

4.4 程序計數器PC(R15) (1個物理寄存器)

???????? ARM狀態下,位[1:0]為0,位[31:2]用于保存PC;
?????? ? Thumb狀態下,位[0]為0,位[31:1]用于保存PC;
?????? ? R15雖然也可用作通用寄存器,但一般不這么使用,因為對R15的使用有一些特殊的限制,當違反了這些限制時,程序的執行結果是未知的。
??????? 由于ARM體系結構采用了多級流水線技術,對于ARM指令集而言,PC總是指向當前指令的下兩條指令的地址,即PC的值為當前執行指令的地址值加8個字節。

4.5 程序狀態寄存器(CPSR/SPSR) (6個物理寄存器:1個CPSR+5個SPSR)

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

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

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

4.6 Thumb狀態下的寄存器

????? Thumb狀態下的寄存器集是ARM狀態下寄存器集的一個子集,程序可以直接訪問8個通用寄存器(R0~R7)、程序計數器(PC)、堆棧指針(SP)、連接寄存器(LR)和CPSR。同樣,每一種特權模式下都有一組SP、LR和SPSR。Thumb狀態下的寄存器與ARM狀態下的寄存器關系如下圖所示:

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

4.7 程序狀態寄存器

??????? ARM體系結構包含一個當前程序狀態寄存器(CPSR)和五個備份的程序狀態寄存器(SPSRs)。備份的程序狀態寄存器用來進行異常處理,其功能包括:
?????? ? 保存ALU中的當前操作信息
?????? ? 控制允許和禁止中斷
?????? ? 設置處理器的運行模式

4.7.1 條件碼標志

??????? N、Z、C、V均為條件碼標志位。它們的內容可被算術或邏輯運算的結果所改變,并且可以決定某條指令是否被執行。
???????? 在ARM狀態下,絕大多數的指令都是有條件執行的。
?????? ? 在Thumb狀態下,僅有分支指令是有條件執行的。

????? 影響標志位的指令如下表:

標志位?????? 含義
N
當用兩個補碼表示的帶符號數進行運算時,N=1 表示運算的結果為負數;N=0 表示運算的結果為正數或零
Z
Z=1 表示運算的結果為零;Z=0表示運算的結果為非零
C
加法運算結果進位時,C=1,減法運算借位時,C=0; 移位操作的非加/減運算指令,C為移出的最后一位; 其他的非加/減運算指令,C的值通常不改變
V 加/減法運算指令,V=1表示符號位溢出。對于其他的非加/減運算指令,C的值通常不改變
Q 在ARM v5及以上版本的E系列處理器中,Q標志指示DSP運算指令是否溢出。在其他版本中,Q標志位無定義

4.7.2 控制位

????? 狀態寄存器的低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]是模式位,決定處理器的運行模式

?

5. ARM 異常處理

?????? ?當正常的程序執行流程發生暫時的停止時,稱之為異常示例處理一個外部的中斷請求。在處理異常之前,當前處理器的狀態必須保留,這樣當異常處理完成之后,當前程序可以繼續執行。處理器允許多個異常同時發生,它們將會按固定的優先級進行處理。
?????? ARM體系結構中的異常,與8位/16位體系結構的中斷有很大的相似之處,但異常與中斷的概念并不完全等同。

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

?

5.1 對異常的響應

???? 當一個異常出現以后,ARM微處理器會執行以下幾步操作:
????? ? 將下一條指令的地址存入相應連接寄存器LR,以便程序在處理異常返回時能從正確的位置重新開始執行。
????? ? 將CPSR復制到相應的SPSR中。
????? ? 根據異常類型,強制設置CPSR的運行模式位。
????? ? 強制PC從相關的異常向量地址取下一條指令執行,從而跳轉到相應的異常處理程序處。
?

??????? 處理器處于Thumb狀態,則當異常向量地址加載入PC時,處理器自動切換到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
 CPSR[6] = 1   // 禁止FIQ
 CPSR[7] = 1   // 禁止IRQ
 PC = Exception Vector Address // 轉入異常入口地址

5.2 從異常返回

?? 異常處理完畢之后,ARM微處理器會執行以下幾步操作從異常返回:?
??? ? 將連接寄存器LR的值減去相應的偏移量后送到PC中。
??? ? 將SPSR復制回CPSR中。
??? ? 若在進入異常處理時設置了中斷禁止位,要在此清除。
??? ? 可以認為應用程序總是從復位異常處理程序開始執行的,因此復位異常處理程序不需要返回。

5.2.1 FIQ (Fast Interrupt Request)

???? FIQ異常是為了支持數據傳輸或者通道處理而設計的。
???? 若將CPSR的F位置為1,則會禁止FIQ中斷,若將CPSR的F位清零,處理器會在指令執行時檢查FIQ的輸入。注意只有在特權模式下才能改變F位的狀態。
???? 可由外部通過對處理器上的nFIQ引腳輸入低電平產生FIQ。不管是在ARM狀態還是在Thumb狀態下進入FIQ模式,FIQ處理程序均可以執行以下指令從FIQ模式返回:
???? SUBS?? PC,R14_fiq ,#4

5.2.2 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

5.2.3 ABORT(中止)

?????? 產生中止異常意味著對存儲器的訪問失敗。ARM微處理器在存儲器訪問周期內檢查是否發生中止異常。
?????? 中止異常包括兩種類型:
??????????? ? 指令預取中止:發生在指令預取時。
??????????? ? 數據中止:發生在數據訪問時。
?????? 當指令預取訪問存儲器失敗時,存儲器系統向ARM處理器發出存儲器中止(Abort)信號,預取的指令被記為無效,但只有當處理器試圖執行無效指令時,指令預取中止異常才會發生,如果指令未被執行,示例在指令流水線中發生了跳轉,則預取指令中止不會發生。
?????? 若數據中止發生,系統的響應與指令的類型有關。
?????? 當確定了中止的原因后,Abort處理程序均可以執行以下指令從中止模式返回,無論是在ARM狀態還是Thumb狀態:
?????? SUBS PC, R14_abt, #4??;指令預取中止
?????? SUBS PC, R14_abt, #8??;數據中止

5.2.4 Software Interruupt(軟件中斷)

?????? 軟件中斷指令(SWI)用于進入管理模式(svc),常用于請求執行特定的管理功能。軟件中斷處理程序執行以下指令可以從SWI模式返回,無論是在ARM狀態還是Thumb狀態:
???? ??MOVS? PC , R14_svc
?????? 以上指令恢復PC(從R14_svc)和CPSR(從SPSR_svc)?的值,并返回到SWI的下一條指令。

5.2.5 Undefined Instruction(未定義指令)

???? 當ARM處理器遇到不能處理的指令時,會產生未定義指令異常。采用這種機制,可以通過軟件仿真擴展ARM或Thumb指令集。
?????處理器執行以下程序返回,無論是在ARM狀態還是Thumb狀態:
?????MOVS PC, R14_und
?????以上指令恢復PC(從R14_und)和CPSR(從SPSR_und)的值,并返回到未定義指令后的下一條指令。

?5.2.6 異常向量表(Exception Vectors)

5.2.7 異常優先級(Exception Priorities)

?

5.2.8 應用程序中的異常處理

?????? 當系統運行時,異常可能會隨時發生,為保證在ARM處理器發生異常時不至于處于未知狀態,在應用程序的設計中,首先要進行異常處理,采用的方式是在異常向量表中的特定位置放置一條跳轉指令,跳轉到異常處理程序,當ARM處理器發生異常時,程序計數器PC會被強制設置為對應的異常向量,從而跳轉到異常處理程序,當異常處理完成以后,返回到主程序繼續執行。

????? 我們需要處理所有的異常,盡管我們可以簡單的在某些異常處理程序處放置死循環。

?

?

?

?

七星彩走势图2元网官网