【R0~R15寄存器组】

Cortex-M3处理器拥有R0~R15的寄存器组,如:

【R0~R12通用寄存器】
R0~R12都是32位通用寄存器,用于数据操作。其中:

  • R0~R7为低组寄存器,所有的指令都可以访问。
  • R8~R12为高组寄存器,只有32位Thumb2指令和很少的16位Thumb指令能访问。

【R13堆栈指针SP】
Cortex-M3拥有两个堆栈指针,然而它们是banked,任一时刻只能使用其中的一个。

  • 主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理(包括中断服务)。
  • 进程堆栈指针(PSP):由用户的应用程序代码使用。

【R14连接寄存器LR】
连接寄存器LR用于在调用子程序时存储返回地址。例如,在使用BL(分支变连接,Branch and Link)指令时,就自动填充LR的值。

main            ;主程序
...
BL function1 ; 使用“分支并连接”指令调用function1
; PC=function1,并且LR=main的下一条指令地址
... function1
... ; function1的代码
BX LR ; 函数返回(如果function1要使用LR,必须使用前PUSH,
; 否则返回时程序就可能跑飞了)

ARM为了减少访问内存的次数(访问内存的操作往往需要3个以上指令周期,带MMU和cache的就更加不确定了),把返回地址直接存储在寄存器中。这样足以使很多只有1级子程序调用的代码无需访问内存(堆栈内存),从而提高了子程序调用的效率。如果多于1级,则需要把前一级的R14值压到堆栈里。
在ARM上编程时,应尽量只使用寄存器保存中间结果,迫不得已才访问内存。
在RISC处理器中,为了强调访问内存操作越过了处理器的界线,并且带来了对性能的不利影响,给它取了一个专业的术语:溅出。

【R15程序计数寄存器PC】
程序计数寄存器PC指向当前的程序地址。如果修改它的值,能改变程序的执行流。

因为Cortex-M3内部使用了指令流水线,读PC时返回的值时当前指令的地址值+4,如:

0x1000:    MOV R0, PC    ; R0 = 0x1004

如果向PC中写数据,就会引起一次程序的分支(但是不更新LR寄存器)。
Cortex-M3中的指令至少是半字(2字节)对齐的,所以PC的LSB总是读回0。然而,在分支时,无论是直接写PC的值还是使用分支指令,都必须保证加载到PC的数值是奇数(即LSB=1),用以表明这是在Thumb状态下执行。如若写了0,则视为企图转入ARM模式,Cortex-M3将产生一个fault异常。


【特殊功能寄存器组】
Cortex-M3中的特殊功能寄存器包括:

  • 程序状态寄存器组(PSRs/xPSR)
  • 中断屏蔽寄存器组(PRIMASK、FAULTMASK以及BASEPRI)
  • 控制寄存器(CONTROL)

它们只能被专用的MSR/MRS指令访问,而且它们也没有与之相关联的访问地址。如:
MRS <gp_reg>, <special_reg> ; 读特殊功能寄存器的值到通用寄存器
MSR <special_reg>, <gp_reg> ; 写通用寄存器的值到特殊功能寄存器

【程序状态寄存器PSRs/xPSR】
程序状态寄存器在其内部又被分为三个子状态寄存器:

  • 应用程序PSR(APSR):
  • 中断号PSR(IPSR):
  • 执行PSR(EPSR):

如:

xPSR:

通过MRS/MSR指令,这3个PSRs即可以单独访问,也可以组合访问(2个组合,3个组合都可以)。

当使用三合一的方式访问时,应使用名字“xPSR”或者“PSR”。

【中断屏蔽寄存器PRIMASK、FAULTMASK、BASEPRI】
中断屏蔽寄存器组(PRIMASK、FAULTMASK以及BASEPRI)用于控制“异常”的使能(enable)和除能(disable)。

  • PRIMASK:这是个只有单一比特的寄存器。当它被置1后,就关掉所有可屏蔽的异常中断,只剩下NMI和硬fault可以响应。它的缺省值为0,表示没有关中断。
  • FAULTMASK:这是个只有单一比特的寄存器。当它被置1后,只有NMI才能响应,所有其他的异常中断包括硬fault都不会响应。它的缺省值为0,表示没有关异常。
  • BASEPRI:这个寄存器最多有9位(由表达优先级的位数决定)。它定义了被屏蔽优先级的阈值。当它被设成某个值后,所有优先级号大于等于此值得中断都被关闭(优先级号越大,优先级越低)。但如果被设为0,则不关闭任何中断。它的缺省值为0。

要访问PRIMASK、FAULTMASK、BASEPRI寄存器,同样需要使用MRS/MSR指令,并且只有在特权级下,才允许访问这3个寄存器。
如:
MRS R0, BASEPRI ; 读取BASEPRI到R0中
MRS R0, FAULTMASK ; 读取FAULTMASK到R0中
MRS R0, PRIMASK ; 读取PRIMASK到R0中
MSR BASEPRI, R0 ; 写入R0到BASEPRI中
MSR FAULTMASK, R0 ;
MSR PRIMASK, R0 ;

** 只有在特权级下,才允许访问这3个寄存器 **

【控制寄存器CONTROL】
控制寄存器有两个用途,其一用于定义特权级别(CONTROL[0]),其二用于选择当前使用哪个堆栈指针(CONTROL[1])。

CONTROL[0]:

  • 0 = 特权级的线程模式
  • 1 = 用户级的线程模式

Handler模式永远都是特权级的。
CONTROL[1]:

  • 0 = 选择主堆栈指针MSP(复位后的缺省值)
  • 1 = 选择进程堆栈指针PSP

Handler模式下只允许使用MSP。

由于Handler模式下用于都是特权级的,且只允许使用MSP;可见这个寄存器主要用于“线程模式”下的设置。

在线程模式下,可设置为特权级的线程模式或非特权级的线程模式;使用MSP或使用PSP。


参考摘录:《ARM Cortex-M3权威指南.pdf》

Cortex-M3 R0~R15寄存器组 & 特殊功能寄存器组的更多相关文章

  1. 寄存器、特殊功能寄存器和ram之间的区别联系

    存储器在CPU外,一般指硬盘,U盘等可以在切断电源后保存资料的设备,容量一般比较大,缺点是读写速度都很慢,普通的机械硬盘读写速度一般是50MB/S左右. 内存和寄存器就是为了解决存储器读写速度慢而产生 ...

  2. STM32学习之路入门篇之指令集及cortex——m3的存储系统

    STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码        操作数1, 操作数2,... ...

  3. 汇编指令-MRS(读)和MSR(写)指令操作CPSR寄存器和SPSR寄存器使用(1)

    1.MSR和MRS指令介绍 MRS 指令:  对状态寄存器CPSR和SPSR进行读操作.通过读CPSR可以获得当前处理器的工作状态.读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有 ...

  4. MCS-51系列特殊功能寄存器(摘录)

    MCS-51系列特殊功能寄存器(80H~FFH) 1. P0 (80H) P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 2.SP 栈指针(81H) 3.DPTR 数据 ...

  5. MCS-51特殊功能寄存器(SPR)的C51定义

    MCS - 51单片机中,除了程序计数器PC和4组工作寄存器组外,其它所有的寄存器均为特殊功能寄存器(SFR),分散在片内RAM区的高128字节中,地址范围为80H~0FFH.SFR中有11个寄存器具 ...

  6. stm32 中库函数、结构体、地址的强制类型转换、相应特殊功能寄存器之间的关系

    以一个挂接在APB2上的外设函数使能为例 A : RCC_APB2PeriphClockCmd():时钟使能函数 1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFI ...

  7. stm32和cortex M3学习内核简单总结

    1.stm32综述 2.寄存器组 3.操作模式和特权级别 4.存储器映射 5.中断和异常 6.其他 Stm32综述 这可以说是我第一款认真学习的单片机了,学完这个就要开启我通往arm9的大门了,接下来 ...

  8. 【freertos】002-posix模拟器设计与cortex m3异常处理

    目录 前言 posix 标准接口层设计 模拟器的系统心跳 模拟器的task底层实质 模拟器的任务切换原理 cortex M3/M4异常处理 双堆栈指针 双操作模式 栈帧 EXC_RETURN 前言 如 ...

  9. ARM Cortex M3系列GPIO口介绍(工作方式探讨)

    一.Cortex M3的GPIO口特性    在介绍GPIO口功能前,有必要先说明一下M3的结构框图,这样能够更好理解总线结构和GPIO所处的位置. Cortex M3结构框图     从图中可以看出 ...

随机推荐

  1. php--常见算法2

    <?php function zhi($number){ $f1=1; $f2=1; for($i=3;$i<=$number;$i++){ //前一个的前一个值+前一个值 $f3=$f1 ...

  2. kubernetes资源清单之pod

    什么是pod? Pod是一组一个或多个容器(例如Docker容器),具有共享的存储/网络,以及有关如何运行这些容器的规范. Pod的内容始终位于同一地点,并在同一时间安排,并在共享上下文中运行. Po ...

  3. Ansible简单介绍(一)

    一 :ansible简单介绍 此名取自 Ansible 作者最喜爱的<安德的游戏> 小说,而这部小说更被后人改编成电影 -<战争游戏>. 官网地址:https://www.an ...

  4. Android异常与性能优化相关面试问题-冷启动优化面试问题详解

    什么是冷启动: 冷启动的定义:冷启动就是在启动应用前,系统中没有该应用的任何进程信息.实际也就是要执行Application.onCreate()方法的那次启动. 冷启动 / 热启动的区别:热启动:用 ...

  5. TCP的ACK原理和延迟确认机制

    某天晚上睡觉前突然想到 tcp的ACK确认是单独发的还是和报文一起发的,下面看一下别人的解答 一.ACK定义TCP协议中,接收方成功接收到数据后,会回复一个ACK数据包,表示已经确认接收到ACK确认号 ...

  6. sscanf功能详解(转)

    在处理字符串的程序当中,经常会分析字符串,从一大长串的字符串截取我们需要的数据,这如果通过自己手写函数来分析,虽然可以,但当你知道sscanf的功能,那就自己写函数分析就显得多此一举. 这些函数的使用 ...

  7. BZOJ 2152 / Luogu P2634 [国家集训队]聪聪可可 (点分治/树形DP)

    题意 一棵树,给定边权,求满足两点之间的路径上权值和为3的倍数的点对数量. 分析 点分治板题,对每个重心求子树下面的到根的距离模3分别为0,1,2的点的个数就行了. O(3nlogn)O(3nlogn ...

  8. Centos7搭建CDH6.0.1(单机版)

    一.前言. 学习大数据组件,最好的方式是直接参照官网.不过官网的教程也让我吃了一坑,在此记录一下.因在个人笔记本资源有限,在此安装为单机版安装 二.搭建. 1.1配置主机名 hostnamectl s ...

  9. js设置日期格式

    取数据时后台返回的日期数据是一串数字,前台显示时需要将时间格式化,通过以下代码转换. var format = function(time, format){    var t = new Date( ...

  10. Program Transformation Semantics (程序转换语义学)

    本文是Inside The C++ Object Model Chapter 2 部分的读书笔记.讨论编译器调用拷贝构造函数时的策略(如何优化以提高效率),侯捷称之为"程序转化的语义学&qu ...