新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > ARM處理器架構-----協(xié)處理器

ARM處理器架構-----協(xié)處理器

作者: 時間:2016-11-09 來源:網(wǎng)絡 收藏
ARM指令集-協(xié)處理器指令詳解

本文引用地址:http://butianyuan.cn/article/201611/317952.htm

ARM可支持多達16個協(xié)處理器,主要的作用:ARM處理器初始化,ARM與協(xié)處理器的數(shù)據(jù)處理操作,ARM的寄存器與協(xié)處理器的寄存器之間傳送數(shù)據(jù),以及ARM協(xié)處理器的寄存器和存儲器之間傳送數(shù)據(jù)。共有5條:

-CDP 協(xié)處理器數(shù)據(jù)操作指令

-LDC 協(xié)處理器數(shù)據(jù)加載指令

-STC 協(xié)處理器數(shù)據(jù)存儲指令

-MCR ARM的寄存器到協(xié)處理器的寄存器的數(shù)據(jù)傳送

-MRC 協(xié)處理器的寄存器到ARM的寄存器的數(shù)據(jù)傳送

1、CDP 指令

CDP 指令的格式為:

CDP{條件} 協(xié)處理器編碼,協(xié)處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協(xié)處理器操作碼2。

CDP 指令用于ARM 處理器通知ARM 協(xié)處理器執(zhí)行特定的操作,若協(xié)處理器不能成功完成特定的操作,則產生未定義指令異常。其中協(xié)處理器操作碼1 和協(xié)處理器操作碼2 為協(xié)處理器將要執(zhí)行的操作,目的寄存器和源寄存器均為協(xié)處理器的寄存器,指令不涉及ARM 處理器的寄存器和存儲器。

指令示例:

CDP P3 , 2 , C12 , C10 , C3 , 4 ;該指令完成協(xié)處理器 P3 的初始化

2、LDC 指令

LDC 指令的格式為:

LDC{條件}{L} 協(xié)處理器編碼,目的寄存器,[源寄存器]

LDC 指令用于將源寄存器所指向的存儲器中的字數(shù)據(jù)傳送到目的寄存器中,若協(xié)處理器不能成功完成傳送操作,則產生未定義指令異常。其中,{L}選項表示指令為長讀取操作,如用于雙精度數(shù)據(jù)的傳輸。

指令示例:

LDC P3 , C4 , [R0] ;將 ARM 處理器的寄存器 R0 所指向的存儲器中的字數(shù)據(jù)傳送到協(xié)處理器 P3 的寄存器 C4 中。

3、STC 指令

STC 指令的格式為:

STC{條件}{L} 協(xié)處理器編碼,源寄存器,[目的寄存器]

STC 指令用于將源寄存器中的字數(shù)據(jù)傳送到目的寄存器所指向的存儲器中,若協(xié)處理器不能成功完成傳送操作,則產生未定義指令異常。其中,{L}選項表示指令為長讀取操作,如用于雙精度數(shù)據(jù)的傳輸。

指令示例:

STC P3 , C4 , [R0] ;將協(xié)處理器 P3 的寄存器 C4 中的字數(shù)據(jù)傳送到 ARM 處理器的寄存器R0 所指向的存儲器中。

4、MCR 指令

MCR 指令的格式為:

MCR{條件} 協(xié)處理器編碼,協(xié)處理器操作碼1,源寄存器,目的寄存器1,目的寄存器2,協(xié)處理器操作碼2。

MCR 指令用于將ARM 處理器寄存器中的數(shù)據(jù)傳送到協(xié)處理器寄存器中,若協(xié)處理器不能成功完成操作,則產生未定義指令異常。其中協(xié)處理器操作碼1 和協(xié)處理器操作碼2 為協(xié)處理器將要執(zhí)行的操作,源寄存器為ARM 處理器的寄存器,目的寄存器1 和目的寄存器2 均為協(xié)處理器的寄存器。

指令示例:

MCR P3 , 3 , R0 , C4 , C5 , 6 ;該指令將 ARM 處理器寄存器 R0 中的數(shù)據(jù)傳送到協(xié)處理器 P3 的寄存器 C4 和 C5 中。

5、MRC 指令

MRC 指令的格式為:

MRC{條件} 協(xié)處理器編碼,協(xié)處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協(xié)處理器操作碼2。

MRC 指令用于將協(xié)處理器寄存器中的數(shù)據(jù)傳送到ARM 處理器寄存器中,若協(xié)處理器不能成功完成操作,則產生未定義指令異常。其中協(xié)處理器操作碼1 和協(xié)處理器操作碼2 為協(xié)處理器將要執(zhí)行的操作,目的寄存器為ARM 處理器的寄存器,源寄存器1 和源寄存器2 均為協(xié)處理器的寄存器。

指令示例:

MRC P3 , 3 , R0 , C4 , C5 , 6 ;該指令將協(xié)處理器 P3 的寄存器中的數(shù)據(jù)傳送到 ARM 處理器寄存器中.

ARM920T 有兩個具體協(xié)處理器

1.CP14調試通信通道協(xié)處理器

調試通信通道協(xié)處理器DCC(the Debug Communications Channel)提供了兩個32bits寄存器用于傳送數(shù)據(jù),還提供了6bits通信數(shù)據(jù)控制寄存器控制寄存器中的兩個位提供目標和主機調試器之間的同步握手。

此控制寄存器中的兩個位提供目標和主機調試器之間的同步握手:

位 1(W 位) 從目標的角度表示通信數(shù)據(jù)寫入寄存器是否空閑:

W = 0 目標應用程序可以寫入新數(shù)據(jù)。

W = 1 主機調試器可以從寫入寄存器中掃描出新數(shù)據(jù)。

位 0(R 位) 從目標的角度表示通信數(shù)據(jù)讀取寄存器中是否有新數(shù)據(jù):

R = 1 有新數(shù)據(jù),目標應用程序可以讀取。

R = 0 主機調試器可以將新數(shù)據(jù)掃描到讀取寄存器中。

注意

調試器不能利用協(xié)處理器 14 直接訪問調試通信通道,因為這對調試器無意義。 但調試器可使用掃描鏈讀寫 DCC 寄存器。 DCC 數(shù)據(jù)和控制寄存器可映射到 EmbeddedICE 邏輯單元中的地址。 若要查看 EmbeddedICE 邏輯寄存器,請參閱您的調試器和調試目標的相關文檔。

通信數(shù)據(jù)讀取寄存器

用于接收來自調試器的數(shù)據(jù)的 32 位寬寄存器。 以下指令在 Rd 中返

回讀取寄存器的值:

MRC p14, 0, Rd, c1, c0

通信數(shù)據(jù)寫入寄存器

用于向調試器發(fā)送數(shù)據(jù)的 32 位寬寄存器。 以下指令將 Rn 中的值寫

到寫入寄存器中:

MCR p14, 0, Rn, c1, c0

注意

有關訪問 ARM10 和 ARM11 內核 DCC 寄存器的信息,請參閱相應的技術參考手冊。 ARM9 之后的各處理器中,所用指令、狀態(tài)位位置以及對狀態(tài)位的解釋都有所不同。

目標到調試器的通信

這是運行于 ARM 內核上的應用程序與運行于主機上的調試器之間的通信事件順序:

1. 目標應用程序檢查 DCC 寫入寄存器是否空閑可用。 為此,目標應用程序使用 MRC 指令讀取調試通信通道控制寄存器,以檢查 W 位是否已清除。

2. 如果 W 位已清除,則通信數(shù)據(jù)寫入寄存器已清空,應用程序對協(xié)處理器14 ,使用 MCR 指令將字寫入通信數(shù)據(jù)寫入寄存器。 寫入寄存器操作會自動設置W 位。如果 W 位已設置,則表明調試器尚未清空通信數(shù)據(jù)寫入寄存器。此時,如果應用程序需要發(fā)送另一個字,它必須輪詢 W 位,直到它已清除。

3. 調試器通過掃描鏈 2 輪詢通信數(shù)據(jù)控制寄存器。 如果調試器發(fā)現(xiàn) W 位已設置,則它可以讀 DCC 數(shù)據(jù)寄存器,以讀取應用程序發(fā)送的信息。 讀取數(shù)據(jù)的進程會自動清除通信數(shù)據(jù)控制寄存器中的 W 位。

以下代碼顯示了這一過程

AREA OutChannel, CODE, READONLY

ENTRY

MOV r1,#3 ; Number of words to send

ADR r2, outdata ; Address of data to send

pollout

MRC p14,0,r0,c0,c0 ; Read control register

TST r0, #2

BNE pollout ; if W set, register still full

write

LDR r3,[r2],#4 ; Read word from outdata

; into r3 and update the pointer

MCR p14,0,r3,c1,c0 ; Write word from r3

SUBS r1,r1,#1 ; Update counter

BNE pollout ; Loop if more words to be written

MOV r0, #0x18 ; Angel_SWIreason_ReportException

LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit

SVC 0x123456 ; ARM semihosting (formerly SWI)

outdata

DCB "Hello there!"

END

調試器到目標的通信

這是運行于主機上的調試器向運行于內核上的應用程序傳輸消息的事件順序:

1. 調試器輪詢通信數(shù)據(jù)控制寄存器的 R 位。 如果 R 位已清除,則通信數(shù)據(jù)讀取寄存器已清空,可將數(shù)據(jù)寫入此寄存器,以供目標應用程序讀取。

2. 調試器通過掃描鏈 2 將數(shù)據(jù)掃描到通信數(shù)據(jù)讀取寄存器中。 此操作會自動設置通信數(shù)據(jù)控制寄存器中的 R 位。

3. 目標應用程序輪詢通信數(shù)據(jù)控制寄存器中的 R 位。 如果該位已經設置,則通信數(shù)據(jù)讀取寄存器中已經有數(shù)據(jù),應用程序可使用 MRC 指令從協(xié)處理器14 讀取該數(shù)據(jù)。 同時,讀取指令還會清除 R 位。

以下顯示的目標應用程序代碼演示了這一過程

AREA InChannel, CODE, READONLY

ENTRY

MOV r1,#3 ; Number of words to read

LDR r2, =indata ; Address to store data read

pollin

MRC p14,0,r0,c0,c0 ; Read control register

TST r0, #1

BEQ pollin ; If R bit clear then loop

read

MRC p14,0,r3,c1,c0 ; read word into r3

STR r3,[r2],#4 ; Store to memory and

; update pointer

SUBS r1,r1,#1 ; Update counter

BNE pollin ; Loop if more words to read

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系統(tǒng)控制協(xié)處理器

CP15 —系統(tǒng)控制協(xié)處理器 (the system control coprocessor)他通過協(xié)處理器指令MCR和MRC提供具體的寄存器來配置和控制caches、MMU、保護系統(tǒng)、配置時鐘模式(在bootloader時鐘初始化用到)

CP15的寄存器只能被MRC和MCR(Move to Coprocessor from ARM Register )指令訪問

MCR{cond} p15,,,,,

MRC{cond} p15,,,,,

其中L位用來區(qū)分MCR(L=1)和MRC(L=0)操作. CP15包括15個具體的寄存器如下

-R0:ID號寄存器

-R0:緩存類型寄存器

-R1:控制寄存器

-R2:轉換表基址寄存器(Translation Table Base --TTB)

-R3:域訪問控制寄存器(Domain access control )

-R4:保留

-R5:異常狀態(tài)寄存器(fault status -FSR)

-R6:異常地址寄存器(fault address -FAR)

-R7:緩存操作寄存器

-R8:TLB操作寄存器

-R9:緩存鎖定寄存器

-R10:TLB 鎖定寄存器

-R11-12&14:保留

-R13:處理器ID

-R15:測試配置寄存器 2-24

要注意有2個R0,根據(jù)MCR操作數(shù)的不同傳送不同的值,這也一個只讀寄存器

-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 enabledn");

}

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 disabledn");

}



評論


技術專區(qū)

關閉