分類: 嵌入式html
ARM處理器工做模式一共有 7 種 :編程
USR 模式
正經常使用戶模式,程序正常執行模式
FIQ模式(Fast Interrupt Request)
處理快速中斷,支持高速數據傳送或通道處理
IRQ模式
處理普通中斷
SVC模式(Supervisor)
操做系統保護模式,處理軟件中斷swi reset函數
ABT 停止(Abort mode){數據、指令}
處理存儲器故障、實現虛擬存儲器和存儲器保護
UND 未定義(Undefined)
處理未定義的指令陷阱,支持硬件協處理器的軟件仿真
SYS 系統模式(基本上=USR)(System)
運行特權操做系統任務性能
用戶模式和特權模式ui
除了用戶模式以外的其餘6種處理器模式稱爲特權模式
特權模式下,程序能夠訪問全部的系統資源,也能夠任意地進行處理器模式的切換。
特權模式中,除系統模式外,其餘5種模式又稱爲異常模式。
大多數的用戶程序運行在用戶模式下,此時,應用程序不可以訪問一些受操做系統保護的系統資源,應用程序也不能直接進行處理器模式的切換。
用戶模式下,當須要進行處理器模式切換時,應用程序能夠產生異常處理,在異常處理中進行處理器模式的切換。操作系統
ARM處理的工做狀態.net
在 ARM 處理器中,內核同時支持 32 位的 ARM 指令 和 16 位的 Thumb 指令。設計
對於 ARM 指令來講,全部的指令長度都是 32 位,而且執行週期大多爲單週期,指令都是有條件執行的。3d
而 THUMB 指令的特色以下:unix
1,指令執行條件常常不回使用。
2,源寄存器與目標寄存器常常是相同的。
3,使用的寄存器數量比較少。
4,常數的值比較小。
5,內核中的桶式移動器(barrel shifter)常常是不使用的。
也就是說 16 位的 Thumb 指令通常能夠完成 和 32 位 ARM 指令相同的任務。
ARM指令和 THUMB指令的關係:
THUMB指令是ARM指令的子集
能夠相互調用,只要遵循必定的調用規則
Thumb指令與ARM指令的時間效率和空間效率關係爲:
存儲空間約爲ARM代碼的60%~70%
指令數比ARM代碼多約30%~40%
存儲器爲32位時ARM代碼比Thumb代碼快約40%
存儲器爲16位時Thumb比ARM代碼快約40~50%
使用Thumb代碼,存儲器的功耗會下降約30%
ARM指令和 THUMB指令之間切換(Interworking)的基本概念和切換時的子函數調用
處理器模式能夠經過軟件進行切換,也能夠經過外部中斷或者異常處理過程進行切換。
當應用程序發生異常中斷時,處理器進入相應的異常模式。在每一種異常模式下都有一組寄存器,供相應的異常處理程序使用,這樣就能夠保證在進入異常模式時,用戶模式下的寄存器不被破壞。
系統模式並非經過異常進入的,它和用戶模式具備徹底同樣的寄存器。可是系統模式屬於特權模式,能夠訪問全部的系統資源,也能夠直接進行處理器模式切換。它主要供操做系統任務使用。一般操做系統的任務須要訪問全部的系統資源,同時該任務仍然使用用戶模式的寄存器組,而不是使用異常模式下相應的寄存器組,這樣能夠保證當異常中斷髮生時任務狀態不被破壞。
Thumb指令低密度及窄存儲器時性能高的特色使得其在大多數基於 C 代碼的系統匯中有很是普遍的應用,可是有些場合中系統只能使用 ARM 指令,好比:
1,若是對於速度有比較高的要求,ARM指令在寬存儲器中會提供更高的性能。
2,某些功能只能由 ARM 指令來實現,好比:
訪問 CPSR 寄存器來 使能/禁止 中斷或改變處理器工做模式;
訪問協處理器CP15;
執行 C 代碼不支持的 DSP 算術指令;
異常中斷(Exception)處理。在進入異常中斷後,內核自動切換到 ARM 狀態。即在異常中斷處理程序人口的一些指令是ARM指令,而後根據須要,程序能夠切換到 Thumb 工做狀態,在異常中斷處理程序返回前,程序在切換到 ARM 工做狀態。
注:當處理器處於Thumb狀態時發生異常(如IRQ、FIQ、Undef、Abort、SWI等),則異常處理返回時,自動切換到Thumb狀態。
ARM 處理器老是 從 ARM 工做狀態開始執行的。所以,若是要在調試器重運行 Thumb 程序,必須爲 該 Thumb 程序添加一個 ARM程序頭,而後再切換到Thumb工做狀態,調用該 Thumb程序。
在實際系統中,內核狀態須要常常的切換(Interworkong)來知足系統性能要求。具體的切換是經過 Branch Exchange,即 BX 指令來實現的。指令格式爲:
Thumb 工做狀態 BX Rn
ARM 工做狀態 BX Rn
其中Rn能夠是寄存器 R0 ~ R15 中的任意一個。指令能夠經過將寄存器Rn的內容,拷貝到程序計數器 PC 來完成在 4GB地址空間中的絕對跳轉,若是操做數寄存器的狀態位 Bit0 = 0,則進入 ARM 工做狀態;若是 Bit0 = 1,則進入 Thumb 工做狀態。
ARM寄存器一共有 37 個寄存器:
ARM處理器工做工做模式下的寄存器:
不分組寄存器R0~R7
在全部的運行模式下,未分組寄存器都指向同一個物理寄存器,他們未被系統用做特殊的用途,所以,在中斷或異常處理進行運行模式轉換時,因爲不一樣的處理器運行模式均使用相同的物理寄存器,可能會形成寄存器中數據的破壞,這一點在進行程序設計時應引發注意。
分組寄存器R8~R12
每次所訪問的物理寄存器與處理器當前的運行模式有關
R8~R12:每一個寄存器對應兩個不一樣的物理寄存器
當使用fiq模式時,訪問寄存器R8_fiq~R12_fiq
當使用除fiq模式之外的其餘模式時,訪問寄存器R8_usr~R12_usr。
R1三、R14:每一個寄存器對應6個不一樣的物理寄存器
其中的一個是用戶模式與系統模式共用,另外5個物理寄存器對應於其餘5種不一樣的運行模式
採用如下的記號來區分不一樣的物理寄存器:
R13_
R14_
mode爲如下幾種之一:usr、fiq、irq、svc、abt、und。
堆棧指針—R13/sp
R13在ARM指令中經常使用做堆棧指針,但這只是一種習慣用法,用戶也可以使用其餘的寄存器做爲堆棧指針。
sub sp, sp, #4 ;reserved for PC
stmfd sp!, {r8-r9}
因爲處理器的每種運行模式均有本身獨立的物理寄存器R13,在初始化部分,都要初始化每種模式下的R13,這樣,當程序的運行進入異常模式時,能夠將須要保護的寄存器放入R13所指向的堆棧,而當程序從異常模式返回時,則從對應的堆棧中恢復。
子程序鏈接寄存器—R14/lr
R14也稱做子程序鏈接寄存器或鏈接寄存器LR。當執行BL子程序調用指令時,能夠從R14中獲得R15(程序計數器PC)的備份。其餘狀況下,R14用做通用寄存器。
在每一種運行模式下,均可用R14保存子程序的返回地址,當用BL或BLX指令調用子程序時,將PC的當前值拷貝給R14,執行完子程序後,又將R14的值拷貝回PC,便可完成子程序的調用返回。
BL SUB1
……
SUB1:
……
MOV PC,LR /*完成子程序返回等 同於BX LR */
程序計數器—R15/PC
雖然 R15 也能夠用做通用寄存器,但要注意有一些特殊限制,若是違法了這些限制,指令執行的結果將是不可預料的。
程序狀態寄存器(CPSR/SPSR)
CPSR(當前程序狀態寄存器)
SPSR(備份的程序狀態寄存器)
全部處理器模式下均可訪問當前的程序狀態寄存器CPSR。
CPSR:程序狀態寄存器(current program status register) (當前程序狀態寄存器),在任何處理器模式下被訪問。它包含了條件標誌位、中斷禁止位、當前處理器模式標誌以及其餘的一些控制和狀態位。
CPSR在用戶級編程時用於存儲條件碼。
SPSR:程序狀態保存寄存器(saved program status register),每一種處理器模式下都有一個狀態寄存器SPSR,SPSR用於保存CPSR的狀態,以便異常返回後恢復異常發生時的工做狀態。當特定 的異常中斷髮生時,這個寄存器用於存放當前程序狀態寄存器的內容。在異常中斷退出時,能夠用SPSR來恢復CPSR。因爲用戶模式和系統模式不是異常中斷 模式,因此他沒有SPSR。當用戶在用戶模式或系統模式訪問SPSR,將產生不可預知的後果。
CPSR格式以下所示。SPSR和CPSR格式相同
程序狀態寄存器的條件碼標誌
N、Z、C、V均爲條件碼標誌位。它們的內容可被算術或邏輯運算的結果所改變,而且能夠決定某條指令是否被執行
在ARM狀態下,絕大多數的指令都是有條件執行的。
在Thumb狀態下,僅有分支指令是有條件執行的。
狀態寄存器的低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]是模式位,決定處理器的運行模式
THUMB狀態下的寄存器組織
Thumb與ARM狀態下的寄存器關係