arm - cp14, cp15 協處理器

ARM 285瀏覽

ARM
微處理器可支持多達 16
個協處理器,用于各種協處理操作,在程序執行的過程中,每個協處理器只執行針對自身的協處理指令,忽略 ARM
處理器和其他協處理器的指令。ARM
的協處理器指令主要用于 ARM 處理器初始化 ARM
協處理器的數據處理操作,以及在ARM
處理器的寄存器和協處理器的寄存器之間傳送數據,和在 ARM
協處理器的寄存器和存儲器之間傳送數據。 ARM
協處理器指令包括以下 5
條:

CDP
協處理器數操作指令

LDC
協處理器數據加載指令

STC
協處理器數據存儲指令

MCR ARM
處理器寄存器到協處理器寄存器的數據傳送指令

MRC
協處理器寄存器到ARM
處理器寄存器的數據傳送指令

1CDP
指令

CDP
指令的格式為:

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

指令示例:

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

2LDC
指令

LDC
指令的格式為:

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

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

指令示例:

LDC P3
C4 [R0]
;將 ARM 處理器的寄存器 R0
所指向的存儲器中的字數據傳送到協處理器 P3
的寄存器 C4 中。

3STC
指令

STC
指令的格式為:

?

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

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

指令示例:

STC P3
C4
[R0] ;將協處理器 P3
的寄存器 C4 中的字數據傳送到 ARM
處理器的寄存器R0 所指向的存儲器中。

?

4MCR
指令

MCR
指令的格式為:

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

?

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

?

指令示例:

?

MCR P33R0C4C56;該指令將
ARM
處理器寄存器 R0
中的數據傳送到協處理器 P3 的寄存器 C4
C5 中。

?

5MRC
指令

?

MRC
指令的格式為:

?

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

?

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

?

指令示例:

?

MRC P33R0C4C56;該指令將協處理器
P3
的寄存器中的數據傳送到 ARM
處理器寄存器中
.

?

The ARM920T
有兩個具體協處理器

?

CP14調試通信通道協處理器

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

通信數據控制寄存器

以下指令在 Rd
中返回控制寄存器的值:

MRC p14, 0, Rd, c0, c0

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

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

W = 0?
目標應用程序可以寫入新數據。

W = 1?
主機調試器可以從寫入寄存器中掃描出新數據。

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

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 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.?
調試器輪詢通信數據控制寄存器的 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 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系統控制協處理器

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

?

CP15的寄存器只能被MRCMCRMove
to Coprocessor from ARM Register
)指令訪問

?

MCR{cond} p15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>

MRC{cond} p15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>

?

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

-R0ID號寄存器

-R0:緩存類型寄存器

-R1:控制寄存器

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

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

-R4:保留

-R5:異常狀態寄存器(fault status -FSR

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

-R7:緩存操作寄存器

-R8TLB操作寄存器

-R9:緩存鎖定寄存器

-R10TLB
鎖定寄存器

-R11-12&14:保留

-R13:處理器ID

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

?

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

-R0ID號寄存器
這是一個只讀寄存器,返回一個32位的設備ID號,具體功能參考ARM各個系列型號的的CP15
Register 0
說明
.

?

MRC p15, 0, <Rd>, c0, c0, {0, 3-7} ;returns ID

?

以下為ID Code詳細描敘(ARM926EJ-S); ARM920T Part Number0x920,Architecture
(ARMv4T) 為0x2具體可參照ARM各型號.

-R0:緩存類型寄存器(CACHE TYPE REGISTER),包含了caches的信息。讀這個寄存器的方式是通過設置協處理操作碼為1.

?

MRC p15, 0, <Rd>, c0, c0, 1; returns cache details

?

以下為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");

}

七星彩走势图2元网官网