1:协处理器:
ARM微处理器可支持多达16个协处理器,用于各种协处理操作,在程序执行的过程中,每个协处理器只执行针对自身的协处理指令,忽略ARM处理器和其他协处理器的指令
2: mcr是把r(CPU核寄存器)中的数据传送到c(协处理器寄存器)中,mrc则是把c(协处理器寄存器)中的数据传送到r(CPU核寄存器)中
3:ARM协处理器指令包括以下5条:
—CDP协处理器数操作指令
—LDC协处理器数据加载指令
—STC协处理器数据存储指令
—MCRARM处理器寄存器到协处理器寄存器的数据传送指令
—MRC协处理器寄存器到ARM处理器寄存器的数据传送指令
CP15的寄存器只能被MRC和MCR(Moveto Coprocessor from ARM Register )指令访问)
1、CDP指令
CDP指令的格式为:
CDP{条件}协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。CDP指令用于ARM处理器通知ARM协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,目的寄存器和源寄存器均为协处理器的寄存器,指令不涉及ARM处理器的寄存器和存储器。
指令示例:
CDP P3,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}选项表示指令为长读取操作,如用于双精度数据的传输。[
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均为协处理器的寄存器。
指令示例:
MRC P3,3,R0,C4,C5,6;该指令将协处理器P3的寄存器中的数据传送到ARM处理器寄存器中.
![](https://img-my.csdn.net/uploads/201210/25/1351130491_8444.png)
CP15协处理器寄存器列表(其余其余协处理器寄存器功能差不多)
[2:
CP14调试通信通道协处理器
调试通信通道协处理器DCC(theDebug CommunicationsChannel)提供了两个32bits寄存器用于传送数据,还提供了6bits通信数据控制寄存器控制寄存器中的两个位提供目标和主机调试器之间的同步握手。
MRCp14, 0, Rd, c0, c0
此控制寄存器中的两个位提供目标和主机调试器之间的同步握手:
位1(W位)从目标的角度表示通信数据写入寄存器是否空闲:
W= 0目标应用程序可以写入新数据。
W= 1主机调试器可以从写入寄存器中扫描出新数据。
位0(R位)从目标的角度表示通信数据读取寄存器中是否有新数据:
R= 1有新数据,目标应用程序可以读取。
R= 0主机调试器可以将新数据扫描到读取寄存器中。
注意
调试器不能利用协处理器14直接访问调试通信通道,因为这对调试器无意义。但调试器可使用扫描链读写DCC寄存器。DCC数据和控制寄存器可映射到EmbeddedICE逻辑单元中的地址。若要查看EmbeddedICE逻辑寄存器,请参阅您的调试器和调试目标的相关文档。
通信数据读取寄存器
用于接收来自调试器的数据的32位宽寄存器。以下指令在Rd中返
回读取寄存器的值:
MRCp14, 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#"
EN
CP15的寄存器只能被MRC和MCR(Moveto Coprocessor from ARM Register )指令访问
C语言编程内嵌汇编的一般形式:__asm{ MCR p15, 0, dummy, c7, c6, 0; }