【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. 怎么处理系统蓝屏后提示代码0x000000d1的错误?

    电脑开机有时会出现蓝屏,导致蓝屏的原因有很多,每种错误都有不同的代码.下面就来和大家分享一下电脑开机蓝屏出现0x000000d1错误代码是什么原因?我们又该怎么去解决这个问题. 电脑开机蓝屏出现0x0 ...

  2. Delphi WaitCommEvent函数

  3. 【异常】553 Mail from must equal authorized user

    1 详细异常打印 2019-08-12 14:54:42,178 ERROR org.apache.camel.processor.DefaultErrorHandler: Failed delive ...

  4. TCP_Wrappers访问控制

    一.TCP_Wrappers简介 对有状态连接的特定服务进行安全检测并实现访问控制,它以库文件形式实现,某进程是否接受libwrap的控制取决于发起此进程的程序在编译时是否针对libwrap进行编译的 ...

  5. @Value和@ConfigurationProperties

    1.@Value用法 https://blog.csdn.net/u010832551/article/details/73826914 2.@ConfigurationProperties用法 ht ...

  6. EL表达式接收值

  7. MySQL数据库中的索引(二)——索引的使用,最左前缀原则

    上文中,我们了解了MySQL不同引擎下索引的实现原理,在本文我们将继续探讨一下索引的使用以及优化. 创建索引可以大大提高系统的性能. 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性. ...

  8. react-native连接夜神模拟器

    配置好adb的环境变量 新建 ADB_MY_HOME C:\Users\Administrator\AppData\Local\Android\Sdk\platform-tools 然后加入path ...

  9. 医院设置x

    医院设置x   题目描述 Description 设有一棵二叉树,如下图 其中,圈中数字表示结点居民的人口.圈边上数字表示结点编号,.现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小, ...

  10. Android 内存 - 获取单个应用内存限制

    方法一: adb shell getprop | grep dalvik.vm.heapgrowthlimit [dalvik.vm.heapgrowthlimit]: [64m] 方法二: Acti ...