ARM的37个寄存器和异常处理机制详解

2023-10-27

1.ARM的37个寄存器

在这里插入图片描述

ARM的37个寄存器中,30个寄存器是“通用”,1个固定用作PC(程序控制寄存器),一个固定用作CPSR(程序状态寄存器),5个固定用作5种异常模式下的SPSR(程序状态保存寄存器),特别注意user模式和sys模式共用寄存器集。上面的37个寄存器不是同时可见的,只有在特定模式下才能访问某些寄存器。例如sp和lr寄存器各有6个,但是只有在相应模式下才能访问相应的寄存器,在user模式下访问的是user的sp和lr,FIQ模式下访问的是FIQ的sp和lr,这叫做影子寄存器。模式切换时寄存器会自动切换,其中用r13作sp,用r14作lr并不是一定的,用其他的寄存器作sp和lr也是可以的,只是大家约定俗成的用r13和r14来作sp和lr。其中比较特殊的是FIQ模式(快速中断模式),只有FIQ模式有单独的r8—r12寄存器,其他模式都是共用的r8—r12寄存器,这样做的原因是实现快速中断,因为有自己特有的寄存器,切换模式时保护现场和恢复现场都比较快。每个异常模式都有自己的lr寄存器和SPSR寄存器,主要是为了模式切换时的保护、恢复现场,有独立的sp寄存器是为了各个模式间的栈空间独立,彼此互不影响,不会因为一个模式有问题就导致系统崩溃。

1.1重要寄存器介绍:

1.1.1 CPSR寄存器:

在这里插入图片描述

CPSR中各个bit位表明了CPU的某些状态信息,譬如bleq指令中的eq就和CPSR中的Z标志位有关;CPSR中的I、F位和开中断、关中断有关;CPSR中的mode位(bit4~bit0共5位)决定了CPU的工作模式,在uboot代码中会使用汇编进行设置。

1.1.2 SPSR、lr、PC寄存器:

SPSR是切换模式时用来保存CPSR寄存器的,PC寄存器里是下一条要执行指令的地址,lr寄存器是切换模式时保存pc寄存器的。程序大部分时间运行在user和sys模式下,当有中断产生时,会切换成相应的中断模式,此时需要将CPSR保存到相应中断模式的SPSR中,将pc寄存器的值保存到lr寄存器中,设置PC为相应的异常向量;当从中断返回时,再将SPSR寄存器写到CPSR寄存器,将lr寄存器的值写到PC寄存器中,完成恢复现场,继续之前的代码执行。

2. 异常处理机制:

在这里插入图片描述

异常向量表是硬件提供的一种机制,在CPU设计时就定好了,当发生中断时就会将对应异常向量的值加载到PC中,去执行中断处理函数,我们需要编写的就是中断处理函数,并把中断处理函数的地址放到异常向量表中。上图中的是异常处理的介绍,包括了保护现场和恢复现场。异常向量表中,每个向量里保存的是中断处理程序的地址,从图中可以看出,每个向量占4个字节,不可能保存下整个中断处理函数,但是可以保存中断处理程序的地址,当中断发生时,硬件会把把地址加载到PC中,完成跳转。这里是一级向量表,有的还有二级向量表,处理思路和一级向量表是一致的,会有二级向量表的原因主要是中断类型太多,一级向量表表示不下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARM的37个寄存器和异常处理机制详解 的相关文章

随机推荐

  • 星图按转化线索回传对接思路与示例

    一 什么是星图 二 什么是线索转化 三 对接中的一些疑问 四 如何对接开发 五 星图侧如何联调测试 一 什么是星图 抖音星图是抖音电商蓝图下 为品牌方 MCN公司和明星 达人服务并收取分成 在这可以实现订单接收 签约管理 项目汇总 数据查看
  • 数值模拟使用matlab实现案例

    好的 我来为您讲解如何使用MATLAB来进行数值模拟 首先 您需要安装并打开MATLAB软件 然后 您可以在MATLAB的命令窗口中输入您要模拟的数学方程 并使用MATLAB的内置函数和符号进行运算 例如 如果您想对于y x 2进行模拟 您
  • 探索图像处理的利器——OpenCV

    目录 引言 一 OpenCV简介 二 OpenCV的特点 三 OpenCV的应用领域 四 实际案例 结论 引言 在当今信息化的时代 图像处理已经成为了日常生活中不可或缺的一部分 从社交媒体滤镜到自动驾驶系统 图像处理技术的广泛应用正在改变着
  • OpenCV+Mediapipe手势动作捕捉与Unity引擎的结合

    OpenCV Mediapipe手势动作捕捉与Unity引擎的结合 前言 Demo演示 认识Mediapipe 项目环境 手势动作捕捉部分 实时动作捕捉 核心代码 完整代码 Hands py py代码效果 Unity 部分 建模 Unity
  • C语言编程技巧 --- C语言中左移右移与乘除法的比较

    C语言中右移与除法的比较 最近在做项目的时候 遇到了一个有趣的现象 那就是 对于除2的整数次幂的操作而言 为了加快计算速度 一般情况下 会用右移 gt gt 来替代除法 但实际上 在VS中 右移等价于matlab中的floor 地板 操作
  • 登录认证功能的统一拦截技术(过滤器)

    目录 1 前言 2 过滤器 1 说明 2 使用步骤 3 说明示例 4 具体示例 5 过滤器详细说明 3 登录校验的过滤器实现 1 实现流程 2 具体实现 1 前言 前端发起请求 每次都会在请求头中携带JWT令牌到服务端 而服务端需要统一拦截
  • JSON.PARSE() 出现UNEXPECTED END OF JSON INPUT原因是什么怎么解决

    原因 打印出来的数据当中为判断题时数据是空的 当使用JSON parse字符串转数组时 如果里面数据有空 那么就会报错 做一个判断就好了 有才取值 if value var fileList JSON parse value else va
  • zTree 树插件实现全国五级地区点击后加载

    在项目功能中需要录入户籍地和现居住地 为减少用户输入量 将使用树插件选择全国五级地区 输入框输入详细地址 这里优先使用了zTree树插件 为了以后使用学习 在这里进行相关记录 当然在实现过程中参考各大神的文章是必不可少的 可以结合了自己的实
  • RS485利用地址主动仲裁驱动

    源码下载 MAX485 主动竞争驱动 rar C文档类资源 CSDN下载 引入背景 最近在工作中使用了RS485协议 之前虽然知道怎么用 但是实际应用到工程上还是第一次 在使用过程中就涉及到RS485总线的一些架构问题 我们都知道 RS48
  • [carla]关于odometry坐标中的角度坐标系 以及 到地图的映射问题

    1 获取车辆的Odometry原始信息 在carla中 通过订阅 carla ego vecle odometry 可以查看车辆的全局位置信息 例如 gt header seq 118872 stamp secs 5946 nsecs 57
  • C++ 二维数组vector如何添加空行

    在制作BP神经网络时 需要给vector添加一个空行 自己根据直觉进行了以下试探 发现并没有问题 include
  • C++析构函数的自动调用问题

    首先要明确一点 系统只会自动释放栈内空间 而堆内空间需要用户自己维护 C 中 除了new来的空间存放在堆内 其他均存放在栈中 当单纯的创建对象的时候 对象存放在栈中 此时在程序块的 后面 系统会自动调用析构函数 释放掉栈空间 但是 如果创建
  • 简述浏览器渲染流程

    近期的项目涉及到了前端的一系列知识 所以就简单的总结一下 因为不是前端人员 相关的概念可能不会分析的很深 如果说法有问题 希望路过的大佬们多多指教 下面说的大多是自己的理解 尽可能简洁又通俗 说到浏览器渲染 一个重要前提应该就是dom do
  • Ubuntu启动ftp服务

    Ubuntu启动ftp服务 1 安装vsftpd sudo apt get install vsftpd 2 修改ftp配置文件 注意要加sudo 否则无权限更改 sudo vi etc vsftpd conf 将 local enable
  • MySQL数据库入门实战教程

    目录 前言 一 创建建数据库 创建建数据表 查看数据库 查看数据表 二 新增 修改 删除表记录 三 基础查询 where子句查询 1 基础查询 2 WHERE子句查询 3 Like模糊查询 四 分组查询 聚合函数 排序查询 4 排序查询 5
  • 子集和问题

    子集和问题 描述 Description 问题描述 子集和问题的一个实例为 S t 其中 S x1 x2 xn 是一个正整数的集合 c是一个正整数 子集和问题判定是否存在S的一个子集S1 使得子集S1和等于c 编程任务 对于给定的正整数的集
  • 【数据结构】堆的实现(简单易懂,超级详细!!!)

    目录 1 堆的概念及结构 概念 规律 2 堆的实现 2 1结构设计 2 2接口实现 2 3 初始化 2 4堆的向下调整算法 主要思想 涉及问题 代码实现 2 5建堆 思想 代码实现 建堆的时间复杂度 2 6 堆的向上调整算法 主要思想 涉及
  • PyQt5常用模块、类、控件

    一 常用模块 QtCore 包含非核心的GUI功能 此模块用于处理时间 文件和目录 各种数据类型 流 URL MIME类型 线程或进程 QtGui 包括窗口系统集成 事件处理 二维图形 基本成像 字体和文本 QtWidgets 基本控件都位
  • Yii Framework 开发教程(33) Zii组件-Accordion示例

    Zii组件中包含了一些基于JQuery的UI组件 这些UI组件定义在包zii widgets jui中 包括CJuiAccordion CJuiAutoComplete CJuiDatePicker等 本篇介绍CJuiAccordion 显
  • ARM的37个寄存器和异常处理机制详解

    1 ARM的37个寄存器 ARM的37个寄存器中 30个寄存器是 通用 1个固定用作PC 程序控制寄存器 一个固定用作CPSR 程序状态寄存器 5个固定用作5种异常模式下的SPSR 程序状态保存寄存器 特别注意user模式和sys模式共用寄