一. 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  异常中断处理  程序执行 引用地址:ARM—异常中断处理

上一篇:S3C2440—11.und异常
下一篇:S3C2440—10.代码重定位

推荐阅读

在刚开始学习STM32单片机的时候,我们会遇到这样的问题:#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) /* #define STM32F10X_LD...
当前主流锂电池使用液态电解质,这存在起火等安全隐患,且特定体积内能够储存的能量有限。但能解决这些问题的下一代固态锂电池仍存在很多尚未攻克的难题。8月21日,顶级学术期刊《Matter》刊登中国科学技术大学的马骋教授和他的合作者最新成果,他们提出来一种新策略,可以有效解决下一代固态锂电池中电极材料和固态电解质接触差这一关键问题,合成出的固...
据外媒报道,美国海军研究实验室的研究团队发现,在设计结构电池的两种主要方法中(采用具有去耦合功能的单功能材料或具有耦合功能的多功能材料),依赖于单功能材料的解耦结构电池,通常比耦合结构电池具有更高的弹性模量和比能量值。图片来源:greencarcongress研究人员的分析还表明,要进一步开发下一代结构电池,应着眼于高能量密度的铝-空气电池和锌-...
上一节给大家介绍了基于标准库STM8单片机GPIO的驱动,本节课主要给大家介绍一下STM8定时器的驱动。我们先打开STM8L10x单片机的规格书,简单的了解一下STM8L10X单片机的定时器功能。如果所示,STM8L10x单片机共有3个定时器,分别是TIM2、TIM3、TIM4.其中TIM2和TIM3是16位的基本定时器,TIM4是8位定时器。因TIM2和TIM3是16位,所以定时时间更长,功能更加强...

史海拾趣

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved