ARM概述
ARM處理器是英國Acorn有限公司設計的低功耗成本的第一款RISC微處理器。全稱為Advanced RISC Machine。ARM處理器本身是32位設計,但也配備16位指令集,一般來講比等價32位代碼節省達35%,卻能保留32位系統的所有優勢。
ARM的Jazelle技術使Java加速得到比基于軟件的Java虛擬機(JVM)高得多的性能,和同等的非Java加速核相比功耗降低80%。CPU功能上增加DSP指令集提供增強的16位和32位算術運算能力,提高了性能和靈活性。ARM還提供兩個前沿特性來輔助帶深嵌入處理器的高集成SoC器件的調試,它們是嵌入式ICE-RT邏輯和嵌入式跟蹤宏核(ETMS)系列。
ARM處理器特點
1、體積小、低功耗、低成本、高性能;
2、支持Thumb(16位)/ARM(32位)雙指令集,能很好的兼容8位/16位器件;
3、大量使用寄存器,指令執行速度更快;
4、大多數數據操作都在寄存器中完成;
5、尋址方式靈活簡單,執行效率高;
6、指令長度固定。
ARM主要模式
處理器工作模式 說明
用戶模式(usr) ARM處理器正常的程序執行狀態
系統模式(sys) 運行具有特權的操作系統任務
快中斷模式(fiq) 支持高速數據傳輸或通道處理
管理模式(svc) 操作系統保護模式
數據訪問終止模式(abt) 用于虛擬存儲器及存儲器保護
中斷模式(irq) 用于通用的中斷處理
除用戶模式外,其余6種模式稱為非用戶模式或特權模式;用戶模式和系統模式之外的5種模式稱為異常模式。ARM處理器的運行模式可以通過軟件改變,也可以通過外部中斷或異常處理改變。
arm的協處理器有幾個
ARM可支持多達16個協處理器,主要的作用:ARM處理器初始化,ARM與協處理器的數據處理操作,ARM的寄存器與協處理器的寄存器之間傳送數據,以及ARM協處理器的寄存器和存儲器之間傳送數據。共有5條:
-CDP協處理器數據操作指令
-LDC協處理器數據加載指令
-STC協處理器數據存儲指令
-MCRARM的寄存器到協處理器的寄存器的數據傳送
-MRC協處理器的寄存器到ARM的寄存器的數據傳送
1、CDP指令
CDP指令的格式為:
CDP{條件}協處理器編碼,協處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協處理器操作碼2。
CDP指令用于ARM處理器通知ARM協處理器執行特定的操作,若協處理器不能成功完成特定的操作,則產生未定義指令異常。其中協處理器操作碼1和協處理器操作碼2為協處理器將要執行的操作,目的寄存器和源寄存器均為協處理器的寄存器,指令不涉及ARM處理器的寄存器和存儲器。
指令示例:
CDPP3,2,C12,C10,C3,4;該指令完成協處理器P3的初始化
2、LDC指令
LDC指令的格式為:
LDC{條件}{L}協處理器編碼,目的寄存器,[源寄存器]
LDC指令用于將源寄存器所指向的存儲器中的字數據傳送到目的寄存器中,若協處理器不能成功完成傳送操作,則產生未定義指令異常。其中,{L}選項表示指令為長讀取操作,如用于雙精度數據的傳輸。
指令示例:
LDCP3,C4,[R0];將ARM處理器的寄存器R0所指向的存儲器中的字數據傳送到協處理器P3的寄存器C4中。
3、STC指令
STC指令的格式為:
STC{條件}{L}協處理器編碼,源寄存器,[目的寄存器]
STC指令用于將源寄存器中的字數據傳送到目的寄存器所指向的存儲器中,若協處理器不能成功完成傳送操作,則產生未定義指令異常。其中,{L}選項表示指令為長讀取操作,如用于雙精度數據的傳輸。
指令示例:
STCP3,C4,[R0];將協處理器P3的寄存器C4中的字數據傳送到ARM處理器的寄存器R0所指向的存儲器中。
4、MCR指令
MCR指令的格式為:
MCR{條件}協處理器編碼,協處理器操作碼1,源寄存器,目的寄存器1,目的寄存器2,協處理器操作碼2。
MCR指令用于將ARM處理器寄存器中的數據傳送到協處理器寄存器中,若協處理器不能成功完成操作,則產生未定義指令異常。其中協處理器操作碼1和協處理器操作碼2為協處理器將要執行的操作,源寄存器為ARM處理器的寄存器,目的寄存器1和目的寄存器2均為協處理器的寄存器。
指令示例:
MCRP3,3,R0,C4,C5,6;該指令將ARM處理器寄存器R0中的數據傳送到協處理器P3的寄存器C4和C5中。
5、MRC指令
MRC指令的格式為:
MRC{條件}協處理器編碼,協處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協處理器操作碼2。
MRC指令用于將協處理器寄存器中的數據傳送到ARM處理器寄存器中,若協處理器不能成功完成操作,則產生未定義指令異常。其中協處理器操作碼1和協處理器操作碼2為協處理器將要執行的操作,目的寄存器為ARM處理器的寄存器,源寄存器1和源寄存器2均為協處理器的寄存器。
指令示例:
MRCP3,3,R0,C4,C5,6;該指令將協處理器P3的寄存器中的數據傳送到ARM處理器寄存器中.
CP14調試通信通道協處理器
調試通信通道協處理器DCC(the Debug CommunicationsChannel)提供了兩個32bits寄存器用于傳送數據,還提供了6bits通信數據控制寄存器控制寄存器中的兩個位提供目標和主機調試器之間的同步握手。
此控制寄存器中的兩個位提供目標和主機調試器之間的同步握手:
位 1(W 位) 從目標的角度表示通信數據寫入寄存器是否空閑:
W = 0 目標應用程序可以寫入新數據。
W = 1 主機調試器可以從寫入寄存器中掃描出新數據。
位 0(R 位) 從目標的角度表示通信數據讀取寄存器中是否有新數據:
R = 1 有新數據,目標應用程序可以讀取。
R = 0 主機調試器可以將新數據掃描到讀取寄存器中。
注意:
調試器不能利用協處理器 14 直接訪問調試通信通道,因為這對調試器無意義。但調試器可使用掃描鏈讀寫 DCC 寄存器。 DCC 數據和控制寄存器可映射到 EmbeddedICE 邏輯單元中的地址。 若要查看EmbeddedICE 邏輯寄存器,請參閱您的調試器和調試目標的相關文檔。
通信數據讀取寄存器
用于接收來自調試器的數據的 32 位寬寄存器。 以下指令在 Rd 中返
回讀取寄存器的值:
MRC p14, 0, Rd, c1, c0
通信數據寫入寄存器
用于向調試器發送數據的 32 位寬寄存器。 以下指令將 Rn 中的值寫
到寫入寄存器中:
MCR p14, 0, Rn, c1, c0
注意
有關訪問 ARM10 和 ARM11 內核 DCC寄存器的信息,請參閱相應的技術參考手冊。 ARM9 之后的各處理器中,所用指令、狀態位位置以及對狀態位的解釋都有所不同。
目標到調試器的通信
這是運行于 ARM內核上的應用程序與運行于主機上的調試器之間的通信事件順序:
1. 目標應用程序檢查 DCC 寫入寄存器是否空閑可用。為此,目標應用程序使用 MRC 指令讀取調試通信通道控制寄存器,以檢查 W 位是否已清除。
2. 如果 W 位已清除,則通信數據寫入寄存器已清空,應用程序對協處理器14,使用 MCR 指令將字寫入通信數據寫入寄存器。 寫入寄存器操作會自動設置W 位。如果 W位已設置,則表明調試器尚未清空通信數據寫入寄存器。此時,如果應用程序需要發送另一個字,它必須輪詢 W 位,直到它已清除。
3. 調試器通過掃描鏈 2 輪詢通信數據控制寄存器。 如果調試器發現 W位已設置,則它可以讀 DCC 數據寄存器,以讀取應用程序發送的信息。 讀取數據的進程會自動清除通信數據控制寄存器中的 W 位。
以下代碼顯示了這一過程
AREA OutChannel, CODE,READONLY
ENTRY
MOV r1,#3 ; Number of words to send
ADR r2, outdata ; Address ofdata to send
pollout
MRC p14,0,r0,c0,c0 ; Read controlregister
TST r0, #2
BNE pollout ; if W set, register stillfull
write
LDR r3,[r2],#4 ; Read word fromoutdata
; into r3 and update the pointer
MCR p14,0,r3,c1,c0 ; Write word fromr3
SUBS r1,r1,#1 ; Update counter
BNE pollout ; Loop if more words to bewritten
MOV r0, #0x18 ;Angel_SWIreason_ReportException
LDR r1, =0x20026 ;ADP_Stopped_ApplicationExit
SVC 0x123456 ; ARM semihosting(formerly SWI)
outdata
DCB “Hello there!”
END
調試器到目標的通信
這是運行于主機上的調試器向運行于內核上的應用程序傳輸消息的事件順序:
1. 調試器輪詢通信數據控制寄存器的 R 位。 如果 R位已清除,則通信數據讀取寄存器已清空,可將數據寫入此寄存器,以供目標應用程序讀取。
2. 調試器通過掃描鏈 2 將數據掃描到通信數據讀取寄存器中。此操作會自動設置通信數據控制寄存器中的 R 位。
3. 目標應用程序輪詢通信數據控制寄存器中的 R 位。如果該位已經設置,則通信數據讀取寄存器中已經有數據,應用程序可使用 MRC 指令從協處理器14 讀取該數據。 同時,讀取指令還會清除R 位。
以下顯示的目標應用程序代碼演示了這一過程
AREA InChannel, CODE,READONLY
ENTRY
MOV r1,#3 ; Number of words to read
LDR r2, =indata ; Address to storedata read
pollin
MRC p14,0,r0,c0,c0 ; Read controlregister
TST r0, #1
BEQ pollin ; If R bit clear thenloop
read
MRC p14,0,r3,c1,c0 ; read word intor3
STR r3,[r2],#4 ; Store to memoryand
; update pointer
SUBS r1,r1,#1 ; Update counter
BNE pollin ; Loop if more words toread
MOV r0, #0x18 ;Angel_SWIreason_ReportException
LDR r1, =0x20026 ;ADP_Stopped_ApplicationExit
SVC 0x123456 ; ARM semihosting(formerly SWI)
AREA Storage, DATA,READWRITE
indata
DCB “Duffmessage#”
END
CP15系統控制協處理器
CP15 —系統控制協處理器 (the system control coprocessor)他通過協處理器指令MCR和MRC提供具體的寄存器來配置和控制caches、MMU、保護系統、配置時鐘模式(在bootloader時鐘初始化用到)
CP15的寄存器只能被MRC和MCR(Move to Coprocessor from ARM Register )指令訪問
MCR{cond} p15,,,,,
MRC{cond} p15,,,,,
其中L位用來區分MCR(L=1)和MRC(L=0)操作。 CP15包括15個具體的寄存器如下
-R0:ID號寄存器
-R0:緩存類型寄存器
-R1:控制寄存器
-R2:轉換表基址寄存器(Translation Table Base --TTB)
-R3:域訪問控制寄存器(Domain access control )
-R4:保留
-R5:異常狀態寄存器(fault status -FSR)
-R6:異常地址寄存器(fault address -FAR)
-R7:緩存操作寄存器
-R8:TLB操作寄存器
-R9:緩存鎖定寄存器
-R10:TLB 鎖定寄存器
-R11-12&14:保留
-R13:處理器ID
-R15:測試配置寄存器 2-24
要注意有2個R0,根據MCR操作數的不同傳送不同的值,這也一個只讀寄存器
-R0:ID號寄存器 這是一個只讀寄存器,返回一個32位的設備ID號,具體功能參考ARM各個系列型號的的CP15 Register 0說明。
MRC p15, 0, , c0, c0, {0, 3-7} ;returns ID
以下為CP15的一些應用示例
U32 ARM_CP15_DeviceIDRead(void)
{
U32 id;
__asm { MRC P15, 0, id, c0, c0; }
return id;
}
void ARM_CP15_SetPageTableBase(P_U32 TableAddress)
{
__asm { MCR P15, 0, TableAddress, c2, c0, 0; }
}
void ARM_CP15_SetDomainAccessControl(U32 flags)
{
__asm { MCR P15, 0, flags, c3, c0, 0; }
}
void ARM_CP15_ICacheFlush()
{
unsigned long dummy;
__asm { MCR p15, 0, dummy, c7, c5, 0; }
}
void ARM_CP15_DCacheFlush()
{
unsigned long dummy;
__asm { MCR p15, 0, dummy, c7, c6, 0; }
}
void ARM_CP15_CacheFlush()
{
unsigned long dummy;
__asm { MCR p15, 0, dummy, c7, c7, 0; }
}
void ARM_CP15_TLBFlush(void)
{
unsigned long dummy;
__asm { MCR P15, 0, dummy, c8, c7, 0; }
}
void ARM_CP15_ControlRegisterWrite(U32 flags)
{
__asm { MCR P15, 0, flags, c1, c0; }
}
void ARM_CP15_ControlRegisterOR(U32 flag)
{
__asm {
mrc p15,0,r0,c1,c0,0
mov r2,flag
orr r0,r2,r0
mcr p15,0,r0,c1,c0,0
}
}
void ARM_CP15_ControlRegisterAND(U32 flag)
{
__asm {
mrc p15,0,r0,c1,c0,0
mov r2,flag
and r0,r2,r0
mcr p15,0,r0,c1,c0,0
}
}
void ARM_MMU_Init(P_U32 TableAddress)
{
ARM_CP15_TLBFlush();
ARM_CP15_CacheFlush();
ARM_CP15_SetDomainAccessControl(0xFFFFFFFF);
ARM_CP15_SetPageTableBase(TableAddress);
}
void Enable_MMU (void)
{
__asm {
mrc p15,0,r0,c1,c0,0
mov r2, #0x00000001
orr r0,r2,r0
mcr p15,0,r0,c1,c0,0
}
printf(“MMU enabled\n”);
}
void Disable_MMU (void)
{
__asm {
mrc p15,0,r0,c1,c0,0
mov r2, #0xFFFFFFFE
and r0,r2,r0
mcr p15,0,r0,c1,c0,0
}
printf(“MMU disabled\n”);
}
評論
查看更多