CP15 协处理器一般用于存储系统管理,但是在中断中也会使用到, CP15 协处理器一共有16 个 32 位寄存器(c0-c15)。 CP15 协处理器的访问通过其独特的语法指令完成,如下所示:
(move to register from controller;move to controller to register)
MRC: 将** CP15 协处理器中的寄存器数据读到 ARM 寄存器中**。
MCR: 将 ARM 寄存器的数据写入到 CP15 协处理器寄存器中
MRC 就是读 CP15 寄存器, MCR 就是写 CP15 寄存器, MCR 指令格式如下:

MCR{cond} p15, <opc1>, <Rt>, <CRn>, <CRm>, <opc2>
cond:       指令执行的条件码,如果忽略的话就表示无条件执行。
opc1:        协处理器要执行的操作码。
Rt:      ARM 源寄存器,要写入到 CP15 寄存器的数据就保存在此寄存器中。
CRn:         CP15 协处理器的目标寄存器。
CRm:         协处理器中附加的目标寄存器或者源操作数寄存器,如果不需要附加信息就将
CRm         设置为 C0,否则结果不可预测。
opc2:         可选的协处理器特定操作码,当不需要的时候要设置为 0。

MRC 的指令格式和 MCR 一样,只不过在 MRC 指令中 Rt 就是目标寄存器,也就是从CP15 指定寄存器读出来的数据会保存在 Rt 中。而 CRn 就是源寄存器,也就是要读取的写处理器寄存器。
假如我们要将 CP15 中 C0 寄存器的值读取到 R0 寄存器中,那么就可以使用如下命令:

MRC p15, 0, r0, c0, c0, 0

CP15 协处理器有 16 个 32 位寄存器, c0~c15,我们来看一下 c0、 c1、 c12 和 c15 这四个寄存器,因为我们本次做的这个GPIO中断实验要用到这四个寄存器。

1、 c0 寄存器

CP15 协处理器有 16 个 32 位寄存器, c0~c15,在使用 MRC 或者 MCR 指令访问这 16 个寄存器的时候,指令中的 CRn、 opc1、 CRm 和 opc2 通过不同的搭配,其得到的寄存器含义是不同的。比如 c0 在不同的搭配情况下含义如下图所示
在上图中当 MRC/MCR 指令中的 CRn=c0, opc1=0, CRm=c0, opc2=0 的时候就表示此时的 c0 就是 MIDR 寄存器,也就是主 ID 寄存器,这个也是 c0 的基本作用。对于 Cortex-A7内核来说, c0 作为 MDIR 寄存器的时候其含义如图
在图中各位所代表的含义如下:

bit31:24: 厂商编号, 0X41, ARM。
bit23:20:    内核架构的主版本号, ARM 内核版本一般使用 rnpn 来表示,比如 r0p1,其中r0后面的 0 就是内核架构主版本号。
bit19:16:    架构代码, 0XF, ARMv7 架构。
bit15:4: 内核版本号, 0XC07, Cortex-A7 MPCore 内核。
bit3:0:  内核架构的次版本号, rnpn 中的 pn,比如 r0p1 中 p1 后面的 1 就是次版本号。

2、 c1 寄存器

c1 寄存器同样通过不同的配置,其代表的含义也不同,如图所示:在图中当 MRC/MCR 指令中的 CRn=c1, opc1=0, CRm=c0, opc2=0 的时候就表示此时的 c1 就是 SCTLR 寄存器,也就是系统控制寄存器,这个是 c1 的基本作用。 SCTLR 寄存器主要是完成控制功能的,比如使能或者禁止 MMU、 I/D Cache 等, c1 作为 SCTLR 寄存器的时候其含义如下图所示:
SCTLR 的位比较多,我们就会用到的几个位:

bit13:    V , 中断向量表基地址选择位,为 0 的话中断向量表基地址为 0X00000000,软件可以使用 VBAR 来重映射此基地址,也就是中断向量表重定位。为 1 的话中断向量表基地址为0XFFFF0000,此基地址不能被重映射。
bit12:   I, I Cache 使能位,为 0 的话关闭 I Cache,为 1 的话使能 I Cache。
bit11:   Z,分支预测使能位,如果开启 MMU 的话,此为也会使能。
bit10:   SW, SWP 和 SWPB 使能位,当为 0 的话关闭 SWP 和 SWPB 指令,当为 1 的时候就使能 SWP 和 SWPB 指令。
bit9:3:  未使用,保留。
bit2:        C, D Cache 和缓存一致性使能位,为 0 的时候禁止 D Cache 和缓存一致性,为 1 时
使能。
bit1:        A,内存对齐检查使能位,为 0 的时候关闭内存对齐检查,为 1 的时候使能内存对齐检查。
bit0:        M, MMU 使能位,为 0 的时候禁止 MMU,为 1 的时候使能 MMU。

如果要读写 SCTLR 的话,就可以使用如下命令:

MRC p15, 0, <Rt>, c1, c0, 0 ;读取 SCTLR 寄存器,数据保存到 Rt 中。
MCR p15, 0, <Rt>, c1, c0, 0 ;将 Rt 中的数据写到 SCTLR(c1)寄存器中

3、 c12 寄存器

c12 寄存器通过不同的配置,其代表的含义也不同,如图在图当 MRC/MCR 指令中的 CRn=c12, opc1=0, CRm=c0, opc2=0 的时候就表示此时 c12 为 VBAR 寄存器,也就是向量表基地址寄存器设置中断向量表偏移的时候就需要将新的中断向量表基地址写入 VBAR 中比如在前面的例程中,代码链接的起始地址为0X87800000而中断向量表肯定要放到最前面,也就是 0X87800000 这个地址处。所以就需要设置 VBAR 为 0X87800000,设置命令如下:

ldr r0, =0X87800000 ; r0=0X87800000
MCR p15, 0, r0, c12, c0, 0 ;将 r0 里面的数据写入到 c12 中,即 c12=0X87800000

4、 c15 寄存器

c15 寄存器也可以通过不同的配置得到不同的含义,其配置如图所示:
我们需要 c15 作为 CBAR 寄存器,因为 GIC 的基地址就保存在 CBAR
,我们可以通过如下命令获取到 GIC 基地址:MRC p15, 4, r1, c15, c0, 0 ; 获取 GIC 基础地址,基地址保存在 r1 中。
获取到 GIC 基地址以后就可以设置 GIC 相关寄存器了,比如我们可以读取当前中断 ID当前中断 ID 保存在 GICC_IAR 中寄存器 GICC_IAR 属于 CPU 接口端寄存器,寄存器地址相对于 CPU 接口端起始地址的偏移为 0XC,因此获取当前中断 ID 的代码如下:

MRC p15, 4, r1, c15, c0, 0 ;获取 GIC 基地址
ADD r1, r1, #0X2000     ;GIC 基地址加 0X2000 得到 CPU 接口端寄存器起始地址
LDR r0, [r1, #0XC]   ;读取 CPU 接口端起始地址+0XC 处的寄存器值,也就是寄存器;GIC_IAR 的值

关于 CP15 协处理器就讲解到这里,简单总结一下,

  • 1.通过 c0 寄存器可以获取到处理器内核信息;
  • 2.通过 c1 寄存器可以使能或禁止 MMU、 I/D Cache 等;
  • 3.通过 c12 寄存器可以设置中断向量偏移;
  • 4.通过 c15 寄存器可以获取 GIC 基地址。

Cortex-A 系列CP15协处理器简单解析相关推荐

  1. CP15协处理器访问指令MCR/MRC解析

    ARM11协处理器从CP0到CP15, 其中CP15位系统控制协处理器.功能如下: • overall system control and configuration • cache configu ...

  2. openresty开发系列10--openresty的简单介绍及安装

    openresty开发系列10--openresty的简单介绍及安装 一.Nginx优点 十几年前,互联网没有这么火,软件外包开发,信息化建设,帮助企业做无纸化办公,收银系统,工厂erp,c/s架构偏 ...

  3. openresty开发系列2--nginx的简单安装,正向、反向代理及常用命令和信号控制介绍...

    openresty开发系列2--nginx的简单安装,正向.反向代理及常用命令和信号控制介绍 一.nginx的安装下载及编译安装 1.Nginx下载:nginx-1.13.0.tar.gz,下载到:/ ...

  4. manjaro笔记本显卡驱动_从入门到高端!AMD Radeon RX 500系列移动显卡全解析

    前言:在处理器领域,卧薪尝胆十年之久的AMD终究还是给所有玩家带来了惊喜,2017年2月推出了ZEN构架的处理器之后,相信后面的事情大家都知道了,手忙脚乱的Intel公司在不到2年的时间内连续发布了三 ...

  5. 如何使用FT2232H适配器和开源调式工具OpenOCD对ARM Cortex M7系列MCU进行SWD接口调试

    该篇幅介绍如何使用FT2232H适配器和开源调式工具OpenOCD对ARM Cortex M系列MCU进行SWD接口调试? 如何连接FT2232HL Debuger Adapter和目标板的的SWD调 ...

  6. ARMv7 CP15协处理器详解

    1协处理器指令MCR和MRC 1.1MCR指令 1.2MRC指令 2CP15的主要功能 3 CP15寄存器功能介绍如下所示: 3.1寄存器c0 3.2寄存器c1 3.3寄存器c2 3.4寄存器C3 3 ...

  7. CP15协处理器详解以及操作

    我相信对很多驱动工程师而言 对于bootloader这部分还是有很多研究的 但是我相信大部分的工程师都是简要的看下bootloader的初始化流程 对于一些具体的操作还是不懂 比如cp15协处理的操作 ...

  8. 全面了解 ARM CP15协处理器 (深度好文)

    转载自:http://blog.chinaunix.net/uid-14114479-id-3110951.html ARM926EJ-S/ARM920T 协处理器CP14, CP15详解 ARM 微 ...

  9. es6删除数组某一项_javascript基础系列:数组常用方法解析

    javascript基础系列:数组常用方法解析 今天是比较特殊的日子,我们编程人员共同的节日,1024,祝每个编程人员节日快乐! 数组是javascript必不可少的一项,今天让我们来总结一下数组操作 ...

最新文章

  1. Keras K.switch()用法
  2. 启动VIP报CRS-1028/CRS-0223致使VIP状态为UNKNOWN故障分析与解决
  3. 旧闻 - 来怀念一下Sun公司
  4. 四川阆中上演“万人同品腊八粥”
  5. 看看大神是如何计算32位数中‘1’的个数
  6. verilog幂次方_Verilog学习笔记——有符号数的乘法和加法
  7. 字符编码笔记:ASCII,Unicode和 UTF-8
  8. 没有BUGヾ( ̄▽ ̄)
  9. asp.net1002-公司人事管理信息系统#毕业设计
  10. ios dev关闭双重认证_iOS Dev Academy简短介绍(自动布局)
  11. 最近抖音上虚拟元宇宙项目-猜歌名,代码解析
  12. 【python】db.Column(db.Integer, primary_key=True, autoincrement=True)
  13. 算法教给我的人生道理-贪婪算法
  14. 证明:二阶导函数大于零时为凹函数
  15. 申请计算机助理的英语作文,高考模拟英语作文 申请暑假英语助理编辑职位
  16. E - Ricochet Robots( dfs+hash优化 )
  17. Learning Without Forgetting的pytorch实现
  18. Excel一行头尾置换
  19. Spark2.0机器学习系列之2:Logistic回归及Binary分类(二分问题)结果评估
  20. 思科认证介绍(各种证书)

热门文章

  1. 关于Django多进程多线程详解
  2. 《实战》登录表单样式一
  3. 风起“温泉关”:荣耀逆战2019的诸果之因
  4. 微信号 可以改了 !!! 真事 !!
  5. umi 兼容ie11 按照官方配置还是失败处理
  6. SuspendLayout 和 ResumeLayout
  7. 无感知抓包的几种实现方式,除了ssl pinning,app无法检测
  8. 群狼调研开展常德汽车经销商神秘顾客调查
  9. 2022-2027年中国汽油滤清器行业发展前景及投资战略咨询报告
  10. Linux命令之校验目录md5deep