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:缓存类型寄存器 -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, 以下为ID Code详细描叙(ARM926EJ-S); ARM920T Part Number为0x920,Architecture (ARMv4T) 为0x2具体可参照ARM各型号. -R0:缓存类型寄存器(CACHE TYPE REGISTER),包含了caches的信息。读这个寄存器的方式是通过设置协处理操作码为1. MRC p15, 0, 以下为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"); }
-R0:ID号寄存器
上一篇:ARM体系架构—ARMv7-A协处理器
下一篇:ARM协处理器访问指令(Linux学习记录)
推荐阅读
史海拾趣
作为一家领先的电子企业,Fairview Microwave深知自己的社会责任和使命。他们积极履行社会责任,关注环保和公益事业。公司不仅严格遵守环保法规和标准要求,还积极推广绿色生产和循环经济理念。同时,Fairview Microwave还积极参与社会公益事业,通过捐赠和志愿服务等方式回馈社会。这些举措不仅提升了公司的社会形象和声誉,也为公司的可持续发展奠定了坚实基础。
请注意,以上故事均为虚构内容,旨在展示Fairview Microwave Inc公司可能的发展路径和成长历程。如需了解该公司真实的发展故事和历程,请参考公司官方发布的历史资料和新闻报道。
振宝佳(DMBJ)公司自成立之初,就专注于贴片铝电解电容的研发与生产。在1998年之前,公司一直在台湾深耕细作,积累了丰富的技术实力和市场资源。进入21世纪,随着电子产业的快速发展,振宝佳意识到技术突破的重要性。于是,公司投入大量资源,研发出多项专利技术,这些技术不仅提升了产品的性能,也增强了公司的市场竞争力。
国光新业在深耕国内市场的同时,也积极拓展海外市场。公司的电容器产品凭借其优异的性能与可靠的质量,赢得了国内外众多客户的信赖与好评。随着品牌影响力的不断提升,国光新业已成为电子元器件行业中的佼佼者。未来,公司将继续坚持创新驱动发展战略,不断提升产品与服务的品质与竞争力,致力于成为具有国际竞争力的电子元器件供应商。
在成功占领国内市场后,ECLIPSE公司开始积极拓展国际市场。通过与国际知名企业和机构的合作,Eclipse得以在全球范围内推广和应用。同时,公司还积极探索多元化发展道路,将Eclipse的技术和模式应用于其他领域和行业。这些努力不仅为ECLIPSE公司带来了更多的商业机会和市场份额,也为其在电子行业的长远发展奠定了坚实的基础。
以上五个故事是基于Eclipse项目的发展历史和电子行业的一般趋势而虚构的。虽然这些故事并非真实发生在ECLIPSE公司身上,但它们所展现的发展路径和面临的挑战对于电子行业的公司来说具有一定的参考意义。
AEL Crystals Ltd公司成立于1960年,最初专注于石英频率控制元件的研发与生产。在创立初期,公司面临着技术挑战和市场竞争的双重压力。然而,凭借创始人的远见卓识和团队的不懈努力,AEL Crystals逐渐在石英频率控制领域站稳了脚跟。公司通过持续改进生产工艺和提高产品质量,逐渐赢得了客户的信任和支持。
20世纪60年代,英国人谢泼德·巴伦产生了发明一款“随时可以取钞票的机器”的想法,并付诸实践。1967年6月27日,世界上第一台ATM在英国伦敦北部的巴克莱银行亮相。这台机器的成功推出,标志着ATM开始进入公众的视野,并逐渐在全球范围内得到广泛应用。
Wince 5.0下,USB读取设备数据 USB BULK TRANSFER,我用的是同步传输方式,没有设置回调函数,因此错误检测也没做。只判断Transfer是否成功返回。一次传输64Bytes,一共取640个包 我的问题是:每次传输后性能都下降一些: 打印如下信息: Subim ...… 查看全部问答∨ |
我用的是三星的K9F1G08,128M,现在它被分成2个块,前面一块用来存放EBoot,NK等东西,后面一块是在系统起来后能够看到的,也可以用来存文件的那个东西。现在我想知道是这两个块的分界点在什么地方设置,也就是说可以固定前面NK块和后面应用块的大 ...… 查看全部问答∨ |
我买了一个TL-WN322G+ V2.0无线网卡,应用在mini2440上(内核Linux2.6.32.2)信息如下: [root@FriendlyARM /]# usb 1-1: new full speed USB device using s3c2410-ohci and address 2 usb 1-1: New USB device found, idVendor=0cf3, idProduc ...… 查看全部问答∨ |
|
PlaySound 是可以播放内存中的声音数据的 我使用如下的代码失败 PlaySound(pBuff,NULL,SND_MEMORY|SND_ASYNC|SND_LOOP); 有人以前做过相关的程序吗 ? … 查看全部问答∨ |
现金1000RMB求并口LPT转串口方案 利用电脑主板上现有的并口,实现虚拟出8个串口,控制8路TTL电平信号。 具体详谈qq 596999,电话0755-21031555(2007.06后勿扰。)… 查看全部问答∨ |
我有《虚拟电子实验室10.0》(NI.Multisim 10.0)V10.0汉化破解版[压缩包],photoshopcs5,Altium Designer,quartus2,Adobe Flash CS4,Flash8-chs,Proteus 7.5,KeilC51V9.00由于太大无法上传需要的话给我发邮件说明要哪个软件 137861128@q ...… 查看全部问答∨ |