ARM架构异常中断处理流程

发布者:a407895356最新更新时间:2020-03-14 来源: eefocus关键字:ARM架构  异常中断  处理流程 手机看文章 扫描二维码
随时随地手机看文章

在ARM体系中通常有以下3种方式控制程序的执行流程:


在正常程序执行过程中,每执行一条ARM指令,程序计数器寄存器(PC)的值加4个字节;每执行一条Thumb指令,程序计数器寄存器(PC)的值加两个字节。整个过程是顺序执行。


通过跳转指令,程序可以跳转到特定的地址标志处执行,或者跳转到特定的子程序处执行。其中,B指令用于执行跳转操作;BL指令在执行跳转动作的同时,保存子程序的返回地址;BX指令在执行跳转操作的同时,根据目标地址的最低位可以将程序状态切换到Thumb状态;BLX指令执行3个操作:跳转到目标地址处执行,保存子程序的返回地址,根据目标地址的最低位可以将程序状态切换到Thumb状态。


当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程序退出时,要恢复被中断的程序的执行现场。本文讨论ARM体系中的异常中断机制。


ARM体系中异常中断种类:


ARM体系中异常中断如下面的介绍。


复位(Reset):当处理器的复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行。复位异常中断通常用在下面两种情况下:系统加电时,系统复位时,跳转到复位中断向量处执行,称为软复位。


未定义指令(Undefined):当ARM处理器或者是系统中的协处理器认为当前指令未定义时,产生未定义的指令异常中断。可以通过该异常中断机制仿真浮点向量运算。


软中断(software interrupt):这是一个由用户定义的中断指令。可用于用户模式下的程序调用特权操作指令。在实时操作系统(RTOS)中可以通过该机制实现系统功能调用。


指令预取中止:如果处理器预取的指令的地址不存在,或者该地址不允许当前指令访问,当该被预取的指令执行时,处理器产生指令预取中止异常中断。


数据访问中止:如果数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问中止异常中断。


外部中断请求(IRQ):当处理器的外部中断请求引脚有效,而且CPSR寄存器中的I控制位被清除时,处理器产生外部中断请求异常中断。系统中各个外设通常通过该异常中断请求处理器服务。


快速中断请求(FIQ):当处理器的外部快速中断请求引脚有效,而且CPSR寄存器中的F控制位被清除时,处理器产生外部中断请求(FIQ)异常中断。


异常中断向量表及异常中断优先级:


中断异常向量表中指定了个异常中断及其处理程序的对应关系。它通常存放在存储地址的低端。在ARM体系中,异常中断向量表的大小为32个字节。其中,每个异常中断占据4个字节大小,保留4个字节空间。


每个异常中断对应的中断向量表中的4个字节的空间中存放了一个跳转指令或者一个向PC寄存器中赋值的数据访问指令。通常这两种指令,程序将跳转到相应的异常中断处理程序处执行。


当几个异常中断同时发生时,就必须按照一定的次序来处理这些异常中断。在ARM中通过给异常中断赋予一定的优先级来实现这种处理次序。当然有异常中断是不可能同时发生的,如指令预取中止异常和软中断(SWI)异常中断是由同一条指令的执行触发的,它们是不可能同时发生的。处理器执行某个特定的异常中断的过程中,称为处理器处于特定的中断模式。各异常中断的中断向量地址以及中断的处理优先级如下表所示。

image.png

异常中断使用的寄存器:

各异常中断对应着一定的处理器模式。应用程序通常运行在用户模式下。ARM中的处理器模式如下表所示。

image.png

各种不同的处理器模式可能有对应于该处理器模式的物理寄存器组,如下表所示。其中R13_svc表示特权模式下的R13寄存器,R13_abt表示中止模式下的R13寄存器,其余的各寄存器名称含义类推。

如果异常中断处理程序中使用它自己的物理寄存器之外的其他寄存器,异常中断处理程序必须保存和恢复这些寄存器。在上表中各物理寄存器名称在ARM汇编中并没有被预定义。用户使用这些寄存器时,必须使用伪操作RN来定义这些名称。如可以通过下面操作定义寄存器名称R13_svc:

常中断处理程序中使用它自己的物理寄存器之外的其他寄存器,异常中断处理程序必须保存和恢复这些寄存器。在上表中各物理寄存器名称在ARM汇编中并没有被预定义。用户使用这些寄存器时,必须使用伪操作RN来定义这些名称。如可以通过下面操作定义寄存器名称R13_svc:


R13_svc RN R13


进入和退出异常中断的过程:


下面介绍处理器对于各种异常中断的响应过程以及从异常中断处理程序中返回的方法。对于不同的异常中断处理程序,返回地址以及使用的指令是不同的。


ARM处理器对异常中断的响应过程如下:


(1).保存处理器当前状态、中断屏蔽位以及各条件标志位。这是通过将当前程序状态寄存器CPSR的内容保存到将要执行的异常中断对应的SPSR寄存器中实现的。各异常中断有自己的物理SPSR寄存器。

(2).设置当前程序状态寄存器CPSR中相应的位。包括设置CPSR中的位,使处理器进入相应的执行模式;设置CPSR中的位,禁止IRQ中断,当进入FIQ模式时,禁止IRQ中断。

(3).将寄存器lr_mode设置成返回地址。

(4).将程序计数器(PC)值,设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。


上述的处理器对异常中断的响应过程可以用如下的伪代码描述。


R14_ = return link

SPSR_ = CPSR

CPSR[4:0] = exception mode number

/* 当运行于ARM状态时 */

CPSR[5] = 0

/* 当相应FIQ异常中断时,禁止新的FIQ中断 */

if == RESET or FIQ then

CPSR[6] = 1

/* 禁止新的FIQ中断 */

CPSR[7] = 1

PC = exception vector address

1.响应复位异常中断

当处理器的复位引脚有效时,处理器终止当前指令。当处理器的复位引脚变成无效时,处理器开始执行下面的操作。


R14_svc = UNPREDICATBLE value

SPSR_svc = UNPREDICATBLE value

/* 进入特权模式 */

CPSR[4:0] = 0b10011

/* 切换到ARM状态 */

CPSR[5] = 0

/* 禁止FIQ异常中断 */

CPSR[6] = 1

/* 禁止IRQ中断 */

CPSR[7] = 1

if high vectors configured then

PC = 0XFFFF0000

else

PC = 0X00000000

2.响应未定义指令异常中断

处理器响应未定义指令异常中断时的处理过程如下面的伪代码所示。


R14_und = address of next instruction after the undefined instruction

SPSR_und = CPSR

/* 进入未定义指令异常中断 */

CPSR[4:0] = 0b11011

/* 切换到ARM状态 */

CPSR[5] = 0

/* CPSR[6]不变 */

/* 禁止IRQ异常中断 */

CPSR[7] = 1

if high vectors configured then

PC = 0xFFFF0004

else 

PC = 0x00000004

3.响应SWI异常中断

处理器响应SWI异常中断的处理过程如下面的伪代码所示。


R14_svc = address of next instruction after the SWI instruction

SPSR_svc = CPSR

/* 进入特权模式 */

CPSR[4:0] = 0b10011

/* 切换到ARM状态 */

CPSR[5] = 0

/* CPSR[6]不变 */

/* 禁止IRQ异常中断 */

CPSR[7] = 1

if high vectors configured then

PC = 0xFFFF0008

else 

PC = 0x00000008

4.响应指令预中止异常中断

处理器响应指令预取中止异常中断时的处理过程如下面的伪代码所示。


R14_abt = address of the aborted instruction+4

SPSR_abt = CPSR

/* 进入指令预取中止模式 */

CPSR[4:0] = 0b10111

/* 切换到ARM状态 */

CSPR[5] = 0

/* CPSR[6]不变 */

/* 禁止IRQ异常中断 */

CPSR[7] = 1

if high vectors configured then

PC = 0xFFFF000C

else 

PC = 0x0000000C

5.响应数据访问中止异常中断

处理器响应数据访问中止异常中断时的处理过程如下面的伪代码所示。


R14_abt = address of the aborted instruction+8

SPSR_abt = CPSR

/* 进入数据访问中止 */

CPSR[4:0] = 0b10111

/* 切换到ARM状态 */

CSPR[5] = 0

/* CPSR[6]不变 */

/* 禁止IRQ异常中断 */

CPSR[7] = 1

if high vectors configured then

PC = 0xFFFF0010

else 

PC = 0x00000010

6.响应IRQ异常中断

处理器响应IRQ异常中断时的处理器过程如下面的伪代码所示。


R14_irq = address of next instruction to be executed + 4

SPSR_irq = CPSR

/* 进入IRQ异常中断模式 */

CPSR[4:0] = 0b10010

/* 切换到ARM状态 */

CSPR[5] = 0

/* CPSR[6]不变 */

/* 禁止IRQ异常中断 */

CPSR[7] = 1

if high vectors configured then

PC = 0xFFFF0018

else 

PC = 0x00000018

7.响应FIQ异常中断

处理器响应FIQ异常中断时的处理器过程如下面的伪代码所示。


R14_fiq = address of next instruction to be executed + 4

SPSR_fiq = CPSR

/* 进入FIQ异常中断模式 */

CPSR[4:0] = 0b10001

/* 切换到ARM状态 */

CSPR[5] = 0

/* 禁止FIQ中断 */

CPSR[6] = 1

/* 禁止IRQ异常中断 */

CPSR[7] = 1

if high vectors configured then

PC = 0xFFFF001C

else 

PC = 0x0000001C

从异常中断处理程序中返回包括下面两个基本操作:


恢复被中断的程序的处理器状态,即将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。

返回到发生异常中断的指令的下一条指令处执行,即将lr_mode寄存器的内容复制到程序计数器PC中。

复位异常中断处理程序不需要返回。整个应用系统是从复位异常中断处理程序开始执行的,因为它不需要返回。


实际上,当异常中断发生时,程序计数器PC所指的位置对于各种不同的异常中断是不同的。同样,返回地址对于各种不同的异常中断也是不同的。下面详细介绍各种异常中断处理程序的返回方法。


1.SWI和未定义指令异常中断处理程序的返回

SWI和未定义指令异常中断是由当前执行的指令自身产生的,当SWI和未定义指令异常中断发生时,程序计数器PC的值还未更新,它指向当前指令后面第2条指令。当SWI和未定义指令异常中断发生时,处理器将值(PC-4)保存到异常模式下的寄存器lr_mode中。这时(PC-4)即指向当前指令的下一条指令。因此返回操作可以通过下面的指令来实现:


MOV PC LR

指令寄存器LR中的值复制到程序计数器PC中,实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。


当异常中断处理程序使用了数据栈时,可以通过下面的指令在进入异常中断处理程序时保存被中断程序的执行现场,在退出异常中断处理程序时恢复被中断程序的执行现场。异常中断处理程序中使用的数据栈由用户提供。


stmfd sp!, {reglist,lr}

....

ldmfd sp!, {reglist,pc}^

在上述指令中,reglist是异常中断处理程序中使用的寄存器列表。标识符^指示将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。该指令只能在特权模式下使用。


2.IRQ和FIQ异常中断处理程序的返回

通常处理器执行完当前指令后,查询IRQ中断引脚和FIQ中断引脚,并且查看系统是否允许FIQ中断及IRQ中断。如果有中断引脚有效,并且系统允许该中断发生,处理器将产生IRQ异常中断或FIQ异常中断。当IRQ和FIQ异常中断产生时,程序计数器PC的值已经更新,它指向当前指令后面第3条指令。当IRQ和FIQ异常中断发生时,处理器将值(PC-4)保存到异常模式下的寄存器lr_mode中。这时(PC-4)即指向当前指令后的第2条指令。因此返回操作可以通过下面的指令来实现:


SUB PC, LR, #4

该指令将寄存器LR中的值减4后,复制到程序计数器PC中,实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。


当异常中断发处理程序使用了数据栈时,可以通过下面的指令在进入异常中断处理程序时保存被中断程序的执行现场,在退出异常中断处理程序时恢复被中断程序的执行现场。异常中断处理程序中使用的数据栈由用户提供。


SUB LR, LR, #4

STMFD sp!, {reglist, lr}

...

LDMFD sp!, {reglist, pc}^

上述指令中,reglist是异常中断处理程序中使用的寄存器列表。标识符^指示将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。该指令只能在特权模式下使用。


其它异常中断返回情况请参考《ARM体系结构与编程》一书中的第9章。

关键字:ARM架构  异常中断  处理流程 引用地址:ARM架构异常中断处理流程

上一篇:ARM cortexM4 异常处理(1)
下一篇:ARM cortex-M3 异常处理分析

推荐阅读最新更新时间:2024-11-13 07:03

爆料:台积电300人的团队配合苹果自研Arm架构处理
在今晚苹果的WWDC大会上,除了iOS 14、Mac OS系统之外,最受人关注的一件事便是苹果推出Arm处理器取代使用15年之久的x86处理器了。据悉,苹果公司已经在mac电脑上测试了基于Arm的芯片,发现其性能比英特尔的替代品有了很大提高。 熟悉台积电的供应链消息人士@手机晶片达人在微博上表示,台积电有一个超过300人的专属团队(涵盖研发,设计,先进工艺,封装)在与苹果深度合作开发苹果 PC,NB...等产品下一代的CPU (不是以往的手机AP)。 与此同时,@手机晶片达人还爆料称,苹果觉得目前的绘图芯片功耗都太大,因此也在研发自己的绘图芯片,预计2022完成,采用台积电的N5P工艺。 在过去的几年中,英特尔曾多次出现处
[手机便携]
爆料:台积电300人的团队配合苹果自研<font color='red'>Arm架构</font><font color='red'>处理</font>器
脱离Intel掌控 苹果传推ARM架构Mac产品
    相关消息指出,苹果可能着手研发、测试采ARM架构处理器Mac系列,并且将搭载兼容ARM架构的新版OS X操作系统,未来或许将进一步让MacBook系列产品带机使用时间更长。 ARM架构处理器效能直逼x86 电力损耗更低 根据9to5Mac网站引述MacBidouille网站消息指出,苹果可能正着手研发、测试以ARM架构处理器的全新Mac系列产品,并且将搭载兼容ARM架构的新版OS X操作系统。此外,消息来源也表示苹果预计将于键盘模块内配置面积更大的多点触控板。 就MacBidouille网站消息来源说法,全新搭载ARM架构处理器的Mac系列,将包含iMac、Mac mini,以及13寸的MacBook系列产品,其中iMa
[手机便携]
2014年ARM架构芯片移动设备性能将与PC媲美
北京时间9月9日,在英特尔公司年度大会召开的前夕,目前在移动芯片领域处于霸主地位、同时也是英特尔在移动领域要面对的最大竞争对手ARM的高管在接受CNET采访时向外界展示了更加PC化的未来移动设备发展趋势。 目前ARM构架的芯片在全球包括智能手机和平板电脑的移动设备领域可以说是拥有绝对的霸主地位。包括三星、苹果、英伟达、高通还是联发科,几乎所有芯片厂商在产品的研发上使用的都是来自于ARM的授权技术。而这些主流的芯片厂商的产品几乎涵盖了三星Galaxy系列、谷歌Nexus系列、iPhone及HTC等市面上主流的智能手机。另一方面虽然英特尔公司在桌面处理器领域拥有绝对的优势,但是在移动领域的表现却一直都是差强人意。而现在AR
[嵌入式]
2014年<font color='red'>ARM架构</font>芯片移动设备性能将与PC媲美
苹果基于ARM架构MacBook曝光:和硕抢了头彩
和硕联合已经拿到了苹果基于ARM架构的MacBook电脑的订单。全新 ARM MacBook 的内部代号为星辰(Star),系列号码为 N84。不过和硕没有透露具体生产时间。 目前市场上已经有不少基于ARM架构的笔记本电脑产品,包括华硕、惠普、联想等老牌厂商都有产品展出。这类产品最大的特点是低功耗、长续航,不过性能如何还是个问号。在今年的台北电脑展上会有更多ARM架构的笔记本电脑问世。 有关苹果最终会推出ARM Mac的传言已经存在很长时间了。去年9月就有报告称苹果正在进行开发。这个想法背后的基本原因是,开发ARM笔记本电脑芯片将允许苹果减少对英特尔的依赖,还能更加自主地规划新品。
[家用电子]
AP2953在基于ARM架构上网本上的应用介绍
随着网络速度的提升与普及,低价位、续航时间长的上网本愈来愈受到消费者的青睐。ARM架构的上网本以其体积小、重量轻、成本低、功耗小、持久续航力、生产和维护简单而受到很多生产厂商和消费者的瞩目。飞思卡尔(Freescale)、 德州仪器 (TI, Texas Instrument)、安凯(Anyka)、三星(Samsung)等公司基于ARM架构的处理器逐步占据一定市场。ARM架构的上网本通常用两节或三节锂电供电,通过高效率降压DCDC转换成5V电压,再由5V电压转换成3.3V、2.5V、1.8V、1.2V等电压给系统内部各个部分供电。ARM架构的上网本供电结构如下:    图1:ARM架构的上网本供电结构。 突出上网本的持久续航优
[嵌入式]
Ubuntu安装ARM架构GCC工具链最简单办法
一、安装ARM-Linux-GCC工具链   只需要一句命令:   sudo apt-get install gcc-arm-linux-gnueabi   前提是你的Ubuntu系统版本是官网支持的最新的版本,若不是,请升级。执行以上命令即可。 二、使用工具链   注意!这里不能使用 gcc 命令来召唤它。它的名字是 arm-linux-gnueabi-gcc 。如果出现 Command Not Found,请关闭Terminal,再重新打开。再不行,就变成超级用户,把它添加到 PATH 中。   Tips:查看安装位置。   首先你要取得超级用户权限(临时取得权限可用命令:sudo -i) root@q
[单片机]
MCU--低功耗处理流程
现在电子产品一般都有要求低功耗,不同的MCU,进入低功耗的处理流程可能不一样,但是大致的流程还是一样。现对MCU进入低功耗的处理流程大致如下: (1)关闭MCU之外的外设电源,例如:RS485、CAN收发器模块的供电; (2)对已初始化的MCU片上外设模块进行反初始化,例如:定时器、ADC等等; (3)如果在低功耗模式下要进行定时唤醒,那此时就初始化RTC功能;如果需要外部中断唤醒,此时就需要配置相应的外部中断; (4)对初始化了的IO口进行反初始化,若IO外部被上拉到高,则配置IO推挽输出高电平;若IO外部被下拉到地,则配置IO口为高阻输入或推挽输出低电平; (5)配置未用到和悬空的IO脚,配置IO为高阻输入
[单片机]
Intel开放22及10纳米制程对ARM架构产品代工
  在2017年的 ARM TechCon大会上,在某些领域已经形成相互争关系的半导体大厂 Intel 和矽智财权厂商AMD,两者宣布将建立广泛的合作关系。在这样的关系下,其中一个相互合作的方式,就是基于 ARM 核心架构的移动芯片,预计将采用 Intel 的22纳米FFL制程技术,以及10纳米的HPM/GP制程技术来进行代工生产。下面就随手机便携小编一起来了解一下相关内容吧。   过去,在 Intel 专注的x86核心架构市场,与 ARM 核心架构专注的移动市场,彼此几乎是不太有所交集。虽然,过去Intel也曾经试图以x86核心架构,进入智能手机领域。而以ARM核心架构为主的高通,也宣布在2017年结合微软Windows10作
[手机便携]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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