首页 > 其他分享 >ARMv7-A Coprocessor概要以及读写

ARMv7-A Coprocessor概要以及读写

时间:2022-12-11 22:12:56浏览次数:66  
标签:__ Rt get 读写 ARMv7 寄存器 Coprocessor CRm

 关键词:MRC/MCR/MRRC/MCRR、CP14、CP15等等。

1. ARMv7-A Coprocessor介绍

ARMv7-A支持16个Coprocessor,分别是:(A2.9 Coprocessor support)

  • CP15-System Control。
  • CP14-Debug、The Thumb Execution Environment、Direct Java bytecode execution。
  • CP10和CP11-Floating-point和Advanced SIMD。
  • CP8/9/12/13-ARM保留。
  • CP0-7-预留厂商自定义。

Coprocessor相关指令有:(A4.10 Coprocessor instructions)

  • 发起Coprocessor数据处理操作:CDP/CDP2。
  • Core寄存器和Coprocessor寄存器之间传输:MCR/MCR2/MCRR/MCRR2/MRC/MRC2/MRRC/MRRC2。
  • 存取Coprocessor寄存器:LDC/LDC2/STC/STC2。

1.1 CP14

CP14提供Debug/Trace/Execution environment相关控制功能。

32位指令组成形式为{CRn, opc1, CRm, opc2},其中:

  • opc1==0 Debug registers.
  • opc1==1 Trace registers.
  • opc1==6 ThumbEE registers.
  • opc1==7 Jazelle registers.

1.2 CP15

CP15是System Control寄存器集合,其组成形势根据32位或64位不同。

32位组成形式为{CRn, opc1, CRm, opc2};64位组成形式为{CRm, opc1}。

 更详细参考:《B3.17 Organization of the CP15 registers in a VMSA implementation》。

1.3 CP10

1.4 CP11

2. ARMv7-A MCR/MRC/MCRR/MRRC

 MCR/MCR2将ARM Core寄存器值传递到Coprocessor,指令格式为:

MCR<c> <coproc>, <opc1>, <Rt>, <CRn>, <CRm>{, <opc2>}

coproc-协处理器名称;opc1-Coprocessor的opcode;Rt-传递数据给Coprocessor的ARM Core寄存器;CRn-Coprocessor目的寄存器;CRm-Coprocessor的补充寄存器;opc2-Coprocessor的opcode。

 

 MRC/MRC2将Coprocessor内容传递给ARM Core寄存器,指令格式为:

MRC<c> <coproc>, <opc1>, <Rt>, <CRn>, <CRm>{, <opc2>}

相对于MCR,Rt变成目的寄存器,CRn/CRm变成源寄存器。

 

MCRR/MRRC功能类似于MRC/MCR,但是ARM Core寄存器变成了两个。

指令格式如下:

MCRR<c> <coproc>, <opc1>, <Rt>, <Rt2>, <CRm>
MRRC<c> <coproc>, <opc>, <Rt>, <Rt2>, <CRm>

参考:《A8.8.99 MCR, MCR2》《A8.8.100 MCRR, MCRR2》《A8.8.108 MRC, MRC2》《A8.8.109 MRRC, MRRC2》

3. GCC下Coprocessor读写

CMSIS中定义了对Coprocessor的操作接口:

#define __get_CP(cp, op1, Rt, CRn, CRm, op2) __ASM volatile("MRC p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : "=r" (Rt) : : "memory" )
#define __set_CP(cp, op1, Rt, CRn, CRm, op2) __ASM volatile("MCR p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : : "r" (Rt) : "memory" )
#define __get_CP64(cp, op1, Rt, CRm) __ASM volatile("MRRC p" # cp ", " # op1 ", %Q0, %R0, c" # CRm  : "=r" (Rt) : : "memory" )
#define __set_CP64(cp, op1, Rt, CRm) __ASM volatile("MCRR p" # cp ", " # op1 ", %Q0, %R0, c" # CRm  : : "r" (Rt) : "memory" )

  __get_CP/__set_CP分别读取和设置32位寄存器;__get_CP64/__set_CP64分别读取和设置64位寄存器。

 使用CMSIS提供的API进行Coprocessor操作:

unsigned int cntp_ctl = __get_CNTP_CTL();
__set_CNTP_CTL(cntp_ctl);

unsigned long long cntp_cval = __get_CNTP_CVAL();
__set_CNTP_CVAL(cntp_cval);

__STATIC_FORCEINLINE void __set_CNTP_CTL(uint32_t value)
{
  __set_CP(15, 0, value, 14, 2, 1);
}

__STATIC_FORCEINLINE uint32_t __get_CNTP_CTL(void)
{
  uint32_t result;
  __get_CP(15, 0, result, 14, 2, 1);
  return result;
}

__STATIC_FORCEINLINE void __set_CNTP_CVAL(uint64_t value)
{
  __set_CP64(15, 2, value, 14);
}

__STATIC_FORCEINLINE uint64_t __get_CNTP_CVAL(void)
{
  uint64_t result;
  __get_CP64(15, 2, result, 14);
  return result;
}

 

 

得到的汇编结果如下:

 

 

 从如下图中可知,当CRn=c14, op1=0, CRm=2, op2=1时,操作的寄存器为CNTP_CTL。

 

从如下图中可知,当CRn=c14, opc1=2时,操作的寄存器为CNTP_CVAL。

 

 

 

参考文档:《ARM® Architecture Reference Manual ARMv7-A and ARMv7-R edition》、《Cortex™-A7 MPCore™ Revision: r0p5 Technical Reference Manual》。

标签:__,Rt,get,读写,ARMv7,寄存器,Coprocessor,CRm
From: https://www.cnblogs.com/arnoldlu/p/16974157.html

相关文章

  • MySQL主从复制与读写分离
    一.主从复制1.MySQL主从复制概述在企业生产中,成熟的业务通常数据量都比较大,如果读写操作都在一台mysql服务器上,那再处理高并发时压力会比较大单台的mysql再安全性,高可......
  • Mysql读写分离
    目录:1、主从复制Mysql的复制类型Mysql主从复制的工作过程2、读写分离什么是读写分离为什么要读写分离什么时候要读写分离主从复制与读写......
  • Qt:QXMLStreamReader、QXMLStreamWriter,读写XML文件实例
    1、​​ Qt:QXMLStreamReader,读XML文件实例​​2、​​Qt:QXmlStreamWriterClass写XML文件​​效果图:需求:打开对应格式的XML文件,读入到QTreewidget树中,并能将XML文......
  • C# OpenProtocol 开放以太网协议 读写数据 订阅数据
    主要使用的软件是HslCommunication关于这个软件的本身,详细可以参考下面的地址:github地址:https://github.com/dathlin/HslCommunication官网:http://www.hslcommunicatio......
  • MySQL主从复制与读写分离
    一、案例概述在企业应用中,成熟的业务通常数据量都比较大单台mysql在安全性、高可用性和高并发方面都无法满足实际的需求配置多台主从数据库服务器以实现读写分离二、案例......
  • 1.5.5 HDFS读写解析-hadoop-最全最完整的保姆级的java大数据学习资料
    目录1.5.5HDFS读写解析1.5.5.1HDFS读数据流程1.5.5.2HDFS写数据流程1.5.5HDFS读写解析1.5.5.1HDFS读数据流程客户端通过DistributedFileSystem向NameNode请求下......
  • 一文搞懂各种锁-互斥锁-自旋锁-可重入锁-读写锁-悲观锁-乐观锁-分布式锁
    原文网址:https://zhuanlan.zhihu.com/p/489305763一为什么会有锁机制1在多线程情况下共享操作同一个变量时,会导致数据不一致,出现并发安全问题,所以通过锁机制来保证数......
  • 完全参考java8的开发文档写的文件读写
    publicstaticvoidmain(String[]args)throwsIOException{Stringpath="D:\\project\\luotuo-server\\src\\test\\java\\com\\manageSystem\\project......
  • MySQL主从复制与读写分离
         一、MySQL主从复制1.1MySQL的复制类型基于SQL语句的复制(STATEMENT默认)在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语......
  • MySQL主从复制与读写分离
    一、MySQL主从复制1.1MySQL的复制类型基于SQL语句的复制(STATEMENT默认)在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比......