说到异常向量,会让人联想到中断向量。其实,中断是属于异常的子集的,也就是说中断其实是异常其中的一种。

回到异常向量,他其实是一张表格,每个格子里存放的是一个地址,或者是一个跳转命令,不管是哪个,其目的都是让PC跳转到真正处理异常的代码的地方。

以下是arm的异常向量表:

图1

初步介绍完异常向量,就来对比下ARM的arm的7种工作模式:

图2

User : 非特权模式,大部分任务执行在这种模式

FIQ :   当一个高优先级(fast) 中断产生时将会进入这种模式

IRQ :   当一个低优先级(normal) 中断产生时将会进入这种模式

Supervisor :当复位或软中断指令执行时将会进入这种模式

Abort : 当存取异常时将会进入这种模式

Undef : 当执行未定义指令时会进入这种模式

System : 使用和User模式相同寄存器集的特权模式

可以发现arm的7种工作模式其实是和arm的异常向量表有着一定的对应关系的。

接着来看ARM的一个非常重要的寄存器——CPSR程序状态寄存器,如图二所示:该寄存器在arm的任何工作模式中都存在,且是被所以工作模式共用的。

寄存器每一位的含义如下图所示:

图3

以上3者有着莫大的关联,结合三者分析,就会明白很多东西。

其一、arm的7种工作模式,和异常向量表有着一定的对应关系。 如SVC模式下发生普通中断(IRQ)arm自动切换到IRQ模式,进入IRQ模式后PC就会指向IRQ对应异常向量表,及0x18这个位置。

再比如复位时,就会进入svc模式,并且跳到Reset对应的异常向量表,及0x00位置(这也是为什么程序是从0x00开始执行的)

其二、工作模式的切换有主动和被动之分。上面所说的就是被动切换,他是随着某种异常的发生而导致的切换。

主动切换,就要靠cpsr这个寄存器了。可以看到这个寄存器的末四位就是用来设定进入哪种模式的。

何时需要cpsr主动切换模式呢:

1、一开始就想进入某种模式。如:一开始设置所有模式下的sp地址。示例如下:

2、进入某种模式后,想切换到之前的模式。这个过程通常是通过读回SPSR的值。示例如下:

接着,我们来区分异常和中断的区别和联系:

1、中断可以看作是异常的一种情况。

2、中断是可以屏蔽的,如通过cpsr寄存器的I位和F位分别屏蔽IRQ和FIQ。而异常是无法屏蔽的。

3、异常/中断发生时,PC都会指向相应的向量表。异常的发生往往会导致模式的自动切换。

4、IRQ和其他模式稍有不同。因为被动切换到IRQ模式下的情况有很多种,换句话就是,很多种中断,都会导致进入IRQ模式。进入IRQ模式还需要判断是那种情况导致了中断,所以IRQ往往还对应一张中断向量表。(区分于异常向量表)相当于异常向量表的子级表。

最后看,在模式切换时,都发生了什么?

1、当模式发生切换时(主动或者被动),硬件会自动帮我们完成一些事情。然后还需要软件完成一些事情。

做好这两件事,就可以在模式之间切换而不会相互影响,当然对应程序员而言只需要做好后者。

2、硬件帮我们完成的事情,是在模式切换时随之完成,而软件要完成的任务,是在模式切换之后。这点需要十分注意!比如当前是SVC模式切换到IRQ模式。那么软件需要完成的事情,是在当前IRQ模式下完成的。

3、那么硬件完成了什么事情,软件又需要做什么呢?

3.1、硬件完成的事情有:

切换到新的模式后,用的就是当前模式下的sp以及lr,但是pc只有一个。由于硬件帮我们

完成的一些事。所以当前IRQ模式下的lr寄存器存放的其实是上个模式SVC的PC值。当前IRQ模式下的

SPSR寄存器存放的其实是上个模式SVC的CPSR值。这充分为返回上一个模式做好了准备。

3.2、所以软件需要完成的任务有:

3.2.1、保存当前共用寄存器的值,(如SVC模式和IRQ模式共用r0~r12 以及r15及pc)到当前模式的栈内存。保证之前模式的值不被破坏。

这里CPSR虽然也是共用的,但是不用保存到栈中,这是因为硬件会自动把上个模式的CPSR保存到当前模式的SPSR。

而SPSR直到中断返回,及切换到之前的模式才会用到。有点同学会问了,pc的值也会由硬件自动保存到lr,为什么还需要保存到栈中呢?这是因为lr和SPSR不同,在中断执行的过程中,很可能需要使用lr,为了不把之前的pc值冲掉还是先将其发到栈中保存。

3.2.2、进入中断处理函数。处理中断。

3.2.3、中断返回,将之前保存到栈里的值读回,并SPSR的值赋值给CPSR实现主动切换到之前的模式。示例代码:

最后,聊一个面试经常问的问题,FIQ相比IRQ,FIQ称为快速中断,IRQ称为普通中断。FIQ为什么比IRQ快!

我们可以结合图1和图2进行分析:

1、先看图1,FIQ的异常向量地址为0x1C,位置处于最顶部,这就意味着,FIQ真正的异常处理代码可以紧接着0x1C,及无需跳转,不跳转意味着无需打断arm的流水线,所以可以提高中断响应。

2、再看图2,FIQ模式下具有更多的独立寄存器,如r8~r14,这些寄存器都是FIQ模式下独自享用的。这就意味着,当发生快速中断,进行模式切换时,只有少量的寄存器需要备份到栈中,从而也能节省时间,提高中断的响应速度。

以上两点就是FIQ为什么比IRQ快的原因,别小看节省的这么一点点时间,有的时候就是这么“兵贵神速”。

浅析arm的异常、中断和arm工作模式的联系的更多相关文章

  1. ARM体系的7种工作模式

    一.ARM体系的CPU有以下7种工作模式:   用户模式(usr)    大多数程序运行于用户模式 特权模式   系统模式(sys)   运行具有特权的操作系统任务 异常模式 中断模式(irq)   ...

  2. 嵌入式中 ARM的几种工作模式 以及异常模式的优先级

    一.Arm工作模式: Arm微处理器支持7种工作模式,分别为: 1. 用户模式(Usr)            用于正常执行程序 2. 快速中断模式(FIQ)    用于高速数据传输 3. 外部中断模 ...

  3. ARM体系的异常中断

    在ARM体系中,通常有3种方式控制处理器的流程  1:在正常执行过程中,每执行一条ARM指令,程序计数器寄存器PC的值加四个字节,在每执行一条Thumb指令,程序计数器寄存器PC的值加两个字节,整个过 ...

  4. 2—ARM中的异常中断

    ARM体系中的3种控制程序执行的方式 正常执行过程中,每执行1条ARM指令,PC的值加4个字节:每执行1条Thumb指令,PC的值加2个字节.整个过程按照顺序执行. 通过跳转指令,调到特定的地址开始执 ...

  5. ARM异常中断返回的几种情况

    在学习韦老师视频中中断异常部分时候,对于发生中断时需要执行的#保存异现场 #恢复现场 中的“返回”弄不清楚,查阅网络文章后,发现一篇概述我觉得我能理解的一篇如下:   重要基础知识:R15(PC)总是 ...

  6. ARM工作模式

    ARM工作模式 学习ARM的最好的资料是ARM公司发布的资料:ARM Architecture Reference Manual.pdf 找到章节:Programmers’ Model 由文档可知:A ...

  7. ARM的工作模式和寄存器

    以前学的时候学的是S3C6410的开发板,它是三星公司推出的基于ARM v6架构(指令集),处理器是ARM11. ARM架构是构建每个ARM处理器的基础. 目前最新的是ARM v8架构:http:// ...

  8. ARM处理器工作模式

    学习ARM处理器参考的首选资料是ARM Architecture Reference Manual,是最专业权威的学习资料. ARM处理器共有7种工作模式,如表1-1和1-2所示: 表1-1 处理器工 ...

  9. [国嵌笔记][021-022][ARM处理器工作模式]

    [ARM处理器工作模式] 处理器工作模式 1.User(urs):用户模式,linux应用程序运行在用户模式 2.FIQ(fiq):快速中断模式 3.IRQ(irq):中断模式 4.Superviso ...

随机推荐

  1. 简单CNN 测试例

    1.训练数据: import tensorflow as tf import cv2 import os import numpy as np import time import matplotli ...

  2. UWP开发细节记录:WRL::ComPtr 的坑

    WRL::ComPtr 取原始指针的地址有两种方式: operator&()   先释放原指针再取地址 GetAddressOf() 直接得到原始指针的地址 显然,operator& ...

  3. python 元组编码和解码问题

    先看一个例子: (u'agentEnum', True, '200', {u'msg': u'\u6210\u529f', u'code': 1}) 在2.7.15版本中,如果有下面代码: def f ...

  4. VMWare虚拟机安装Linux系统时安装界面显示不全的解决、Linux分区

    1.只有最下面的按钮不全(可以显示字的一部分):可以用Tab键操控进行下一步 2.只有一半左右的界面:用Alt+鼠标左键移动安装界面 3.关于Linux分区:如果想用Linux进行深入操作,尽量不要选 ...

  5. centOS7中Mariadb数据库安装与基本管理

    一.Mariadb数据库安装 1. 直接yum源安装 yum -y install mariadb mariadb-serversystemctl start mariadb /启动Mariadb服务 ...

  6. android的hwc浅析【转】

    https://blog.csdn.net/alien75/article/details/39290109 注:本文档基于kk进行分析,着重于概念的精确定义和版本历史演变 一.关于hwc的介绍 广义 ...

  7. sysbench压力测试工具安装及使用

    使用sysbench指定连接的时候不需要写上mysql-socket参数 如果自己使用sysbench来测试mysql性能的话,建议使用源码编译比较好,版本为0.4版本. 步骤是: .yum inst ...

  8. 布局:上下两个div高度固定,中间自适应

    需求:经典布局 —— 头尾固定高度中间高度自适应布局 头部固定高度,宽度100%自适应父容器: 底部固定高度,宽度100%自适应父容器: 中间是主体部分,自动填满,浏览器可视区域剩余部分,内容超出则中 ...

  9. http的长连接和短连接(数据库也一样)

    长连接与短连接 所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持. 短连接是指通信双方有数据交互时 ...

  10. datagridview 获取选中行的索引

    C# CODE for (int i = 0; i < this.dataGridView1.SelectedRows.Count; i++)//遍历所有选中的行 { this.dataGrid ...