ARM协处理器指令详解

发布者:创新之星最新更新时间:2016-06-24 来源: eefocus关键字:ARM  协处理器  指令详解 手机看文章 扫描二维码
随时随地手机看文章
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

ARM协处理器指令详解

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

位 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 )指令访问

ARM协处理器指令详解

MCR{cond} p15,,,,,

MRC{cond} p15,,,,,

其中L位用来区分MCR(L=1)和MRC(L=0)操作. CP15包括15个具体的寄存器如下:

ARM协处理器指令详解


-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各型号.

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 enabled\n");

}

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 disabled\n");

}

关键字:ARM  协处理器  指令详解 引用地址:ARM协处理器指令详解

上一篇:汇编入门学习笔记 (一)—— 基础知识、寄存器
下一篇:ARM汇编指令的条件执行及其他相关细节

推荐阅读最新更新时间:2024-03-16 14:58

ARM发布REALVIEW实时软件库
全新优化的软件组件将加速 32 位微控制器应用的开发 今天 ARM 公司 宣布推出高度优化的 ARM RealView 实时 软件 库,该 软件 库包含有快速开发需要实时控制、网络、 USB 和 CAN 连接功能的产品所需的最关键的组件。 ARM 微控制器开发工具总监 Reinhard Keil 表示:“消费、商用和工业领域的嵌入式系统对多重通信接口以及网络性能和互联网连接性提出越来越高的要求。在过去的十几年中,我们处于市场领先地位的 RTX51 操作系统核心一直是帮助 8 位工程师快速开发应用的关键组件。我们现在已经开始现货提供优化的组件,以此满足先进的 32 位嵌入式应用最
[新品]
ARM中的程序状态寄存器CPSR
M 处理器模式 ARM模式可访问的寄存器 THUMB模式可访问的寄存器 0b10000 用户模式 PC,CPSR,R0~R14 PC,CPSR,R0~R7,LR,SP 0b10001 FIQ模式 PC,CPSR,SPSR_fiq,R14_fiq~R8_fiq,R0~R7 PC,CPSR,SPSR_fiq,LR_fiq,SP_fiq,R0~R7 0b10010 IRQ模式 PC,CPSR,SPSR_irq,R14_irq~R13_irq,R0~R12 PC,CPSR,SPSR_irq,LR_irq,SP_irq,R0~R7
[单片机]
快数学Arm(17)--uC/OS-II任务管理块TCB
原指望Arm7能得到快速学习,但看了之后发现与C51的难度不是相同数量级的.如果真的想学好,还是需要研究很多东西的.我绕了个圈子,接着转向学习uC/OS-II,学一样东西无法按照书上的套路按部就班的学,那样实在太慢了.看了一项uC/OS-II的教材,发现要学好它是需要花费一些时间的,对于时间比较短缺的我来说是不是有足够的时间把它学下去,我也不知道,但只要我不被其他的更重要的事情打断,我想我是能够坚持下去的,我相信我的毅力. 在前面我们知道了uC/OS-II(后面写成ucos2,敲起来方便些)是可以实现多任务的,看了书以后发现这种多任务虽然功能要比C51强了很多,但真的需要投入很多精力才能逐渐弄清楚,而且C语言差的人,没有汇编经
[单片机]
8051、ARM和DSP指令周期的测试与分析
在实时控制系统中,选择微控制器的指标时最重要的是计算速度的问题。指令周期是反映计算速度的一个重要指标,为此本文对三种最具代表性的微控制器(AT89S51单片机、ARM7TDMI核的LPC2114型单片机和TMS320F2812)的指令周期进行了分析和测试。为了能观察到指令周期,将三种控制器的GPIO口设置为数字输出口,并采用循环不断地置位和清零,通过观察GPIO口的波形变化得到整个循环的周期。为了将整个循环的周期与具体的每一条指令的指令周期对应起来,通过C语言源程序得到汇编语言指令来计算每一条汇编语言的指令周期。 1 AT89S51工作机制及指令周期的测试   AT89S51单片机的时钟采用内部方式,时钟发生器对振荡脉冲进
[测试测量]
8051、<font color='red'>ARM</font>和DSP<font color='red'>指令</font>周期的测试与分析
在软件领域,Arm都做了哪些?
你也许不知道,作为全球知名的芯片IP公司,Arm 有45%的工程师是软件开发人员。其中固然有部分开发人员在做底层,比如相关驱动的开发,但更多的工程师在做高层软件工作,包括软件框架、性能分析工具、展示最佳实践等等。 日前,Arm终端事业部生态系统及工程高级总监 Geraint North介绍了Arm在软件和生态系统方面的贡献。文章将分为四个方面,包括64位部署迁移,安全行业投入,软件架构优化以及安卓动态性能框架的合作。 全面转向64位 Armv9.2全面转向了64位,一直以来,Arm都在宣传64位的好处,但安卓生态经过了一个漫长的过程才完成64位迁移。10多年前Arm就进入了64位,但直到去年谷歌最新的Pixel手机才成
[半导体设计/制造]
arm嵌入式交叉编译工具链
1、arm-linux-gcc    常用的参数:-o -c -g -xO -w/W(警告等级)    arm-linux-gcc -o dest source,直接编译出可执行文件elf格式 arm-linux-gcc -o dest source -c 只编译不连接,生成.o格式的库文件,用来提供给连接器连接成elf 其他的参数可以在GCC的手册中了解所有信息。 2、arm-linux-ld   如果GCC中使用的-c,需要arm-linux-ld根据连接文件或默认连接设置来来连接说有的.o文件。 常用:arm-linux-ld -Ttext EnterPoint 所有.o文件。 3、arm-
[单片机]
基于ARM7和CPLD的数字公交站亭系统设计
  针对现有印刷公交站亭提供信息少、无法提供车辆到站预报、增加线路或者修改线路信息麻烦等不足,本文提出了一种新数字公交站亭系统。该系统基于ARM7 和CPLD 架构,通过GPRS 与公交控制中心通信,采用CA 认证保证通信的安全性,能实现实时车辆到站预报、公众信息(如天气预报、重要新闻、交通路况、紧急状态信息)发布、线路信息及时更新以及系统在线升级等功能,具有实时性好、安全性高,可扩展性强等特点,有助于全面提升城市公交站的信息服务水平。   1 数字公交站亭系统总体结构及工作原理   该系统分为控制中心、站亭终端通信模块、站亭终端控制模块、站亭终端显示模块四个部分,总体结构框图如图1,各个部分组成和工作原理介绍如下:   (
[单片机]
基于<font color='red'>ARM</font>7和CPLD的数字公交站亭系统设计
Arm宣布旗下多个开源项目从GitHub迁移到GitLab
根据 GitLab 最新新闻稿,Arm Open Source 已决定将公司的多个开源项目从 GitHub 迁移到 GitLab。在新闻稿中,GitLab 概述了 Arm Open Source 选择其平台的重要原因:最大化选择和成本效益,最小化供应商锁定。 Arm 所创建的软件扮演着赋能件(enablement pieces)的角色,能够在其架构上集成其他软件。目前超过 95% 的移动设备都采用 Arm 处理器,而这些开源项目覆盖从传感器到云计算的诸多领域。 Arm 公司的杰出工程师和软件社区高级主管 Andrew Wafaa 解释说:“就其本身而言,这些功能部件并不是那么神奇,但当你把它们与来自其他社区和其他项目的其
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved