一. 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. 大厂高级工程师面试必问系列:Java动态代理机制和实现原理详解

    代理模式 Java动态代理运用了设计模式中常用的代理模式 代理模式: 目的就是为其他对象提供一个代理用来控制对某个真实对象的访问 代理类的作用: 为委托类预处理消息 过滤消息并转发消息 进行消息被委托 ...

  2. mysql 索引介绍与运用

    索引 (1)什么是索引? 是一种提升查询速度的 特殊的存储结构. 它包含了对数据表里的记录的指针,类似于字典的目录. 当我们添加索引时会单独创建一张表来去存储和管理索引,索引比原数据大,会占用更多的资 ...

  3. Spring boot中相关的注解

    一.相关类中使用的注解 @RestController:REST风格的控制器 @RequestMapping:配置URL和方法之间的映射 @SpringBootApplication:应用程序入口类 ...

  4. gpasswd简单记录

    gpasswd [option] GROUP 一切都是为了权限 gpasswd常用参数: -a, --add  USER 将user用户加入到组中 -d, --delete  USER 将user用户 ...

  5. ORB随便记一记

    论文摘取 (这部分看的是泡泡机器人的翻译) 基于特征点.单目.完全自动初始化,基于PTAM框架. 相关工作 A.位置识别(大概是用于回环检测) bags of words FAB-map DBOW2 ...

  6. 小 W 离职了

    今天这篇是架构师大刘的系列故事 小W要离职了,大刘并没有挽留,甚至有点庆幸. 小W离职的原因比较简单,这次升职加薪,大刘提拔了和他同期进来,并且工作年限和他差不多的小L,而小W则是原地没动,薪水也没有 ...

  7. jquery性能优化建议-上篇

    一.注意定义jQuery变量的时候添加var关键字这个不仅仅是jQuery,所有javascript开发过程中,都需要注意,请一定不要定义成如下:$loading = $('#loading'); / ...

  8. shell脚本(6)-shell数组

    一.数组介绍 一个变量只能存一个值,现实中很多值需要存储,可以定义数组来存储一类的值. 二.基本数组  1.概念: 数组可以让用户一次性赋予多个值,需要读取数据时只需通过索引调用就可以方便读出. 2. ...

  9. LC-322. 零钱兑换

    322. 零钱兑换 给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 amount ,表示总金额. 计算并返回可以凑成总金额所需的 最少的硬币个数 .如果没有任何一种硬币组合能组成总金 ...

  10. Spring,Spring-boot(一)

    前言 Spring作为java开源世界第一开源框架,已经成为事实上的Java EE开发标准. 最根本的使命就是简化Java开发. 不重复制造车轮 Don't reinvent the wheel .从 ...