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结构框图 从图中可以看出 ...
随机推荐
- Troubleshooting: Cannot Run on an Android Device
同事在他的开发环境中,在IDE中直接在手机上运行Android项目,结果出现这个错误,无法在手机上安装. 产生这个问题的原因,一般就是签名不对,这种情况,删除手机上装过的同名应用,就可以解决.当然,你 ...
- 【5】Zookeeper的ZAB协议
一.ZAB协议(原子消息广播协议) ZAB(Zookeeper Atomic Broadcast)协议是Zookeeper用来保证其数据一致性的核心算法,是一种支持崩溃恢复的原子广播协议.基于此协 ...
- 关于同一台服务器上两个PHP项目相互访问超时的问题
当一台服务器部署多个PHP项目,各自运行时并无干扰, 即使都使用 9000端口来跑php 但是有一种情况,当其中一个项目需要调用另一个php项目的接口时,便会超时,这是因为php是单线程的同步的 也许 ...
- Delphi CloseHandle函数
- vlan linux内核数据流程
转:http://blog.sina.com.cn/s/blog_62bbc49c0100fs0n.html 一.前言 前几天做协议划分vlan的时候看了一些linux内核,了解不深,整理了下vlan ...
- ubuntu安装软件apt-get
一. apt-get用法 apt 0.8.16~exp12ubuntu10.26 for i386 compiled on Aug 5 2015 19:06:21Usage: apt-get [op ...
- Linux安装apidoc
一.安装apidoc所需环境(nodejs) 1. 查看系统是32位还是64位 uname -r 可以看出我这台linux的是64位的 2. 到node官网下载node的包并上传linux https ...
- QTP(1)
一.概念 1.什么是软件测试? 使用人工或者自动手段来运行或者测试某个软件的过程,其目的在于检验程序是否满足需求规格说明书或者弄清实际结果与预期结果之间的差异. (1)软件(程序+文档+数据)测试 ( ...
- Sereja and Brackets CodeForces - 380C (树状数组+离线)
Sereja and Brackets 题目链接: CodeForces - 380C Sereja has a bracket sequence s1, s2, ..., *s**n, or, in ...
- Summer training #5
B:分析序列 构造树(优先队列) #include <bits/stdc++.h> #include <cstring> #include <iostream> # ...