ARM基础(1):Cortex-M3的核心寄存器和特殊寄存器

news2024/12/24 20:17:05

Cortex-M3处理器的寄存器包括R0~R15和一些特殊的寄存器。其中R0到R12是通用寄存器,但是一些16位的Thumb指令只能访问R0到R7(低寄存器),而32位的Thumb-2指令则可以访问所有这些寄存器。特殊寄存器只能通过特殊访问指令访问。

文章目录

  • 1 核心寄存器
    • 1.1 R13(Stack Pointer):MSP和PSP
    • 1.2 R14(Link Register)
    • 1.3 R15(Program Counter)
  • 2 特殊寄存器
    • 2.1 Program Status Register
    • 2.2 PRIMASK, FAULTMASK, and BASEPRI Registers
    • 2.3 Control Register

所有的寄存器如下图所示:
在这里插入图片描述

1 核心寄存器

AAPCS(ARM Architecture Procedure Calling Standard)定义的寄存器如下:

寄存器别名描述
r15PCProgram Counter(Current Instruction)
r14LRLink Register(Return Address)
r13SPStack Pointer
r12IPIntra-Procedure-call scratch register
r11v8Variable-register 8
r10v7Variable-register 7
r9v6,SB,TRVariable-register 6 or Platform Register
r8~r4v5~v1Variable-register 5 ~ Variable-register 1
r3~r0a4~a1Argument/scratch register 4 ~ Argument/scratch register 1

这里主要介绍R13~R15寄存器

1.1 R13(Stack Pointer):MSP和PSP

R13是堆栈指针,在CM3中,有两个独立的堆栈内存,用户只能访问当前的堆栈,如果要访问另一个需要用特殊寄存器的MRSMSR指令来进行操作。两种堆栈分别为:

  • MSP(Main Stack Pointer):默认的SP,用在操作系统内核、异常处理函数和所有需要优先权限的访问
  • PSP(Process Stack Pointer):通常由运行嵌入式操作系统的系统中的线程进程使用(不处于异常处理程序中时)

并不是两个堆栈都必须同时使用,对于简单的应用来说,只需要用到MSP。对于堆栈的访问需要用PUSHPOP指令。

PUSH {R0} ; R13=R13-4, then Memory[R13] = R0
POP {R0}  ; R0 = Memory[R13], then R13 = R13 + 4

PUSHPOP通常用于在子例程开始时将寄存器内容保存到堆栈内存中,然后在子例程结束时从堆栈中恢复寄存器。

subroutine_1
	PUSH {R0-R7, R12, R14} ; Save registers
	...                    ; Do your processing
	POP {R0-R7, R12, R14}  ; Restore registers
	BX R14                 ; Return to calling function

因为寄存器PUSHPOP操作总是按字对齐的(地址必须是0x0,
0x4, 0x8,…),故SP/R13的低两位被硬件拉低,读取它将总是为0。

1.2 R14(Link Register)

LR用于在调用函数时,保存它下一条指令的PC。

main ; Main program
...
BL function1    ; Call function1 using Branch with Link instruction.
				; PC = function1 and
				; LR = the next instruction in main
...
function1
... 			; Program code for function 1
BX LR 			; Return

尽管PC的第0位总是为0(指令是按字或半字对齐的),但LR寄存器的第0位是可读写的,这是因为在Thumb指令集中,第0位用来指示ARM/Thumb状态。为了允许Thumb-2的程序能在其它支持Thumb-2的ARM处理器中运行,所以LSB是可读写的。

1.3 R15(Program Counter)

由于Cortex-M3处理器的流水线特性,当读取PC时,该值与此时正在执行指令的地址通常会相差4。例如:

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

其他的指令,比如load指令,由于地址计算中的对齐,PC的有效值可能不是指令地址加4。但是在执行过程中,PC值仍然比指令地址提前至少2个字节。

直接向PC写入数值将触发一个跳转指令,但是LR寄存器不会更新。但无论是直接向PC写入值还是使用B/BL/BX等跳转指令,目标地址的LSB都应该设置为1,表示这是一个Thumb state操作。如果为0,尝试切换到ARM state则会触发异常。

2 特殊寄存器

Cortex-M3中的特殊寄存器如下:

  • Program Status registers (PSRs)
  • Interrupt Mask registers (PRIMASK, FAULTMASK, and BASEPRI)
  • Control register (CONTROL)

特殊寄存器只能通过MSRMRS指令访问,它们没有内存地址:

MRS <reg>, <special_reg>  ; Read special register
MSR <special_reg>, <reg>  ; write to special register

2.1 Program Status Register

程序状态寄存器PSRs被分为三个状态寄存器:

  • Application Program Status register (APSR)
  • Interrupt Program Status register (IPSR)
  • Execution Program Status register (EPSR)

这三个寄存器可以被同时访问,使用xPSR关键字表示这三个寄存器。下图所示为寄存器中具体的字段,还有ARM和ARM7 TDMI中xPSR的对比:
在这里插入图片描述

这些位的定义如下所示:

BitDecription
NNegative
ZZero
CCarry/borrow
VOverflow
QSticky saturation flag
ICI/ITInterrupt-Continuable Instruction (ICI) bits, IF-THEN instruction status bit
TThumb state, always 1; trying to clear this bit will cause a fault exception
Exception numberIndicates which exception the processor is handling

其中APSR是可读写的,而IPSREPSR是只读的。

MRS r0, APSR   ; Read Flag state into R0
MRS r0, IPSR   ; Read Exception/Interrupt state
MRS r0, EPSR   ; Read Execution state
MSR APSR, r0   ; Write Flag state

MRS r0, PSR    ; Read the combined program status word
MSR PSR, r0    ; Write combined program state word

2.2 PRIMASK, FAULTMASK, and BASEPRI Registers

PRIMASKFAULTMASKBASEPRI用来关闭异常。

Register NameDescription
PRIMASK仅1位。当为1时,表示允许NMIHard fault异常,而其它所有的中断和异常都会被屏蔽。默认值为0。
FAULTMASK仅1位。当为1时,表示仅允许NMI异常,其它所有中断和错误处理异常都会被屏蔽。默认值为0。
BASEPRI最多8位(取决于芯片应用的优先级位数)。它表示屏蔽优先级的等级,它将屏蔽所有比该优先级相同和更低的中断。默认值为0。
  • PRIMASKBASEPRI寄存器对于在对实时要求高的任务中,用来临时禁用中断非常有用
  • 而当任务崩溃时,可能会发生许多不同的错误,操作系统可以使用FAULTMASK临时禁用异常错误处理程序,这样在内核开始清理这些错误时,不会被其它错误所中断。因此,FAULTMASK为OS内核提供了处理错误条件的时间。

为了访问这些寄存器,芯片厂商CMSIS一般会在设备的驱动库中提供相应的C函数API:

x = __get_BASEPRI();   // Read BASEPRI register
x = __get_PRIMARK();   // Read PRIMASK register
x = __get_FAULTMASK(); // Read FAULTMASK register
__set_BASEPRI(x);      // Set new value for BASEPRI
__set_PRIMASK(x);      // Set new value for PRIMASK
__set_FAULTMASK(x);    // Set new value for FAULTMASK
__disable_irq();       // Clear PRIMASK, enable IRQ
__enable_irq();        // Set PRIMASK, disable IRQ

__get_BASEPRI()为例,其实现为:

__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void)
{
  uint32_t result;

  __ASM volatile ("MRS %0, basepri" : "=r" (result) );
  return(result);
}

当然在汇编中,我们可以直接通过MRSMSR来访问:

MRS r0, BASEPRI    ; Read BASEPRI register into R0
MRS r0, PRIMASK    ; Read PRIMASK register into R0
MRS r0, FAULTMASK  ; Read FAULTMASK register into R0
MSR BASEPRI, r0    ; Write R0 into BASEPRI register
MSR PRIMASK, r0    ; Write R0 into PRIMASK register
MSR FAULTMASK, r0  ; Write R0 into FAULTMASK register

注意,这三个寄存器不能再user mode下被更改。

2.3 Control Register

控制寄存器用于定义privilege levelSP的选择。我们暂时关注该寄存器的低2位:

BitFunction
1Stack status
1 = Alternate stack is used
0 = Default stack(MSP) is used
thread mode下,Alternate stack为PSP,在handler mode下没有Alternate stack,该位必须设置为0
00 = Privileged in thread mode
1 = User state in thread mode
handler mode下,总是处于privilege mode

对于bit0来说,只有当内核处于thread mode并具有privilege时,该位才可写。在user statehandler mode下,不允许写入此位。除了写入这个寄存器之外,改变这个位的另一种方法是在异常返回时改变LR的第2位。

  • user state切换回privilege state的唯一方法是触发中断并在异常处理程序中更改此状态。

同样的,CMSIS提供了C函数来访问这个寄存器,当然我们也可以使用汇编来访问。

x = __get_CONTROL(); // Read the current value of CONTROL
__set_CONTROL(x);    // Set the CONTROL value to x
MRS r0, CONTROL      ; Read CONTROL register into R0
MSR CONTROL, r0      ; Write R0 into CONTROL register

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛客网刷题【BC33、BC56、BC44、BC91、BC49、写函数求最大值】

目录 一、BC33 计算平均成绩 二、BC56 线段图案 三、BC44 判断整数奇偶型 四、BC91 成绩输入输出问题 五、BC49 判断两个数的大小关系 六、写函数&#xff0c;求最大值 一、BC33 计算平均成绩 #include <stdio.h>int main() {double score0;double sum0;int i…

VK1088B 22*4点 LCD液晶显示屏驱动IC,4*4MM超小体积,具省电模式,多用于超小型LCD段码屏显示驱动,FAE技术支持

产品品牌&#xff1a;永嘉微电/VINKA 产品型号&#xff1a;VK1088B 封装形式&#xff1a;QFN32&#xff08;4MM*4MM&#xff09; 概述&#xff1a; VK1088B是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大88点&#xff08;22SEGx4COM&#xff09;的LCD屏&#xff0c;也…

osgEarth示例分析——osgearth_featurequery

前言 osgearth_featurequery示例&#xff0c;分析了如何拾取地球上的特征&#xff0c;并对特征信息进行提取与显示。 执行命令&#xff1a;osgearth_featurequeryd.exe earth_image\china-simple.earth 需要注意的是&#xff1a;earth文件&#xff0c;必须有特征内容。否则无…

tkinter制做一个音乐下载小软件,多种音乐免费听

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 平常我们下载的歌曲&#xff0c;都是各种妖魔鬼怪的格式横行~ 想下载下来用一下都不行&#xff0c;还只能在它的播放器内听&#xff0c;这谁受得了~ 学Python是用来干嘛的&#xff1f; 当然是解…

929903-87-7,Ac-Arg-Leu-Arg-MCA

Ac-RLR-AMC, fluorogenic substrate for assaying the trypsin-like activity of purified proteasomes (Km 78 μM). Ac-RLR-AMC&#xff0c;荧光底物&#xff0c;用于测定纯化蛋白酶体的胰蛋白酶样活性(Km 78 μM)。 多肽荧光标记由于没有放射性&#xff0c;实验操作简单。…

高通平台开发系列讲解(AI篇)如何让MTCNN运行在SNPE

文章目录 一、使用到的工具二、环境配置2.1、Snpe的环境配置2.2、opencv的环境配置2.3、caffe的环境配置三、MTCNN网络组成四、基于SNPE运行MTCNN沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要介绍如何使用高通平台SNPE运行MTCNN。 一、使用到的工具 Ubunt…

MNN简介

一、轻量级高性能推理引擎 1.简介 MNN 是一个高效、轻量的深度学习框架。它支持深度模型推理与训练&#xff0c;尤其在端侧的推理与训练性能在业界处于领先地位。目前&#xff0c;MNN 已经在阿里巴巴的手机淘宝、手机天猫、优酷、钉钉、闲鱼等 20 多个 App 中使用&#xff0…

Vue/JS中定时器模拟随机指定范围、位数的小数并更新innerHTML以及页面被销毁时监听事件中销毁定时器

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_霸道流氓气质的博客-CSDN博客_前后端分离项目本地运行 Vue页面上某个弹窗内容是innerHTML动态拼接。 系统演示时需构造模拟数据&#xff0c;模拟出数…

CAXA 3D 实体设计2023 软件下载+补丁+安装教程

CAXA 3D 实体设计2023 软件下载补丁安装教程 软件下载链接&#xff1a;https://pan.baidu.com/s/1KQFTfBg1uim5AGmhryN7_A?pwdnopn 提取码&#xff1a;nopn CAXA 3D实体设计2023新增功能 1.3D曲线支持参数化约束 通过添加尺寸约束和几何约束实现对三维曲线的参数化驱动&…

基于java(ssm)人事考勤签到管理系统源码(java毕业设计)

基于java&#xff08;ssm&#xff09;人事考勤签到管理系统 人事考勤签到管理系统是基于java编程语言&#xff0c;mysql数据库&#xff0c;ssm框架&#xff0c;idea工具开发&#xff0c;本系统分为员工&#xff0c;部门经理&#xff0c;管理员三个角色&#xff0c;员工可以登陆…

超详细!旗舰SoC RK3588参数介绍-飞凌嵌入式

OK3568-C开发板RK3588是瑞芯微旗下最新的8K旗舰SoC芯片&#xff0c;采用ARM架构&#xff0c;主要用于PC、边缘计算设备、个人移动互联网设备和其他数字多媒体应用。 RK3588集成了四核Cortex-A76和四核Cortex-A55&#xff0c;以及单独的NEON协处理器&#xff0c;支持8K视频编解码…

图像处理基础知识

图像处理基础 自己学习整理的图像处理知识 视觉基本概念和直方图基本概念 文章目录图像处理基础基本概念视觉人类视觉概念人类视觉的特性机器视觉概念图像的感知直方图直方图的定义直方图的性质直方图的应用基本概念 视觉 人类视觉概念 人类视觉的特性 多义性 同一张图像可…

[附源码]Python计算机毕业设计Django项目管理系统的专家评审模块

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

5.32 综合案例2.0 - TTS语音云播报(支持M320开发板)

HaaS506 - TTS语音云播报简介准备硬件接口代码流程功能实现1、物联网平台开发2、设备端开发代码调试3.应用平台开发3.1新建‘普通项目’3.2关联产品和设备3.3新建移动应用简介 手机端发送文字&#xff0c;开发板发出对应语音信息。 本案例需要使用到阿里云平台连接网络。通过…

【TSP问题】基于遗传算法求解固定的开放式不返回多旅行推销员问题(M-TSP)附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

基于django+sqlite3的新闻网站管理系统源代码,含数据库文件

基于djangosqlite3的新闻网站管理系统源代码&#xff0c;含数据库文件 程序部署方法 1、安装程序依赖&#xff1b; 2、 manage.py migrate #初始化数据库&#xff1b; 3、 manage.py createsuperuser创建管理员&#xff1b; 4、manage.py runserver启动程序 完整程序下载地址&…

编程内功心法「底层原理系列」 底层架构原理,分析CPU处理器鲜为人知的那些秘密

前提概要 所谓&#xff0c;知彼知己百战不殆&#xff0c;针对于计算机的优化技术来讲&#xff0c;最底层也不过是针对于CPU技术的优化了&#xff0c;但是如果要区优化程序&#xff0c;涉及到CPU的执行能力&#xff0c;那必须要了解CPU的原理和概念以及执行过程等概念&#xff0…

html网页设计大学生作业成品——公益校园网站设计与实现(HTML+CSS+JavaScript)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

1.Spring概述(Spring官方文档总结)

目录 1.1jdk环境依赖 1.2 Spring介绍 1.3 Spring历史 1.4 设计理念 1.1 jdk环境依赖 从Spring Framework 5.1开始&#xff0c;Spring需要JDK 8 (Java SE 8)&#xff0c;并提供对JDK 11 LTS的开箱即用支持。建议将Java SE 8 update 60作为Java 8的最低补丁版本&#xff0c;但…

由于找不到qt5core.dll,无法继续执行代码的问题

由于找不到qt5core.dll,无法继续执行代码的问题处理&#xff0c;其实和平常的dll缺失处理方法是差不多的 一. 下载qt5core.dll文件来解决 1.在百度搜索qt5core.dll这个dll文件&#xff0c;并且下载到自己的电脑 2.或者是直接在别人的电脑找qt5core.dll&#xff0c;然后拷贝到…