ARM异常处理(异常源的分类、异常的响应流程)

news2024/11/26 8:43:06

目录

一、异常的概念

1、什么是异常?

2、处理异常时,处理器要考虑哪些问题?

二、ARM异常源

1、异常源的分类

2、异常模式

三、ARM异常响应

1、CPSR寄存器内容备份(自动执行)

2、修改CPSR的值(自动执行)

(1) 修改模式

(2) 修改中断禁止位

(3) 修改状态位

3、保存返回地址(自动执行)

4、跳转到异常向量表(自动执行)

5、执行异常处理程序(自己编写)

6、异常处理完毕的返回动作(自己编写)

(1) 恢复之前的状态

(2) 回到之前中断的下一个位置

四、完整流程示意图


一、异常的概念

1、什么是异常?

异常指的是处理器在正常执行程序的过程中遇到的不正常事件。异常发生时,处理器会暂停当前程序转而去处理异常事件,异常事件处理完成之后再回到之前被打断的地方继续执行程序。

比如,老师在上课,这时突然有人敲门,老师就会暂停讲课去开门,事情处理完毕以后,老师继续讲课。这个过程中,老师上课 = 正常执行程序,有人敲门 = 异常事件。

2、处理异常时,处理器要考虑哪些问题?

不同处理器对异常的处理大体相似,但是不同处理器在具体实现上可能会有所不同。处理器在处理异常的时候,需要考虑的问题大致如下:

  • 异常源的判断
    • 并非有事件发生,处理器就会去处理,比如老师上课的时候,学生咳嗽一声,这种情况就不算异常。
  • 异常的响应
    • 跳转前的准备工作。比如保存跳转前的地址、进入到相应的异常模式
    • 异常处理工作。这里就是去调用异常处理程序了
    • 异常处理结束的善后工作。比如异常如何返回

二、ARM异常源

所谓异常源,就是导致异常产生的事件。异常源和工作模式存在一定的关联,异常源出现的时候,处理器会进入相应的工作模式,然后去执行相应的功能。

1、异常源的分类

异常源大致有如下七种,这里需要和工作模式区分开,异常源是终止CPU正常运行的原因,工作模式则是CPU当前的工作状态。

异常源类型

(优先级由高到低)

异常源说明
Reset复位电平有效
Data Abort数据终止。比如地址不允许被访问
FIQ 快速中断请求引脚有效,一般是外部硬件产生的,优先级较高。
IRQ外部中断请求引脚有效,一般是外部硬件产生的,优先级较低
Prefetch Abort指令预取终止。比如对应地址不存在指令
Software Interrupt软中断,一般是程序产生的
Undefined Instruction遇到不能处理的指令。比如CPU拿到指令以后无法解析

2、异常模式

在ARM的基本工作模式中有5个属于异常模式,即ARM遇到某种异常后会切换成对应的异常模式,不同的异常源可能会进入到同一种工作模式。异常源和工作模式之间的关系如下:

异常源异常模式
FIQFIQ
IRQIRQ
Reset / SWISVC
Data Abort / Prefetch AbortAbort
Undefined Instruction

Undef

三、ARM异常响应

当异常发生的时候,CPU会停下手里的任务,跳转去执行异常处理程序,但是在跳转之前,需要做一些准备工作,比如保存中断之前的工作模式和运算状态、中断位置的下一条指令的地址。

1、CPSR寄存器内容备份(自动执行)

拷贝CPSR寄存器中的内容到对应异常模式下的SPSR_<mode>寄存器。下面是不同工作模式所使用的寄存器。

一开始是处在User模式下,现在IRQ异常产生了,CPU会进入到 IRQ 模式,但是IRQ也要使用CPSR寄存器,所以只能将User模式下的寄存器数据暂存到 SPSR_irq 中。

2、修改CPSR的值(自动执行)

现在CPSR归IRQ模式使用了,主要完成的工作有如下三个:

  • 修改模式位为IRQ。
  • 修改中断禁止位,禁止相应的中断。
  • 修改状态位进入ARM状态。

(1) 修改模式

拿到CPSR寄存器的第一件事当然就是改成相应的异常模式了。

(2) 修改中断禁止位

这里禁止相应中断的目的是,CPU在处理当前中断的时候,不希望被其他同优先级的中断打扰(除非中断优先级更高)。这里就分为了两种情况:

如果发生的是IRQ异常,其他IRQ中断发生时,CPU不予理会;FIQ中断发生时,先停下手里的中断处理任务,先去处理FIQ中断,处理完FIQ中断再回来处理IRQ中断。

如果发生的是FIQ异常,那么该异常的处理过程无法被打断,因为不存在更高优先级的中断,同优先级的FIQ中断已经被禁用了。

(3) 修改状态位

大多数情况下使用的状态位都是ARM状态,在处理异常的时候,这一步可以直接省略;如果当前处理器的状态是Thumb状态,这时就需要修改状态位为ARM状态。

3、保存返回地址(自动执行)

后面异常处理完毕以后,处理器要回到中断的下一个位置继续运行程序,这里我们就需要事先保存中断位置的下一条指令的地址到 LR_<mode>。

每一种工作模式有着自己的 LR寄存器,如果发生的是IRQ异常,那么就会保存到 r14_irq 寄存器

问:什么不保存到User模式下的 r14 寄存器?

答:最后返回的时候,是由IRQ模式切换到User模式,IRQ模式下是无法使用 User模式下的r14寄存器的。

4、跳转到异常向量表(自动执行)

准备工作都做好了,为什么不直接跳转到异常处理程序呢?这是当初设计ARM的工程师们给我们留的一个接口,因为他们也不知道实际异常处理程序放在哪,也不能直接写死,不同异常的对应的处理程序是不一样的,所以先跳转到异常向量表。

异常向量表在内存中占据32个字节,每个异常源都分配了4个字节的存储空间,注意,这4个字节不是用来存放异常处理程序的,而是存放跳转指令来直接跳转到异常处理程序的入口位置

注:ARM的异常向量表的基地址默认在0x00地址,但可以通过配置协处理器来修改其地址

5、执行异常处理程序(自己编写)

6、异常处理完毕的返回动作(自己编写)

(1) 恢复之前的状态

SPSR_<mode>备份了中断之前的工作模式和运行状态,所以需要将SPSR_<mode>的值复制给CPSR使处理器恢复之前的状态。

(2) 回到之前中断的下一个位置

在跳转之前,LR__<mode>保存了中断处的下一条指令的地址,所以需要将LR_<mode>的值复制给PC使程序跳转回被打断的地址继续执行。

四、完整流程示意图

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

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

相关文章

广告倒排服务极致优化

作者 | XY 导读 漏斗优化是检索系统不变的话题&#xff0c;过去一年来&#xff0c;广告漏斗优化一改往日做“加法”&#xff0c;而通过简化漏斗&#xff0c;提升全系统一致性。如百度这样庞大的广告库规模、高流量规模以及复杂的业务规则&#xff0c;要做到极简的漏斗层次&…

206367-33-1,抗菌肽pBD-1

pBD-1 是一种来源于猪组织的内源性组成型表达的抗菌肽 (AMP)&#xff0c;尤其在猪黏膜上皮部位表达。pBD-1 具有抗菌作用&#xff0c;并且有助于猪黏膜和系统宿主防御。pBD-1 is an endogenous and constitutively expressed antimicrobial peptide (AMP) from porcine tissues…

rocketmq源码-consumer拉取消息(push模式)

前言 在前面consumer启动的博客中&#xff0c;有说过&#xff0c;在启动过程中&#xff0c;有两个比较重要的逻辑&#xff0c;分别是负载均衡和拉取消息的service&#xff0c;这篇博客&#xff0c;主要记录拉取消息的service&#xff0c;因为前面的demo和这篇笔记中的demo&…

电磁场知识整理------2022/12/14

电磁场知识整理1、数学基础麦克斯韦方程2、麦克斯韦方程组的近似情况2.1 恒定电场2.2 恒定电流场2.3 恒定磁场2.4 动态电磁场2.5 时谐电磁场3、电磁辐射与电磁波写在最后学习资源&#xff1a;慕课上浙大的工程电磁场与波。 工程电磁场与波 1、数学基础 正交坐标系&#xff1a;…

Android 线上卡顿监控

文章目录1. 卡顿与ANR的关系2. 卡顿原理3. 卡顿监控3.1 WatchDog3.2 Looper Printer3.2.1 监控TouchEvent卡顿3.2.2 监控IdleHandler卡顿3.2.3 监控SyncBarrier泄漏4. 小结平时看博客或者学知识&#xff0c;学到的东西比较零散&#xff0c;没有独立的知识模块概念&#xff0c;而…

leetcode 375. 猜数字大小 II-【python3详细图解】递归+记忆化搜索与动态规划

题目 我们正在玩一个猜数游戏&#xff0c;游戏规则如下&#xff1a; 我从 1 到 n 之间选择一个数字。你来猜我选了哪个数字。如果你猜到正确的数字&#xff0c;就会 赢得游戏 。如果你猜错了&#xff0c;那么我会告诉你&#xff0c;我选的数字比你的 更大或者更小 &#xff0c…

二十、JavaScript——逻辑非

! 逻辑非- &#xff01;可以对一个值进行非运算 - 它可以对一个布尔值进行取反操作 true 变成 false false 变成 true - 如果对一个非布尔值进行取反&#xff0c;它会将其先转换为布尔值&#xff0c;再进行取反操作 可以利用这个特点将其他类型转换为布尔值 <script>/*! …

Hybrid模式下,如何实现热更新?

做过开发的小伙伴应该对“热更新”不陌生吧&#xff01;热更新就是指在游戏或软件更新的时候&#xff0c;不用再重新下载安装包进行安装&#xff0c;而是在启动应用程序的时候&#xff0c;在内部进行资源或代码的更新。那么如今&#xff0c;市场为什么越来越多地选择热更新技术…

数据结构——图最全总结(期末复习必备)

目录 图 定义&#xff1a; 基本术语&#xff1a; 图的存储结构 邻接矩阵 邻接表 十字链表 邻接多重表 图的遍历 深度优先搜索(Depth First Search,DFS) 广度优先搜索(Breadth First Search,BFS) 图的应用 最小生成树 普利姆算法 克鲁斯卡尔算法 最短路径 单源最短…

优蓝冲刺港股:上半年期内亏损过亿 主打蓝领人才服务

雷递网 雷建平 12月14日优蓝国际控股股份有限公司&#xff08;简称&#xff1a;“优蓝”&#xff09;日前递交招股书&#xff0c;准备在香港上市。上半年期内亏损1.18亿优蓝是一家蓝领终身服务平台&#xff0c;旨在成为蓝领人才的首选终身服务平台。截至最后实际可行日期&#…

[附源码]Nodejs计算机毕业设计基于博客系统的UI手机界面展示Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

vue3插槽(匿名插槽-具名插槽-插槽作用域-动态插槽)

文章目录容器布局匿名插槽具名插槽作用域插槽动态插槽容器布局 &#x1f468;&#x1f3fb; parent.vue <script setup lang"ts"> import { ref, useAttrs, defineProps } from "vue"; import children from ./children.vue</script><tem…

界面控件DevExpress WinForm——HTML-CSS感知控件介绍

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

疫情防控|Springboot+小程序+校园疫情防控系统设计与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

【刷题笔记】之牛客面试必刷TOP101(二分查找-I + 二维数组中的查找 + 寻找峰值 + 数组中的逆序对 + 旋转数组的最小数字 + 比较版本号)

目录 1. 二分查找-I 2. 二维数组中的查找 3. 寻找峰值 4. 数组中的逆序对 5. 旋转数组的最小数字 6. 比较版本号 1. 二分查找-I 题目链接&#xff1a;二分查找-I_牛客题霸_牛客网 (nowcoder.com) 题目要求&#xff1a; 上代码 import java.util.*;public class Solut…

Spring MVC学习 | 视图RESTFul

文章目录一、视图1.1 视图对象View1.2 ThymeleafView1.3 转发视图1.4 重定向视图1.5 视图控制器二、RESTFul2.1 简介2.2 PUT和DELETE请求的实现2.2.1 HiddenHttpMethodFilter过滤器2.2.2 实现PUT请求2.2.3 实现DELETE请求学习视频&#x1f3a5;&#xff1a;https://www.bilibil…

Python 元组(Tuple)操作详解

Python的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改,元组使用小括号,列表使用方括号,元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可 一、创建元组 代码如下: 1 2 3 tup1 (physics, chemistry, 1997, 2000); tup2 (1, 2, 3, 4, 5 ); tup3 &qu…

Redis实现朋友圈,微博等Feed流功能,实现Feed流微服务(业务场景、实现思路和环境搭建)

文章目录业务场景Feed流相关概念Feed流特征Feed流分类实现思路环境搭建数据库表结构新建Feeds功能微服务ms-feeds配置类 RedisTemplateConfigurationREST配置类 RestTemplateConfigurationFeeds 实体类FeedsVO 响应类业务场景 在互联网领域&#xff0c;尤其现在的移动互联网时…

Linux环境下MySQL的安装与使用

目录 一&#xff1a;安装MYSQL说明 1.1 查看是否安装过MySQL 1.2 MYSQL的卸载 二&#xff1a;MySQL在Linux下的安装 三&#xff1a;MYSQL登录 3.1 首次登录 3.2 修改密码 3.3 设置远程登录 一&#xff1a;安装MYSQL说明 1.1 查看是否安装过MySQL 检查rpm安装包 rpm -…

JAVA毕业设计——基于ssm高校共享单车管理系统 (源代码+数据库)604

代码地址 https://github.com/ynwynw/webike-public 毕业设计所有选题地址 https://github.com/ynwynw/allProject 基于ssm高校共享单车管理系统 (源代码数据库)604 一、系统介绍 用户管理&#xff0c;服务点管理&#xff0c;单车管理&#xff0c;分类管理&#xff0c;学生管…