ARM协处理器指令

最新更新时间:2021-09-22来源: eefocus关键字:ARM  协处理器指令 手机看文章 扫描二维码
随时随地手机看文章

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


CDP 协处理器数操作指令

LDC 协处理器数据加载指令

STC 协处理器数据存储指令

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

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

......


CP15系统控制协处理器


CP15 —系统控制协处理器 (the system control coprocessor)他通过协处理器指令MCR和MRC提供具体的寄存器来配置和控制caches、MMU、保护系统、配置时钟模式(在bootloader时钟初始化用到)


CP15的寄存器只能被MRC和MCR(Move to Coprocessor from ARM Register )指令访问

一些要说明的内容,摘录见下::



Co-processors

There are between zero and three possible co-processors. Most desktop ARM systems do not have logic for external co-processors, so we may either use that which is built into the ARM itself, or an emulated co-processor.

CP15 is reserved on the ARM 3 and later processors for internal configuration, as described in this document.

CP0 and CP1 is used by the floating point system. It may either be an external floating point chip (as used with the ARM 3), hardware built into the processor (as in the ARM 7500FE), or a totally software-based emulation (as with the  FPEmulator  that we all know).

Here is a short exercise for you:


    10 DIM code% 16

    20 P% = code%

    30 [ OPT     3

    40   CDP     CP1, 0, C0, C1, C2, 0

    50   ADFS    F0, F1, F3

    60   MOV     PC, R14

    70 ]

   >RUN

   00008F78                    OPT     3

   00008F78 EE010102           CDP     CP1, 0, C0, C1, C2

   00008F7C EE010102           ADFS    F0, F1, F2

   00008F80 E1A0F00E           MOV     PC, R14

   >

What do you notice?  :-)

 


When the ARM executes a co-processor instruction, or an undefined instruction, it will offer it to any co-processors which may be presently attached. If hardware is available to process the given instruction, then it is expected to do so. If it is busy at the time the instruction is offered, the ARM will wait for it.

If there is no co-processor capable of executing the instruction, the ARM will take its undefined instruction trap, in which case the following will happen:


The PSR and PC are both saved (the method differs for 26 bit and 32 bit ARMs)

SVC mode (26 bit) / UND mode (32 bit) is entered, and the I bit of the PSR is set

The instruction at address &00000004 is executed

This trap may be used to add instructions to the instruction set by emulation, or to implement a software emulation of hardware that isn't fitted. The  Floating Point Emulator  works by doing this.

To return, simply pull the saved PC and PSR (depends on 26/32 bit) and push them to the current PC and PSR, like MOVS PC, R14 in 26 bit systems. This will pick up with the instruction following the one which caused the trap.


All of the co-processor instructions can be executed conditionally. Please note that the conditionals relate to the status of the ARM processor, and not the status of any of the co-processors. This is because the ARM always tries the instruction first, and offers it around and maybe takes the undefined application trap, so the conditions are ARM related.

To make this clearer:


    10 DIM code% 32

    20 P% = code%

    30 [ OPT     3

    40   FLTS    F0, R0

    50   FLTS    F1, R1

    60   FMLS    F2, F0, F1

    70   FIX     R0, F2

    80   MOVS    PC, R14

    90 ]

   100 INPUT "First number : "A%

   110 INPUT "Second number: "B%

   120 PRINT USR(code%)

This probably won't assemble without an enhanced BASIC assembler.

Anyway, you might think the ARM will hand over to the floating point co-processor to do the four FP instructions, then hand back afterwards.

If you did, you would be incorrect!


What actually is executed is:


   MCR     CP1, 0, R0, C0, C0

   MCR     CP1, 0, R1, C1, C0

   CDP     CP1, 9, C2, C0, C1

   MRC     CP1, 0, R0, C0, C2

It is worth pointing out that objasm specifies co-processor registers using the CR notation (ie, CR0 - CR15), which is first defined with the CN directive. It does not appear as if default co-processor instructions are defined in Nick Roberts' ASM, though I've only looked in the instructions at the "defined symbols" section...

Darren Salt's ExtBASICasm provides the register names C0 - C15 to refer to the co-processors. So if any of these examples fail when you try to assemble them, please check what format your assembler provides these instructions.


 


 



MRC

The instruction  MRC  transfers a co-processor register to an ARM register. It takes the form:

   MRC    , , , , ,

The co-processor is denoted in most assemblers by  CPx .

The register    is written to  , using operation  . This may, possibly, be further modified by    and  . For an idea of the sorts of times when this might be necessary, consider instructions of the form  LDR Ra, [Rb], #x . 

The final    may be omitted, as it is in the example, but the other parts of the MRC instruction must be supplied.

 



MCR

The instruction  MCR  transfers an ARM register to a co-processor register. It takes the form:

   MCR    , , , , ,

The co-processor is free to interpret the fields as it desires, but the standard interpretation is that the contents of the ARM register are written to the co-processor register using the operation code given, which may be further modified by the second co-processor register and/or the second operation code.




在U-Boot中我们用到了c7 和 c8这两个协处理器,再来看看MCR的详细用法:



MCR指令:


MCR指令将ARM处理器的寄存器中的数据传送到协处理器寄存器中。如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。


指令语法格式:


MCR{}

,< opcode_1>,,,{,}


MCR{} p15,0,,,{,}


其中


指令执行的条件码.当忽略时指令为无条件执行。


协处理器将执行的操作的操作码。对于CP15协处理器来说,永远为0b000,当不为0b000时,该指令操作结果不可预知。


作为源寄存器的ARM寄存器,其值将被传送到协处理器寄存器中


作为目标寄存器的协处理器寄存器,其编号可能是C0,C1,…,C15。


两者组合决定对协处理器寄存器进行所需要的操作,如果没有指定,则将为为C0,opcode_2为0



    mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */


可以看出,其中


rd为r0=0


CRn为C7


CRm为C7


对于这行代码的作用,以此按照语法,来一点点解释如下:


首先,mcr做的事情,其实很简单,就是“ARM处理器的寄存器中的数据传送到协处理器寄存器中”,


此处即是,将ARM的寄存器r0中的数据,此时r0=0,所以就是把0这个数据,传送到协处理器CP15中。


而对应就是写入到“”这个“目标寄存器的协处理器寄存器”,此处CRn为C7,即将0写入到寄存器7(Register 7)中去。


而上面关于Register 7的含义中也说了,“Any data written to this location will cause the selected cache to be flushed”,即你往这个寄存器7中写入任何数据,都会导致对应的缓存被清空。而到底那个缓存被清空呢,即我们这行指令



mcr p15, 0, r0, c7, c7, 0



起了什么作用呢


那是由“两者组合决定”的。


而此处CRm为C7,opcode_2为0,而对于C7和0的组合的作用,参见上面的那个表中Register 7中的Flash I+D那一行,


当opcode_2为0,CRm为0111=7,就是我们要找的,其作用是“Flush I + D”,即清空指令缓存I Cache和数据缓存D Cache。


根据该表,同理,如果是opcode_2=0,而CRm=0101b=5,那么对应的就是去“Flush I”,即只清除指令缓存I Cache了。


而对应的指令也就是



mcr p15, 0, r0, c7, c5, 0


此注释说此行代码的作用是,清理v3或v4的缓存


其中v4,我们很好理解,因为我们此处的CPU是ARM920T的核心,是属于ARM V4的,而为何又说,也可以清除v3的cache呢?


那是因为,本身这些寄存器位域的定义,都是向下兼容的,参见上面引用的内容,也写到了:


ARM 710


Register 7 - IDC flush (write only)

Any data written to this location will cause the IDC (Instruction/Data cache) to be flushed.


即,对于ARM7的话,你写同样的这行代码



mcr p15, 0, r0, c7, c7, 0


也还是向register 7中写入了数据0,这也同样满足了其所说的“Any data written to this location”,也会产生同样的效果“cause the IDC (Instruction/Data cache) to be flushed”。


同理,可以看出此行是去操作寄存器8,而对应的各个参数为:


rd为r0=0


CRn为C8


CRm为C7


opcode_2为0


对照寄存器8的表:



Register 8 - TLB operations (write only)

Any data written to this location will cause the selected TLB flush operation.


The OPC_2 and CRm co-processor fields select which cache


operation should occur:


Function OPC_2 CRm Data


Flush I + D %0000 %0111 -


Flush I %0000 %0101 -


Flush D %0000 %0110 -


Flush D single %0001 %0110 Virtual address”


其含义为:


向寄存器8中写入数据,会导致对应的TLB被清空。具体是哪个TLB,由opcode_2和CRm组合决定,


此处opcode_2为0,CRm为7=0111b,所以对应的作用是“Flush I + D”,即清空指令和数据的TLB。

关键字:ARM  协处理器指令 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic548615.html

上一篇:s3c6410 时钟设置
下一篇:ARM体系架构—ARMv7-A协处理器

推荐阅读

ARM处理器架构----处理器的工作状态
之前,一直都在看arm的驱动开发,最近看了ucos,同时也开始对arm的架构有了更深入一点的了解。大学学微机原理的时候学的是x86的架构,它和arm还是有挺多区别的。下面就整理一些自己的所学和在网上转载的关于arm架构的内容。有一本很好的讲arm架构的书:《ARM System Developer's Guide》。从编程人员的视角来看,arm核是由数据总线连接的功能单元组成,如下图所示:数据通过数据总线流向处理器核心,这里的数据可以是将要执行的指令,也可以是数据项.上面的图是Von Neumann体系的arm核,数据项和指令共用同一总线.而哈佛结构体系的arm核就会用两个不同的总线.就像所有的RISC处理器,arm采用
发表于 2021-10-20
<font color='red'>ARM</font>处理器架构----处理器的工作状态
ARM处理器架构-----异常/中断处理
中断是我们嵌入式开发很常用到的一种资源和编程手段。这篇文章重点分析arm的中断处理流程。首先,中断是异常的一种。当发生一种异常时,处理器会进入不同的工作模式。ARM的异常和相应的模式之间的对应关系见下表:当一个异常导致模式的改变时,ARM核自动地:1、把cpsr保存到相应模式下的spsr2、把pc保存到相应模式下的lr3、设置cpsr为相应异常模式4、设置pc为相应异常处理程序的入口地址对于IRQ或者FIQ而言,还多一项变化:禁用相关的中断IRQ或FIQ,禁止同类型的其他中断被触发。(这也是自动实现的,因此正常情况下,ARM中断不可嵌套)从异常中断处理程序退出时,需要我们在程序中用软件实现下面两个操作:1、从spsr_mode中
发表于 2021-10-20
<font color='red'>ARM</font>处理器架构-----异常/中断处理
ARM处理器架构------可嵌套中断的实现
传统ARM中IRQ是作为一种系统异常出现的。对于ARM核来说,有且仅有一个称为IRQ的系统异常。而ARM对于IRQ的处理一般通过异常向量找到IRQ的中断处理程序。当进入IRQ中断处理程序之后,ARM自动屏蔽IRQ,也就是说在中断响应过程中是忽略之后到来的中断请求的。即使使用了VIC,VIC也仅仅是悬起后来的中断请求。也就是说,传统ARM的中断是不可嵌套、不可抢占的。不过,ARM给了我们一种权利,那就是在中断处理程序中可以手动打开IRQ,这样在前一个IRQ响应的过程中,就可以被后来的中断所打断。就给我们提供了一种用软件解决中断嵌套的途径。中断的过程我们都十分清楚:保护现场à响应中断à恢复现场。ARM对于每一种异常都有相应的堆栈寄存器
发表于 2021-10-20
ARM中断基础知识
一、ARM内核工作模式因为中断会设计到ARM内核工作模式的切换,所以先简要介绍一下各个模式:ARM模式的切换要设计到寄存器CPSR,下面是各个位表示的含义,CPSR[4:0]是工作模式切换控制位。T=0时是ARM指令模式,T=1时是Thumb指令模式。F=0时是允许FIQ,F=1是禁止FIQI=0时是允许IRQ,I=1是禁止IRQ在开发板刚刚启动起来的时候首先得关闭所有中断,等把开发板的硬件初始化,各种参数设置好之后就可以打开中断了。CPSR有4个8位区域:标志域(F)、状态域(S)、扩展域(X)、控制域(C)C 控制域屏蔽字节( CPSR[7:0] )X 扩展域屏蔽字节( 
发表于 2021-10-19
<font color='red'>ARM</font>中断基础知识
东芝推出TXZ+™族高级系列新款M4N组Arm® Cortex®-M4微控制器
东芝推出TXZ+™族高级系列新款M4N组Arm® Cortex®-M4微控制器对配备以太网与CAN控制器的物联网设备进行优化中国上海,2021年10月19日——东芝电子元件及存储装置株式会社(“东芝”)今日宣布,已开始量产M4N组的20款新微控制器。M4N组是TXZ+™族高级产品的新成员,采用40nm工艺制造。M4N组集成带FPU的Arm Cortex-M4内核,运行速度高达200MHz,最高可集成2MB代码闪存和32KB数据闪存,具有10万次的写入周期寿命。此外,新款微控制器还提供了丰富的接口与通信选项,例如以太网、CAN以及带集成PHY的USB 2.0 FS OTG控制器。M4N组器件适用于办公设备、楼宇和工厂自动化以及工业
发表于 2021-10-19
东芝推出TXZ+™族高级系列新款M4N组<font color='red'>Arm</font>® Cortex®-M4微控制器
阿里巴巴将发布Arm服务器芯片 采用5nm制程工艺
据最新消息称,阿里巴巴将推出用于服务器市场的Arm架构芯片,成为又一家自研服务器CPU的中国科技企业。据了解,该芯片基于Arm架构,自 2019年开始研发,并在今年年中成功流片,它采用了128核和5纳米工艺,公艺水平超过亚马逊和华为同类产品。该芯片或于近期的阿里云一年一度开发者大会——云栖大会上发布,今年的云栖大会将于 10 月 19 日至 22 日在浙江杭州召开。平头哥半导体有限公司成立于2018年9月19日,是阿里巴巴集团的全资半导体芯片业务主体。平头哥拥有端云一体全栈产品系列,涵盖数据中心人工智能芯片、处理器IP授权等,实现芯片端到端设计链路全覆盖。
发表于 2021-10-18

推荐帖子

【TI首届低功耗设计大赛】MSP430FR5969 人体心电采集实物图
本帖最后由Mandy于2015-1-211:27编辑 最近这段时间比较忙,又是画板子,又是调电路写程序,幸好这一路过来都比较顺利,板子和程序已搞定,TI低功耗设计项目即将完成,就差整理资料了 【TI首届低功耗设计大赛】MSP430FR5969人体心电采集实物图
Mandy 微控制器 MCU
嵌入式软件可靠性设计
嵌入式软件可靠性设计 大家看一下是否对你们的工作有帮助。嵌入式软件可靠性设计
andy.chang 嵌入式系统
我的LCD亮不了
我用的是449的芯片,LCD用的是20脚的LCD048,S0到S14连接到449上,另外还有5个COM端,也连接到449上,原先没有外接电阻,亮不了,现在连接了3个330K的电阻后,刚接通电的时候能量下,刚烧进程序的时候也能亮,可是之后就慢慢暗掉。程序是每问题的,在别的类似的板子上烧过。现在应该是硬件问题,请高手帮助。。。。。。我的LCD亮不了
yoyomomo 模拟与混合信号
可调直流稳压源
我弄了个可调电源电路,Proteus仿真后如图 在这个电路图基础上我希望输出电压可以通过单片机控制,于是把可调电阻去掉了,直接加电压,Proteu仿真后怎么不能得到正确的结果? 我把通过单片机控制,经D/A转换后的电压直接加上去结果和上面一样?为什么呀?怎么修改呀? 我希望电路的输入电压由200V交流电经整流得到,设计了下面的电路,仿真结果如图,是Proteus自身对模拟电路不能正确的仿真吗? 搭硬件电路的时候可以这样搭吗? 希望各位高手能指点下,谢谢!!!!!可调直流稳压源
qy08301 电源技术
LM324放大
运放用的LM324,可是当硅光电池没受到光照,测了正向输入电压为0.00,,但是在输出u0有35mV的电压,这让我很不解, LM324放大
井子92 模拟电子
请问大家如何让Eboot运行菜单模式?
Nboot和Eboot有什么区别啊?请问大家如何让Eboot运行菜单模式?
laixianzhu 嵌入式系统
小广播
何立民专栏 单片机及嵌入式宝典

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

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