文章目錄
第一章 ARM概述及其基本編程模型
1.1 ARM技術的應用領域與其特點
1.2 ARM體系結構的版本和命名方法
ARM體系結構的版本
3.版本3
- 處理器的地址擴展到32位
- 當前的程序狀態信息從原來的R15寄存器移到一個新的寄存器CPSR(Current Program Status Register)。
- 增加SPSR(Saved Program Status Register),用於在程序異常中斷程序時,保存被中斷的程序狀態。
- 增加了指令MRS和MSR,用於訪問CPSR和SPSR。
4.版本4
- 增加了T變種,可以從處理器狀態切換到Thumb狀態,在該狀態下指令集是16位的Thumb指令。
- 增加了處理器的特權模式。在該模式下,使用的是用戶模式下的寄存器。
5.版本5
- 增加了前導零計數指令:使整數除法和中斷優先級排隊操作更爲有效。
- 增加軟件斷點指令
6.版本6
增加SIMD功能。SIMD功能擴展爲包括音頻/視頻在內的應用系統提供了優化功能,可以使
ARM體系的變種
thumb指令集(T變種)
Thumb指令集是將ARM指令集的一個子集重新編碼而形成的一個指令集。ARM指令長度爲32位,Thumb指令長度爲16位。Thumb指令集可以得到密度更高的代碼。
長乘法指令(M變種)
增加兩條長乘法操作的ARM指令
- 實現32位整數乘以32位整數
- 實現32位整數乘以32位整數+32位整數
增強型DSP指令(E變種)
增強處理器對DSP算法的處理性能
Java加速器(J變種)
java加速功能
ARM媒體功能擴展(SIMD變種)
ARM媒體功能擴展爲嵌入式應用系統提供了高性能的音頻/視頻處理技術。
ARM的SIMD媒體功能擴展爲包括音頻/視頻在內的應用系統提供了優化功能,可以使音頻/視頻處理性能提高4倍
1.3 ARM處理器系列
- ARM7
- ARM9
- ARM9E
- ARM10E
- SecurCore
1.3 ARM處理器系列
ARM處理器共有7種運行模式
處理器模式 | 描述 |
---|---|
用戶模式(User,usr) | 正常(用戶)程序執行的模式 |
快速中斷模式(FIQ,fiq) | 用於高速數據傳輸和通道處理 |
外部中斷模式(IRQ,irq) | 用於通常的中斷處理 |
管理模式(Supervisor,sve) | CPU上電後默認模式,主要用來做系統的初始化 供操作系統使用的一種保護模式 |
數據訪問中止模式(Abort,abt) | 用於虛擬存儲及存儲保護 |
未定義指令中止模式(Undefined,und) | 用於支持通過軟件仿真硬件的協處理器 |
系統模式(System,sys) | 用於運行特權級的操作系統任務 |
- 特權模式下,程序可以訪問所有的系統資源,也可以任意地進行處理器模式的切換。
- 處理器模式的切換 by
- 軟件控制
- 外部中斷或異常處理
- 大多數的用戶程序運行在用戶模式下,不能訪問一些受操作系統保護的系統資源,應用程序也不能直接進行處理器模式的切換。當需要進行處理器模式切換時,應用程序可以產生異常處理,在異常處理過程中進行處理器模式的切換。
- 系統模式不是通過異常過程進入的,它和用戶模式具有完全一樣的寄存器。它主要供操作系統任務使用。通常操作系統的任務需要訪問所有的系統資源,同時該任務仍然使用用戶模式的寄存器組,而不是使用異常模式下相應的寄存器組,這樣可以保證當異常中斷髮生時任務狀態不被破壞。
1.5 ARM寄存器介紹
ARM處理器有37個寄存器,其中包括
- 31個通用寄存器 [ 32位寄存器 ] 。
- 6個狀態寄存器
用戶模式 | 系統模式 | 管理模式 | 中止模式 | 未定義模式 | 外部中斷模式 | 快速中斷模式 |
---|---|---|---|---|---|---|
R0 | R0 | R0 | R0 | R0 | R0 | R0 |
R1 | R1 | R1 | R1 | R1 | R1 | R1 |
R2 | R2 | R2 | R2 | R2 | R2 | R2 |
R3 | R3 | R3 | R3 | R3 | R3 | R3 |
R4 | R4 | R4 | R4 | R4 | R4 | R4 |
R5 | R5 | R5 | R5 | R5 | R5 | R5 |
R6 | R6 | R6 | R6 | R6 | R6 | R6 |
R7 | R7 | R7 | R7 | R7 | R7 | R7 |
R8 | R8 | R8 | R8 | R8 | R8 | R8_fiq |
R9 | R9 | R9 | R9 | R9 | R9 | R9_fiq |
R10 | R10 | R10 | R10 | R10 | R10 | R10_fiq |
R11 | R11 | R11 | R11 | R11 | R11 | R11_fiq |
R12 | R12 | R12 | R12 | R12 | R12 | R12_fiq |
R13 | R13 | R13_svc | R13_abt | R13_und | R13_irq | R13_fiq |
R14 | R14 | R14_svc | R14_abt | R14_und | R14_irq | R14_fiq |
PC | PC | PC | PC | PC | PC | PC |
CPSR | CPSR | CPSR | CPSR | CPSR | CPSR | CPSR |
SPSR_svc | SPSR_abt | SPSR_und | SPSR_irq | SPSR_fiq |
1.5.1 通用寄存器
通用寄存器可以分爲 3 類
- 未備份寄存器(Unbanked Registers),R0~R7。
- 備份寄存器(Banked Regsiter),包括 R8~R14。
- 程序計數器 PC,即R15。
未備份寄存器 R0~R7
在所有的處理器模式下指的都是同一個物理寄存器。
在異常中斷造成處理器模式切換時,由於不同的處理器模式使用相同的物理寄存器,可能造成寄存器中數據被破壞。
未備份寄存器沒有被系統用於特別的用途,任何可採用通用寄存器的應用場合都可以使用未備份寄存器。
備份寄存器 R8~R14
- R8~R12
- 每個寄存器對應兩個不同的物理寄存器。
eg. 當使用快速中斷模式下的寄存器時,寄存器R8和R9分別記爲 R8_fiq、R9_fiq;當使用用戶模式下的寄存器時,寄存器R8和R9分別記爲R8_usr、R9_usr。在這兩種情況下使用的是不用的物理寄存器, - 系統沒有將這幾個寄存器用於任何特殊用途,但是當中斷處理非常簡單,僅僅使用R8~R14,FIQ處理程序可以不必執行保存和恢復中斷現場的指令,從而可以使中斷處理過程非常迅速。
- 每個寄存器對應兩個不同的物理寄存器。
- R13~R14
對於R13、R14 來說,每個寄存器對應6個不同的物理寄存器,其中,用戶模式和系統模式共用一個物理寄存器,另外5個對應其他的處理器模式。
R13_<mode> //mode: usr、svc、abt、und、irq、fiq
- R13(Stack Pointer)
- 在ARM中常用作棧指針(Stack Register,SR)。
- 在ARM指令集中,這只是一種習慣用法,並沒有任何指令強制性地使用R13作爲棧指針,用戶也可以使用其他的寄存器作爲棧指針
在Thumb指令集中,有一些指令強制性的使用R13作爲棧指針。 - 每種異常模式擁有自己的物理的R13。應用程序初始化 R13,使其指向該異常模式專用的棧地址。
當進入異常模式時,可以將需要使用的寄存器保存在R13所指的棧中;當退出處理程序時,將保存在R13所指的寄存器值彈出。
這樣就使異常處理程序不會破壞被其中斷程序的運行現場。
- R14:連接寄存器(Link Register,LR)在ARM體系中具有下面兩種特殊的作用:
- (1)每種處理器模式自己的物理R14中存放着當前子程序的返回地址。當通過 BL 或 BLX 指令調用子程序時,R14被設置爲該子程序的返回地址。在子程序中,當把R14的值複製到程序計數器PC中時,子程序返回。可以通過下面兩種方式實現子程序的返回
/* (1)執行下面任何一條命令 */
MOV PC , LR
BX LR
/* (2)在子程序入口使用下面的指令將PC保存到棧中 */
STMFD SP ! , { <register>, LR }
LDMFD SP ! , { <register>,PC }
- (2)當異常中斷髮生時,該異常模式特定的物理R14被設置成**該異常模式將要返回的地址**。對於有些異常模式,R14的值可能與將返回的地址有一個常數的偏移量。具體的返回方式與上面的子程序返回方式基本相同。
程序計數器 R15 PC(Program Counter)
- 由於ARM採用流水線機制,讀取到的PC=當前指令地址+8個字節,即,PC指向當前指令的下兩條指令的地址。
- 由於ARM指令是字對齊,PC值的第0位和第1位總爲0;(因爲是字對齊也就是4字節對齊方式,,也就是你的地址必須是4的倍數,顯然PC的第0位和第一位是0,如果是半字對齊的話,那麼就變成第0位必須爲0)
- 當使用STR/STM指令來保存R15時,保存的可能是當前指令地址值加8字節或者12字節,取決於芯片的具體設計方式,因此儘量避免使用STR/STM保存R15的值
- 當成功向R15寫入一個地址數值時,程序將跳轉到改地址執行。由於ARM指令是字對齊,寫入R15的地址值應該滿足 bits [1:0]=0b00。
- 對於ARMv3以及更低版本,R15的地址值將與0xFFFF FFFC相與。
- 對於ARMv4以及更高版本,程序必須保證bits [1:0]=0b00;
- 對於Thumb指令,是半字對齊,R15的地址值將與0xFFFF FFFE相與。
1.5.2 程序狀態寄存器 CPSR | SPSR
- CPSR(當前程序狀態寄存器)可以在任何處理器模式下被訪問,它包含條件標緻位、中斷禁止位、當前處理器模式標誌以及其他的控制和狀態位。
- 每一種異常處理器模式下都有一個專用的物理狀態寄存器,稱爲SPSR(備份程序狀態寄存器)。當特定的異常中斷髮生時,這個寄存器用於存放當前程序狀態寄存器的內容。在異常中斷退出時,可以用SPSR中保存的值來恢復CPSR。
- 由於用戶模式和系統模式不是異常中斷模式,所以他們沒有SPSR。
- CPSR | SPSR 格式
31 | 30 | 29 | 28 | 27 | 26:8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
N | Z | C | V | Q | DNM(RAZ) | I | F | T | M4 | M3 | M2 | M1 | M0 |
1.條件標誌位 N、Z、C、V
- N(Negative)
- 設置成當前指令運算結果的bit[31]的值
- 當兩位補碼錶示的有符號整數運算,N=1表示運算結果爲負數,N=0表示運算結果爲正數
- Z(Zero)
- Z=1 表示運算結果爲0;Z=0 表示運算結果不爲0;
- 對於CMP指令,Z=1表示進行比較的兩個數大小相等
- C(Carry)
- 在加法指令中(包括比較指令CMN),發生進位,則C=1,表示無符號數運算發生溢出;其他情況下C=0;
- 在減法指令中(包括比較指令CMP),發生借位,則C=0,表示無符號數運算發生溢出;其他情況C=1;
- 對於包含移位操作的非加/減法運算指令,C中包含最後一次被溢出的位的數值。
- 對於其他非加/減法指令,C位的值通常不受影響
- V(oVerflow)
- 對於加/減法運算指令,當操作數和運算結果爲二進制的補碼錶示的帶符號數時,V=1表示符號位溢出
- 通常其他指令不影響V位。
以下指令會影響CPSR中的條件標誌位
- 比較指令,如CMP,CMM,TEQ和TST等
- 當一些算術指令和邏輯指令的目標寄存器不是R15時,這些指令會影響CPSR中的條件標誌位。
- MSR可以向CPSR/SPSR中寫入新值。
- MRC指令將R15作爲目標寄存器時,可以把協處理器產生的條件標誌位的值送到ARM處理器。
- 一些LDM指令的變種指令可以將SPSR的值複製到CPSR中,這種指令主要用於異常中斷程序中返回。
- 一些帶“位設置”的算術和邏輯指令的變種指令,也可以將SPSR的值複製到CPSR中,這種指令主要用於異常中斷程序中返回。
2.Q標誌位
bit[27] – > 主要用於增強的DSP指令是否發生溢出
3.CPSR中的控制位
低八位【I 、F、T、M[4:0] 】統稱爲控制位。
- 中斷禁止位
- I = 1 時,禁止IRQ中斷;
- F = 1時,禁止FIQ中斷;
- T控制位
控制指令執行的狀態,說明是ARM指令、還是Thumb指令。- ARMv4以及更高版本的T系列ARM處理器,
- T = 0執行ARM指令
- T = 1執行Thumb指令
- ARMv5以及更高版本的非T系列ARM處理器,
- T = 0執行ARM指令
- T = 1 表示強制下一條執行的指令產生未定義中斷
- M控制位
M[4:0]控制處理器模式
- ARMv4以及更高版本的T系列ARM處理器,
4.CPSR中的其他位
CPSR中的其他位用於將來ARM版本的擴展。
1.6ARM體系的異常中斷
3種方式控制程序的執行流程:
-
- 在正常程序執行過程中,每執行1條ARM指令,PC+4byte;每執行一條Thumb指令PC+2byte。整個過程按順序執行
-
- 通過跳轉指令,程序可以跳轉到特定的地址標號處執行,或者到特定的子程序處執行。
- B 用於執行跳轉操作
- BL 在執行跳轉的同時保存子程序的返回地址
- BX 在執行跳轉操作的同時,根據目標地址的最低位可與將程序狀態切換到Thumb狀態。
- BLX執行3個操作,跳到目標地址處執行,保存子程序的返回地址,根據目標地址的最低位可以將程序狀態切換到Thumb。
- 當異常中斷發生時,系統執行完當前指令後,跳轉到相應的異常中斷處理程序處執行。在異常中斷處理程序執行完後,程序返回到發生中斷的指令的下一條指令處執行。在進入異常中斷處理程序時,要保護被中斷的程序執行現場,在從異常中斷處理程序退出時,要恢復被中斷的程序的執行現場。
1.6.1 ARM中異常中斷的種類
異常中斷名稱 | 含義 |
---|---|
復位(Reset) | 當處理器的復位引腳有效時,系統產生復位異常中斷,程序跳轉到復位異常中斷處理程序處執行。復位異常中斷一般有以下幾種情況。 系統加電時;系統復位時;軟復位:跳轉到復位中斷向量處執行; |
未定義的指令(Undefined Instruction) | 當ARM處理器或者是系統中的協處理器認爲當前指令未定義時,產生未定義的指令異常中斷。可以通過該異常中斷機制仿真浮點向量運算 |
軟件中斷(Sofeware Interrupt,SWI) | 可用於用戶模式下的程序調用特權操作指令。在實時操作系統(RTOS)中可以通過該機制實現系統功能調用 |
指令預取址中斷(Prefetch Abort) | 如果處理器預取的指令不存在,或者該地址不允許當前指令訪問,當該被預取的指令執行時,處理器產生指令預取中止異常中斷 |
數據訪問中止(Data Abort) | 如果數據訪問指令的目標地址不存在,或者該地址不允許當前指令訪問,處理器產生數據訪問中止異常 |
外部中斷請求(IRQ) | 當處理器的外部中斷請求引腳有效,而且CPSR的I控制位被清除時,處理器產生IRQ異常中斷,系統中個外設通常通過該異常中斷請求處理器服務 |
快速中斷請求(FIQ) | 當處理器的外部快速中斷請求引腳 |
1.6.2 ARM處理器對異常中斷的響應過程
(1)保存處理器當前狀態、中斷屏蔽位、以及各條件標誌位。這是通過將CPSR的內容保存到將要執行的異常中斷對應的SPSR
(2)設置CPSR中的對應位,使處理器進去響應的執行模式;禁止IRQ中斷;進入FIQ模式時,禁止FIQ中斷
(3)將寄存器lr_mode設置成返回地址
(4)將PC設置爲該異常中斷的中斷向量地址,從而跳轉到相應的異常中斷處理程序處執行
1.6.3從異常中斷處理程序中返回
(1)恢復被中斷的程序的處理器狀態,即將SPSR_mode寄存器內容複製到CPSR中。
(2)返回到發生異常中斷的指令的下一條指令處執行,即把lr_mode寄存器的內容複製到PC中。
當異常中斷髮生時,PC所指的位置對於各種不同的異常中斷時不同的,同樣,返回地址也不同。
1.7ARM體系中的存儲系統
1.7.1 ARM系統中的存儲空間
使用單一的地址空間,該地址空間的大小爲232**個**8位字節**。這些字節單元的地址都是無符號的32位數值。也可以看做是**230個32位的字單元,這些字節單元的地址可以被4整除,地址爲A的字數據包括地址爲A、A+1、A+2、A+3四個字節單元的內容。在ARMv4及以上版本,也可以看做2^31個16位的半字單元,這些半字單元的地址可以被2整除,地址爲A的半字數據包包括A、A+1兩個字節單元的內容。
1.7.2 ARM存儲器格式
Big-endian
Little-endian
1.7.3非對齊的存儲訪問操作
1.非對齊的指令預取操作
如果寫到寄存器PC中的值非字對齊
- ARM狀態下
- 指令執行的結果不可預知
- 地址中的最低兩位被忽略
- Thumb
- 指令執行的結果不可預知
- 地址中的最低位被忽略
如果系統中指定,當發生非對齊的指令時,忽略地址中的相應位,則由存儲系統實現這種“忽略”,也就是說,這時該地址原封不動的送到存儲系統。
2.非對齊的數據訪問操作
對於Load/Store操作,如果是非對齊的數據訪問操作,則系統定義了一下三種結果
- 執行的結果不可預知
- 忽略字單元地址的低兩位的值,即訪問地址爲(addr & 0xffff fffc)的字單元;
- 忽略半字單元地址的最低位的值,即訪問地址爲(addr & 0xffff fffe)的字單元;
當發生非對齊的數據訪問時,到底採用哪一種,是由個指令指定的。
1.7.2 指令預取和自修改代碼
在CPU執行當前指令的同時,可以從存儲器中預取其後若干條指令,具體預取多少條,不同的ARM實現中有不同的數值。
預取的指令並不一定得到執行:
- 當前指令完成後,如果發生了異常中斷,程序將會跳轉到異常中斷處理程序處執行,當前預取的指令將被拋棄。
- 執行了跳轉指令,當前預取的指令也會被拋棄。
自修改代碼指的是代碼在執行過程中可能修改自身。
當指令被預取後,在該指令被執行前,如果有數據訪問指令修改了位於主存中的該指令,這是被預取的指令和主存中的指令不同,從而可能使執行的結果發生錯誤。