历史上的今天
返回首页

历史上的今天

今天是:2024年09月22日(星期日)

正在发生

2021年09月22日 | ARM协处理器指令详解

2021-09-22 来源:eefocus

ARM 微处理器可支持多达 16 个协处理器,用于各种协处理操作,在程序执行的过程中,每个协处理器只执行针对自身的协处理指令,忽略 ARM 处理器和其他协处理器的指令。ARM 的协处理器指令主要用于 ARM 处理器初始化 ARM 协处理器的数据处理操作,以及在ARM 处理器的寄存器和协处理器的寄存器之间传送数据,和在 ARM 协处理器的寄存器和存储器之间传送数据。 ARM 协处理器指令包括以下 5 条:

— CDP 协处理器数操作指令

— LDC 协处理器数据加载指令

— STC 协处理器数据存储指令

— MCR ARM 处理器寄存器到协处理器寄存器的数据传送指令

— MRC 协处理器寄存器到ARM 处理器寄存器的数据传送指令


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}选项表示指令为长读取操作,如用于双精度数据的传输。


指令示例:

LDC P3 , C4 , [R0] ;将 ARM 处理器的寄存器 R0 所指向的存储器中的字数据传送到协处理器 P3 的寄存器 C4 中。


3、STC 指令 
STC 指令的格式为:

STC{条件}{L} 协处理器编码,源寄存器,[目的寄存器]

STC 指令用于将源寄存器中的字数据传送到目的寄存器所指向的存储器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输。


指令示例:

STC P3 , C4 , [R0] ;将协处理器 P3 的寄存器 C4 中的字数据传送到 ARM 处理器的寄存器R0 所指向的存储器中。


4、MCR 指令 
MCR 指令的格式为:

MCR{条件} 协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2。  


MCR 指令用于将ARM 处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1 和协处理器操作码2 为协处理器将要执行的操作,源寄存器为ARM 处理器的寄存器,目的寄存器1 和目的寄存器2 均为协处理器的寄存器。


指令示例:  

MCR P3,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 处理器寄存器中.

再举个例子:

mrc p15,0,r0,c1,c0,0

将协处理器p15的寄存器中的数据传送到ARM处理器的寄存器r0中,其中1是协处理器操作码1,0是协处理器操作码2,c1存放第一个操作数的协处理器寄存器,c0存放第二个操作数的协处理器寄存器

The ARM920T 有两个具体协处理器

CP14调试通信通道协处理器
调试通信通道协处理器DCC(the Debug Communications Channel)提供了两个32bits寄存器用于传送数据,还提供了6bits通信数据控制寄存器控制寄存器中的两个位提供目标和主机调试器之间的同步握手。


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

MRC p14, 0, Rd, c0, c0

此控制寄存器中的两个位提供目标和主机调试器之间的同步握手:

位 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 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)他通过协处理器指令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

以下为ID Code详细描叙(ARM926EJ-S); ARM920T Part Number为0x920,Architecture (ARMv4T) 为0x2具体可参照ARM各型号.

-R0:缓存类型寄存器(CACHE TYPE REGISTER),包含了caches的信息。读这个寄存器的方式是通过设置协处理操作码为1.

MRC p15, 0, , 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");

}


推荐阅读

史海拾趣

Harbour Industries公司的发展小趣事

背景:20世纪末,随着电子技术的飞速发展,Handok敏锐地捕捉到了半导体行业的崛起机遇。公司决定投入大量研发资源,专注于开发新型半导体材料和技术。

发展:经过数年的潜心研究,Handok成功研发出一种具有更高导电性和稳定性的新型半导体材料,这一创新成果迅速获得了业界的广泛关注。公司迅速将这项技术应用于生产,推出了一系列高性能的半导体产品,迅速占领了市场的一席之地。

影响:Handok的技术革新不仅推动了公司自身的快速发展,还对整个半导体行业产生了深远的影响,促进了整个产业链的升级和转型。

Achronix Semiconductor Corporation公司的发展小趣事

背景:近年来,随着环保意识的提高和可持续发展理念的普及,电子行业也开始向绿色化、低碳化方向发展。Handok积极响应这一趋势,将绿色可持续发展作为公司的重要战略之一。

发展:Handok加大了对环保技术的研发投入,推出了一系列绿色电子产品和解决方案。同时,公司还优化了生产流程和管理体系,实现了资源的高效利用和废弃物的减量化处理。

影响:Handok的绿色可持续发展战略不仅赢得了市场的广泛认可,还为公司树立了良好的社会形象。此外,这一战略还有助于公司在未来更加激烈的市场竞争中保持领先地位。

扬州国芯(Gcore)公司的发展小趣事

背景:随着全球化的深入发展,电子行业也迎来了国际化的浪潮。Handok意识到,要想在激烈的国际竞争中立于不败之地,必须加强与国际市场的联系和合作。

发展:Handok积极寻求与国际知名电子企业的合作机会,通过技术引进、联合研发等方式不断提升自身的技术实力和产品品质。同时,公司还加大了对国际市场的开拓力度,通过参加国际展会、设立海外分支机构等方式扩大品牌影响力。

影响:国际合作的成功为Handok带来了更多的发展机遇和市场空间,公司的国际知名度和竞争力显著提升。

地博电子(DIBO)公司的发展小趣事

为了进一步拓展市场,地博电子在2016年成立了湖南地博光学材料有限公司,并建立了覆盖全国的营销网络。这一举措使得地博电子的产品能够更快速地触达目标客户,提高了市场占有率和品牌影响力。同时,全国营销网络的建立也为地博电子的未来发展提供了更广阔的空间。

AiT Semiconductor Inc公司的发展小趣事

随着技术的不断成熟和产品的不断完善,AiT公司开始积极拓展市场。他们通过参加国际电子展会、与国内外知名企业建立合作关系等方式,不断提升品牌知名度和市场份额。同时,公司还针对不同行业和领域的需求,推出了定制化的半导体解决方案,进一步扩大了应用范围。这一系列的举措使得AiT公司在市场中实现了跨越式发展。

H&D Wireless公司的发展小趣事

2017年,高创被美的集团全资收购,成为美的工业技术事业群的重要业务板块之一。这一转变标志着高创进入了一个全新的发展阶段。借助美的集团的平台力量,高创在技术研发、生产制造、供应链管理等方面得到了显著提升。同时,与美的集团旗下其他业务板块如库卡机器人等的协同合作,进一步拓宽了高创的市场应用领域。

问答坊 | AI 解惑

Protel dxp2004注册不了

分别装了proteldxp2004四个程序,到最后注册不了,请教是什么问题,…

查看全部问答>

嵌入式学习,嵌入式学习有哪些要素呢

学习,老师是非常关键的环节。对于嵌入式的学习当然也不例外。所以,在嵌入式的学习中,老师是很重要的要素之一。 嵌入式学习,挑选什么样的老师? 双师型老师。具体的来说,一方面,具备嵌入式的研发经验,有独立开发的项目和作品,在嵌入式行 ...…

查看全部问答>

有人改写过uip使用双缓存么?

tcp ip 轻量级开源协议uip使用单缓存收发数据,有前辈改写过,让它使用双缓存么,分离收发的缓存?改写后的效果如何,有没有带来实际的好处?…

查看全部问答>

今天实在很生气

以前买了一块S3C44B0开发板,附带了一块JTAG板和一根连接线。 之前我一直没有用使用JTAG板 ,这几天想下载程序到板子里面,就用了它,可是总是不能成功。用H-JTAG检测芯片的型号,都没成功,于是我就找原因。一连被折腾了好几天,浪费我这么多时间 ...…

查看全部问答>

没分了,请精通视频芯片开发的帮帮忙?

有如下英文: The SAA7130HL is a single chip solution to digitize and decode video, and capture it through the PCI-bus。 说的是SAA7130HL可以用来数字化和解码视频。 请问 1.数字化是不是把模拟的原始采集来的图像模拟信号数字化啊? 2 ...…

查看全部问答>

弱弱问一下 给U盘重命名的问题?

我用的arm开发板,将U盘插进去后,显示的名称为 \"硬盘\",我想用重命名改名字但是不行,请问,大虾们,这个名字就不能改吗?想改成英文的。 谢谢!…

查看全部问答>

哪位知道PB工程里FILEVIEW->C:\WINCE500->PLATFORM文件夹是空的,是什么原因啊?

哪位知道PB工程里FILEVIEW->C:\\WINCE500->PLATFORM文件夹是空的,是什么原因啊? 编译是正确的,但是这里就是不显示,没法单独编译某个驱动了!请各位高人帮帮忙啊! 如下图:C:\\PB.BMP …

查看全部问答>

求助:linux2.6在ixp425平台上移植时time_init函数错误

UBOOT跑的很顺利,一次成功,但是LINUX移植死在了初始化时钟中断上,想破了头,查了很多资料都没效果.硬件平台是我们自己搭建的,没有用成熟的开发板.请教大虾们的帮助.…

查看全部问答>