一. ARM程序执行流程

在ARM体系中,程序执行的流程有三种:

  • 顺序执行程序,在正常顺序执行代码的时候,每次执行一条ARM指令,PC=PC+4(Byte)。(THUMB状态下PC=PC+2)
  • 跳转执行程序,利用跳转指令,程序可以跳转到指定的地址处执行程序,或者跳转到特定的子程序处执行。
  • 异常中断发生,当发生异常时,程序会跳转到相应的异常中断处理程序处执行,在执行完异常中断处理程序之后,又会返回原地址继续执行程序。

要了解ARM处理异常中断的流程原理,就要先熟悉一下ARM的工作模式与寄存器。

二. ARM工作模式


如图,ARM有七种工作模式,大多数程序是工作在用户模式usr下的,其他六种工作模式属于特权模式,特权模式的存在是为了处理中断、异常,或者访问被保护的系统资源。不同模式之间的转换可以通过软件来切换,或者是发生各类中断、异常时CPU自动进入相应的模式。在特权模式下可以编程操作CPSR寄存器直接进入其他模式,用户模式下不可以通过写程序进入其他模式(只能通过发生各类中断、异常时CPU自动进入相应的模式)。

各种模式的简要介绍如下:

  • usr:用户模式,程序执行的正常状态
  • sys:兴奋模式,系统模式
  • und:未定义指令中止模式,当遇到未定义的指令时进入此模式
  • svc:管理模式,操作系统使用的保护模式
  • abt:中止模式:当数据或指令预取终止时进入该模式,可用于虚拟存储以及存储保护
  • IRQ:中断模式,系统中各外设通常通过中断模式来处理异常中断
  • FIQ:快中断模式,可以快速处理异常中断

三. ARM中异常中断的种类

ARM体系中的异常中断种类如下图:


可以看出,异常中断的种类与ARM的模式基本对应。

四. 异常中断向量表及优先级

ARM中要进入异常中断的处理程序,首先要触发异常中断的条件,然后通过异常中断向量表跳转到相应的异常中断处理程序的地址中去执行程序,当同时触发多个异常中断,就涉及到异常中断的优先级问题了。

中断向量表中指定了异常中断及其处理程序的对应关系,通常存放在存储地址低端,ARM体系中,异常中断向量表的大小是32字节,每个异常中断占据4个字节大小。这4字节大小的空间中一般存放一个跳转指令或者是一个向PC赋值的数据访问指令(这样也可以跳转程序),具体的向量表如下:

在相应的地址中,存放着程序跳转指令,当发生异常中断时,程序就会指向向量表中的相应地址(与中断种类对应),然后执行地址中的指令,通过地址中的程序跳转指令跳转到异常中断处理程序中,或者是执行重启等相关操作。

当有多个异常中断同时发生的时候,就要给不同的异常中断规定不同的优先级了,各异常中断的优先级如下:

关于不同异常中断有相同的优先级问题,是因为有些异常中断是不可能同时发生的。

五. 异常中断用到的寄存器

不同的ARM模式下对应的寄存器也是不一样的,而且在处理异常中断的时候保持现场、转换模式、恢复现场等操作的实现都需要用到寄存器。
ARM920T中有31个通用寄存器和6个程序状态寄存器,一共37个寄存器,37个寄存器分为七组(与七种模式相对应),进入哪个模式就使用哪组的寄存器,有些寄存器是共用的、有些寄存器在不同的模式下有独有的副本,这些独有的寄存器称为备份寄存器,在图中用灰色三角做了标记:

通用寄存器
r0~r15的寄存器都可以直接访问,除了r15都是通用寄存器,通用寄存器既可以用于保存数据也可以保存地址,其中r13、r14这两个寄存器比较特殊。r13又称为栈指针寄存器sp,常用于保存栈指针。r14又称为程序连接寄存器lr,用于保存发生异常时的指令地址,在程序跳转的时候lr得到pc的备份,以便于恢复现场。

程序状态寄存器
每种模式下除了r0~r15寄存器之外,还共有一个程序状态寄存器CPSR,顾名思义CPSR寄存器中位用来标识当前模式的状态。当程序切换工作模式的时候,要将原来工作模式的信息(也就是CPSR)存储在SPSR中进行保存,以便恢复现场。CPSR寄存器中每个位相应的作用如下:

其中条件代码解释如下:

控制位解释如下:

另外,PSR中的其余位是保留的。在更改PSR的标志或控制位时,必须确保这些未使用的位没有被更改

六. ARM进入处理异常中断时的操作


1.将下一条指令的地址保存在相应的链接寄存器lr中。如果从ARM状态输入了异常,那么下一条指令的地址将被复制到链接寄存器(即当前PC + 4或PC + 8,这取决于异常)。
2.将当前的CPSR拷贝到SPSR中。
3.根据异常中断修改CPSR中对应的值。
4.强制pc从异常中断向量表中跳转到异常中断处理程序。

注意:还可以设置中断禁用标志,以防止异常的难以管理的嵌套

lr与pc的偏移量的关系如示:

七. ARM退出处理异常中断时的操作

从异常中断中返回时的操作与进入异常中断时的操作对称的:

1.将lr寄存器减去适当的偏移量,赋值给pc,恢复到原来的指令地址中。
2.将SPSR中保留的值返回给CPSR,恢复原来的CPSR。
3.清除中断禁用标志(如果它们是在进入时设置的)。

参考资料:杜春雷《ARM体系结构与编程》

ARM—异常中断处理的更多相关文章

  1. ARM异常中断处理

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

  2. 【ARM】arm异常中断处理知识点

    ARM处理器7种类型异常 按优先级从高到低的排列如下: 复位异常(Reset) 数据异常(Date Abort) 快速中断异常(FIQ) 外部中断异常(IRQ) 预取异常(Prefetch Abort ...

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

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

  4. 【原创】中断子系统-ARM GPIO中断处理流程

    目录 第一部分 GIC中断控制器的注册 1. GIC驱动分析 2.GIC驱动流程分析 第二部分 device node转化为platform_device 第三部分:platform_device注册 ...

  5. STM32程序异常——中断处理要谨慎

    问题背景 最近有一个新项目(车载项目),板子上除了原来的ARM + STM32F030K6Tx又多了一个8bit的mcu的单片机,这可真是嵌入式全家福了. 系统的主要核心工作是由arm来完成,但是在开 ...

  6. ARM异常---一个Uart中断的触发处理过程:

    首先给出一些定义: //2440addr.inc INTOFFSET EQU 0x4a000014 ;Interruot request source offset //option.inc _ISR ...

  7. ARM异常---一个DataAbort的触发过程:

    一个DataAbort异常的触发过程://////////////////////////////xxxx.inc_STACK_BASEADDRESS EQU 0x33ff8000_MMUTT_STA ...

  8. Arm v8 中断处理

    转 https://blog.csdn.net/firefox_1980/article/details/40113637

  9. ARM体系的异常中断

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

随机推荐

  1. 「CF547D」 Mike and Fish

    「CF547D」 Mike and Fish 传送门 介绍三种做法. \(\texttt{Solution 1}\) 上下界网络流 我们将每一行.每一列看成一个点. 两种颜色的数量最多相差 \(1\) ...

  2. 脱离OBDeploy工具,手工部署OceanBase方法

    [简介] OBDeploy是OceanBase集群部署的工具,可以通过简单的几行命令,就能快速的进行OceanBase部署.但对于初学者来讲,可能会比较困惑,Deploy到底做了哪些事情?里面的具体步 ...

  3. 前端009-vue框架

    vue-admin-element https://panjiachen.github.io/vue-element-admin-site/zh/ 基于vue的生态做的很好,提供的很多的文档,中文.并 ...

  4. C语言:地址

    一切都是地址 C语言用变量来存储数据,用函数来定义一段可以重复使用的代码,它们最终都要放到内存中才能供 CPU 使用.数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是 ...

  5. Abp太重了?轻量化Abp框架

    本文首发于个人博客(https://blog.zhangchi.fun/) 在进行框架的选型时,经常会听到"***框架太重了"之类的声音,比如"Abp太重了,不适合我们. ...

  6. 【技巧】使用PPT更换背景色

    主要记述使用PPT来更换图片某一部分的背景色 把想要更改的图片粘贴到PPT里. 依次选择[格式][颜色][设置透明色],然后点击需要更改背景的地方 将自己的目标颜色复制一下,填充上去,选择[置于底层]

  7. 微信小程序云开发-数据条件查询

    一.使用where条件查询 在.get()语句之前增加.where语句实现条件查询.  二.通过doc查询单条数据 1.使用doc来查询数据库中的单条数据 2.定义一个空对象,用来展示插叙到的单条数据 ...

  8. 从源码构建Vim

    从源码构建Vim 引言 事情是介样滴,因为我是个Vim 重度使用者了差不多.. 但在大部分系统上能安装到的或者自带的都是比较老的版本,可能是7.x 之类的.也或者是你需要使用到Vim 的某些特性或者功 ...

  9. 在docker for windows建立mssql容器后,ssms连接mssql出现错误号码18456的问题

    在docker for windows建立mssql容器后,ssms连接mssql出现错误号码18456的问题 笔者提供一个可能会没考虑到的点. 请检查本机是否安装了mssql!!! 请检查本机的ms ...

  10. js 正序、倒序、按字段排序方法

    js 基础--sort方法: arrayObject.sort(sortby); 参数:定义排序规则(正序.倒序.按字段排序)的函数: 返回值:对数组的引用.请注意,数组在原数组上进行排序,不生成副本 ...