Cortex-M3 R0~R15寄存器组 & 特殊功能寄存器组
【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寄存器组 & 特殊功能寄存器组的更多相关文章
- 寄存器、特殊功能寄存器和ram之间的区别联系
存储器在CPU外,一般指硬盘,U盘等可以在切断电源后保存资料的设备,容量一般比较大,缺点是读写速度都很慢,普通的机械硬盘读写速度一般是50MB/S左右. 内存和寄存器就是为了解决存储器读写速度慢而产生 ...
- STM32学习之路入门篇之指令集及cortex——m3的存储系统
STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码 操作数1, 操作数2,... ...
- 汇编指令-MRS(读)和MSR(写)指令操作CPSR寄存器和SPSR寄存器使用(1)
1.MSR和MRS指令介绍 MRS 指令: 对状态寄存器CPSR和SPSR进行读操作.通过读CPSR可以获得当前处理器的工作状态.读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有 ...
- 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 数据 ...
- MCS-51特殊功能寄存器(SPR)的C51定义
MCS - 51单片机中,除了程序计数器PC和4组工作寄存器组外,其它所有的寄存器均为特殊功能寄存器(SFR),分散在片内RAM区的高128字节中,地址范围为80H~0FFH.SFR中有11个寄存器具 ...
- stm32 中库函数、结构体、地址的强制类型转换、相应特殊功能寄存器之间的关系
以一个挂接在APB2上的外设函数使能为例 A : RCC_APB2PeriphClockCmd():时钟使能函数 1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFI ...
- stm32和cortex M3学习内核简单总结
1.stm32综述 2.寄存器组 3.操作模式和特权级别 4.存储器映射 5.中断和异常 6.其他 Stm32综述 这可以说是我第一款认真学习的单片机了,学完这个就要开启我通往arm9的大门了,接下来 ...
- 【freertos】002-posix模拟器设计与cortex m3异常处理
目录 前言 posix 标准接口层设计 模拟器的系统心跳 模拟器的task底层实质 模拟器的任务切换原理 cortex M3/M4异常处理 双堆栈指针 双操作模式 栈帧 EXC_RETURN 前言 如 ...
- ARM Cortex M3系列GPIO口介绍(工作方式探讨)
一.Cortex M3的GPIO口特性 在介绍GPIO口功能前,有必要先说明一下M3的结构框图,这样能够更好理解总线结构和GPIO所处的位置. Cortex M3结构框图 从图中可以看出 ...
随机推荐
- 【异常】lockfile.AlreadyLocked: ~/airflow/airflow-scheduler.pid is already locked
1 完整异常信息 File "/usr/bin/airflow", line 32, in <module> args.func(args) File "/u ...
- 第八章· MySQL日志管理
一.MySQL日志简介  二.错误日志 1.作用: 记录mysql数据库的一般状态信息及报错信息,是我们对于数据库常规报错处理的常用日志. 2.默认位置: $MYSQL_HOME/data/ 3.开 ...
- resultMap自定义映射---8.3.1. 解决列名(表中的字段名称)和实体类中的属性名不一致
1.1.1.1. 步骤一:将驼峰匹配注释掉 --------------测试完成后仍然 回来开启 其他地方可能用到 一旦注释掉驼峰匹配,那么再通过queryUserById查询的结果中,用 ...
- IPC之msg.c源码解读
// SPDX-License-Identifier: GPL-2.0 /* * linux/ipc/msg.c * Copyright (C) 1992 Krishna Balasubramania ...
- 建立一个能持续处理的C/S网络程序
程序流程图: 代码演示: 服务器端: #include<WinSock2.h> #include<Windows.h> #include<stdio.h> #inc ...
- jsfuck-原理
jsfuck真的fuck,第一眼就是WTF?? Example The following source will do an alert(1): [][(![]+[])[+[]]+([![]]+[] ...
- String成员函数
string类提供的各种操作函数大致分为八类:构造器和析构器,大小和容量,元素存取,字符串比较,字符串修改,字符串接合,I/O操作以及搜索和查找. 函数名称 功能 构造函数 产生或复制字符串 析构函数 ...
- VMware中linux虚拟机无法全屏显示的解决方法(1080P分辨率调节)
安装了linux(这里以Ubuntu为例)后,发现无法全屏,如下图 即使在设置里面也找不到适合我的显示器的分辨率(我的显示器为1080P) 网上很多人都说是因为没装显卡驱动,其实不是这样的.要解决这个 ...
- Js之DateFormat工具类
/** * 对Date的扩展,将Date转化为指定格式的String * 年(y).季度(q).月(M).日(d).小时(h).分(m).秒(s)可以用1-2个占位符 * 示例: * FormatDa ...
- input框输入手机号码分隔显示
在input框输入手机号码时,自动加入空格按照3,4,4位显示,如: 实现方法如下: <label>手机号码</label><input type="text& ...