ARM异常处理详解

news2024/9/20 19:28:03

前言:

学习一门处理器最重要的就是掌握该处理器的指令集异常处理。

异常概念:

        处理器在正常执行程序时可能会遇到一些不正常的事件发生,这时处理器就要将当前的程序暂停下来转去处理这个异常的事件,异常处理后再返回到被异常打断的点继续执行

例如:

我现在正在学习,然后我妈叫我吃饭,这时我要停止学习去吃饭,吃完饭后我就重新到我吃饭之前学习的点继续学习。此时,吃饭就是一个异常事件    

 对于CPU,假设它在按顺序执行用户程序,而到了某一个位置,CPU要去处理异常,就会跳转到异常处理程序中,按顺序执行。

注意:用户程序和异常处理程序都是编程人员自己写的

假设我正在玩游戏,用户程序就是游戏,在玩游戏的途中,我觉得声音小了,按按钮加大声音,这时,相当于去处理异常了,跳转到了异常处理程序中,运行完后返回用户程序执行异常的那个位置。

异常与中断的区别

他们两个都是计算机系统中的事件,最重要的区别是,中断是外围设备向处理器发出的,可以理解为硬件,而异常是程序执行过程中出现的,可以理解为软件。即中断与硬件有关,异常与软件有关。

中断的产生是异步的,也就是说,它可以在任何时候发生,用于通知处理器要处理的事件,而异常的产生是同步的,也就是说,它只会在程序执行到某个特定的指令时发生,用于表示程序出现了错误或异常情况

处理中断需要保存当前程序的上下文,并跳转到中断服务程序中执行相应操作;处理异常则不需要保存当前程序的上下文,而是立即跳转到异常处理程序中处理异常情况。

异常处理机制

对于不同的处理器,他们对异常的处理流程大致相似,但是不同的处理器在具体的实现机制上有问题:比如处理器遇到哪些事件被认为是异常事件遇到异常事件后处理器有哪些操作处理器如何跳转到异常处理程序如何处理异常处理完异常后有如何返回到被打断的程序继续执行等。这些细节称为异常处理机制

ARM如何处理异常

ARM异常源

导致异常产生的事件称为异常源

上述处理机制中的第一条,处理器遇到哪些事件被认为是异常事件,就是哪些事件可以打断正在运行的程序

例如正在上课,老师叫李明出去,这只会打断李明的运行,而不会打断其他人。

ARM的7类异常源

ARM异常源
FIQ快速中断请求引脚有效
IRQ       外部中断请求引脚有效
Reset复位电平有效
Software Interrupt执行swi指令
Data Abort数据终止
Prefetch Abort执行预取中止
Undefined Instruction遇到不能处理的指令

异常模式

在ARM的8个基本工作模式中有5个属于异常模式,即ARM遇到异常后会切换成对应的异常模式

异常源FIQIRQReset/SWIData Abort/Prefetch AbortUndefined Instruction
异常模式FIQIRQSVCAboutUndef

ARM产生异常后的动作(自动完成)

  1. 拷贝CPSR中的内容到对应异常模式下的SPSR_<mode>(保存内容
  2. 修改CPSR的值
    2.1 修改中断禁止位禁止相应的中断
    2.2 修改模式位进入相应的异常模式
    2.3 修改状态位进入ARM状态
  3. 保存返回地址对应d下的LR_<mode>(保存地址
  4. 设置PC为相应的异常向量(异常向量表对应的地址)

ARM产生异常,会跳转去实现异常处理程序,那么这些动作怎么实现的?

如上,第一步,会将CPSR的内容拷贝到对应异常模式下的SPSR_<mode>

CPSR(Current Program Status Register):当前处理器状态

正如我们所知,ARM处理器做完异常处理后会以当前内容继续执行程序,那么就需要有一个寄存器保存CPSR(当前处理器)的值,即使用SPSR_<mode>来保存CPSR内容。

第二步,修改CPSR值。

我们已经拷贝了之前的CPSR的值,所以可以放心修改。首先要确保它在处理异常时不能被中断。

例如:

我正在写作业,我妈叫我去吃饭,那么我在吃饭的过程中,就不能有其他的中断来影响我,所以直接修改相应的禁止位。

IRQ禁止位被设置为1时,处理器将禁止所有外部中断的触发。就比如正在处理异常时,任何硬件操作信息都不能中断异常进行,但是异常优先级高的可以停止异常优先级低的先执行高优先级异常。

修改值的第二三步就好理解了,当执行异常处理程序时,模式位会变为相应异常模式,而异常处理程序的状态位是ARM状态。

第三步,保存返回地址。

正如我们所知,异常处理结束后会返回到遇到异常地址的下一个地址,不能执行完异常后自己的家都忘了在哪,所以我们需要保存返回地址,以便回到正确的家。

第四步,设置PC为相应的异常向量。

大家发现没有,看了上面三个步骤,好像都是在原地进行的,也就是在遇到异常的那个地址进行的,修改了很多,也保存了很多,但是并没有跳转到异常处理程序中。那么第四步即是跳转操作了,通过设置PC为相应的异常向量,跳转到异常处理程序中。

异常向量表是什么?

  • 异常向量表本质是内存中的一段代码
  • 表中为异常源分配了四个字节的存储空间
  • 遇到异常后处理器自动将PC修改为对应的地址,如下图,IRQ异常PC将会修改为0x18

 思考:

遇到异常后PC会跳转到异常向量表,那么我们能不能在每一个异常向量表下写我们的异常程序?这样可以跳转到对应地址后直接执行,是不是很方便?

答案:

错误,如上述第二点所知,异常向量表只为每个异常源分配了四个字节的内存,而异常程序通常很大,四个字节肯定装不下,所以这种方法是错误的。

那么在对应的异常向量表中,会写一个跳转程序使其跳转到你自己写的异常处理程序入口

ARM异常执行结束后,返回的动作(自己编写)

  1. 将SPSR_<mode>的值复制给CPSR,使处理器恢复之前的状态(内容
  2. 将LR_<mode>的值复制给PC,使程序跳转回被打断的地址继续执行(地址

至此,ARM遇到异常并执行的过程就是这样

总结一下:

网卡或者其他程序发出异常(假设为IRQ),在遇到异常而没跳转之前,那么会执行开头四步骤,赋值,修改,存地址,PC跳转,其中修改操作要进行三步,中断、模式、状态,PC要跳转到对应的异常向量表的异常源地址。这样实现了跳转操作。跳转后,每一个异常源里有跳转程序,这时才跳转到自己写的异常处理程序入口,也就是说跳转到执行异常程序经历了两次跳转。执行过程就是自己写的程序那样执行,执行结束后,会将之前赋值给SPSR_<mode>(存放的内容)值赋值给CPSR,而LR_<mode>(存放的地址)赋值给PC,使其跳转到被打断的地址而且保持之前状态继续执行。

异常优先级

当两个或者多个异常同时被遇到,那么异常处理的顺序就是重要问题,异常优先级就是处理这个问题的关键。

如下表,多个异常同时产生的服务顺序:

注意一下三个:

  • Reset(复位操作)优先级最高
  • FIQ比IRQ优先级高

 FIQ的响应速度比IRQ快的原因

  1. FIQ在异常向量表中位于表尾,所以可以直接把异常处理程序写到异常向量表之后,省去跳转时间。
  2. FIQ模式有5个私有寄存器(r8~r12),执行中断处理程序前无需压栈保存寄存器,可直接处理中断
  3. FIQ的优先级高于IRQ
    1. 两个中断同时发生先响应FIQ
    2. FIQ可以打断RIQ,但是RIQ不能打断FIQ

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

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

相关文章

需求分析引言:架构漫谈(五)架构师成长之路

我研发领域也从事了一些年&#xff0c;期间也做过一些架构设计工作&#xff0c;包括C#单体转型为Java微服务、Python单体转型为Java微服务等&#xff0c; 也尝试着从自己的经验角度&#xff0c;来汇总一些知识点&#xff0c;同时描述一下如何成长为一个合格的软件架构师&#x…

权限管理系统后端实现1-SpringSecurity执行原理概述

spring security的简单原理&#xff1a; SpringSecurity有很多很多的拦截器&#xff0c;在执行流程里面主要有两个核心的拦截器 1&#xff0c;登陆验证拦截器AuthenticationProcessingFilter 2&#xff0c;资源管理拦截器AbstractSecurityInterceptor 但拦截器里面的实现需要…

IDEA+Spring Boot + MyBatis + Layui+Mysql垃圾回收管理系统源码

IDEASpring Boot MyBatis LayuiMysql垃圾回收管理系统源码 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.垃圾回收管理3.添加需要回收的垃圾4.垃圾去向管理5.申请需要打包运出的垃圾6.系统公告管理7.个人信息管理8.修改密码 三、部分代码UserMapper.javaUserControlle…

Python的网络爬虫框架-网络爬虫常用框架

Python的网络爬虫框架-网络爬虫常用框架 一、前言二、引言三、Scrapy 爬虫框架四、Crawley 爬虫框架五、PySpider 爬虫框架 一、前言 个人主页: ζ小菜鸡大家好我是ζ小菜鸡&#xff0c;让我们一起来了解Python的网络爬虫框架-网络爬虫常用框架如果文章对你有帮助、欢迎关注、点…

Redis缓存同步1-策略介绍

缓存数据同步策略示意图 在大多数情况下&#xff0c;我们通过浏览器查询到的数据都是缓存数据&#xff0c;如果缓存数据与数据库的数据存在较大差异的话&#xff0c;可能会产生比较严重的后果的。所以&#xff0c;我们应该也必须保证数据库数据、缓存数据的一致性&#xff0c;…

基于simulink使用颜色识别来进行道路跟踪(附源码)

一、前言 此示例演示如何使用颜色信息来检测和跟踪在可能不存在车道标记的主要住宅环境中设置的道路边缘。基于颜色的跟踪示例说明了如何使用色彩空间转换块、霍夫变换块和卡尔曼滤波器块来检测和跟踪使用色调和饱和度的信息。 二、模型 下图显示了基于颜色的道路跟踪模型&a…

MATLAB的num2str,把循环变量作为字符串的内容

MATLAB的num2str&#xff0c;把循环变量作为字符串的内容 输入代码&#xff1a; i 2; abc [sdfg,num2str(i),dsfg]运行结果&#xff1a; 解析&#xff1a; MATLAB里面的[ ]是会把元素组合的意思 现在有&#xff1a; a1 3; a2 4; a3 5; 然后我想通过for循环&#xff0c;循…

mac与pd虚拟机之间不能粘贴文字或粘贴文件

首先确保共享打开&#xff1a; 然后检查虚拟机的Parallels Tools是否正常 一个简单的判断方式就是&#xff0c;退出虚拟机全屏之后&#xff0c;如果能够正常进入融合模式&#xff0c;那么Parallels Tools可用&#xff0c;否则就要排查问题 检查Parallels Tools是否随系统正常启…

C++11 | 智能指针

智能指针 前面的文章中我们介绍了C中的异常有关的知识点&#xff0c;同时在其中我们遇到了有关内存方面的问题&#xff0c;如下所示&#xff1a; int div() {int a, b;cin >> a >> b;if (b 0)throw invalid_argument("除0错误");return a / b; } void…

数据结构算法题——链表

leetcode-2.两数之和 leetcode-2.两数之和 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数…

猿人学做题笔记

简单记录一下做题的思路步骤 1、第一题说的是无混淆加密&#xff08;简单&#xff09;&#xff1a; 刚开始观察请求&#xff0c;发现链接和请求携带的参数都没有什么异常&#xff0c;然后直接请求会拿不到数据&#xff0c;于是仔细看了一下请求包&#xff0c;发现请求头里面有…

03-Vue基础语法之指令语法与条件渲染

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大一在校生&#xff0c;web前端开发专业 &#x1f921; 个人主页&#xff1a;python学不会123 &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习…

【GaussDB(DWS)】数据分布式存储-三种类型的表

toc 一、环境说明 华为数据仓库服务DWS&#xff0c;集群版本8.1.3.320集群拓扑结构&#xff1a; 二、数据分布式方式 DWS采用水平分表的方式&#xff0c;将业务数据表的元组打散存储到各个节点内。这样带来的好处在于&#xff0c;查询中通过查询条件过滤不必要的数据&#…

[工业互联-18]:常见EtherCAT主站方案:SOEM的Windows/Linux解决方案

目录 第1章 SOEM 简介 第2章 SOEM创建EtherCAT主站 2.1 支持Linux和Windows操作系统 2.2 SOEM创建EtherCAT主站的步骤 第3章 QT添加SOEM主站 第1章 SOEM 简介 SOEM (Simple Open EtherCAT Master) 是一种开源的EtherCAT主站协议栈。 EtherCAT&#xff08;Ethernet for C…

飞轮储能系统的建模与MATLAB仿真(永磁同步电机作为飞轮驱动电机)

简介 飞轮储能系统由于其高储能密度、高效率、轻污染的优点而越来越受到重视。飞轮储能系统以高速旋转的飞轮为依托&#xff0c;通过电力电子设备实现电能与动能的相互转化&#xff0c;从而在负载调峰、功率平抑、不间断电源等多领域都有很好的应用表现。 本文选用永磁同步电机…

基于simulink仿真车道偏离警告系统(附源码)

一、前言 此示例演示如何在视频序列中检测和跟踪道路车道标记&#xff0c;并在驾驶员穿过车道时通知驾驶员。该示例说明了如何使用霍夫变换、霍夫线和卡尔曼滤波器模块来创建线检测和跟踪算法。该示例使用以下步骤实现此算法&#xff1a;1&#xff09; 检测当前视频帧中的车道…

计算机通信地址【图解TCP/IP(笔记六)】

文章目录 地址地址的唯一性地址的层次性 地址 通信传输中&#xff0c;发送端和接收端可以被视为通信主体。它们都能由一个所谓“地址”的信息加以标识出来。当人们使用电话时&#xff0c;电话号码就相当于“地址”。当人们选择写信时&#xff0c;通信地址加上姓名就相当于“地…

HarmonyOS学习路之开发篇—数据管理(数据存储管理)

数据存储管理概述 数据存储管理指导开发者基于HarmonyOS进行存储设备&#xff08;包含本地存储、SD卡、U盘等&#xff09;的数据存储管理能力的开发&#xff0c;包括获取存储设备列表&#xff0c;获取存储设备视图等。 基本概念 数据存储管理 数据存储管理包括了获取存储设备…

Vue3+Vite项目配置@路径别名

一、根目录下 vite.config.ts 文件中配置 import { resolve } from path;resolve: {// 设置文件./src路径为 alias: [{find: ,replacement: resolve(__dirname, ./src)}] }二、根目录下 tsconfig.json 文件中配置 //配置 "baseUrl": ".", "paths&qu…

【复习25-29题】【每天40分钟,我们一起用50天刷完 (剑指Offer)】第二十天 20/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…