ARM 处理器 ~ 中断与异常

发布者:老卫最新更新时间:2020-04-23 来源: eefocus关键字:ARM  处理器  中断与异常 手机看文章 扫描二维码
随时随地手机看文章

中断与异常

定义

ARM 中的工作模式除 User 和 System 外,均为异常模式,这里的异常是广义的,包含以下三类情况


外部中断(外部中断)

由于 CPU 外部的原因而改变程序执行流程,属于异步事件,可以屏蔽


软件中断(自陷)

通过处理器拥有的软件指令,可预期地使正在执行的程序改变执行流程,以执行特定的程序

显式的事件,无条件执行

属同步事件,且不可屏蔽

例如 Motorola 68000 系列的 Trap 指令、ARM 中的 SWI、Intel 8086 中的 INT

异常

由 CPU 内部的原因(如非法指令)或外部的原因(如访存错误)引起的事件

没有对应的处理器指令

异常发生时,处理器无条件地挂起当前运行的程序,去执行特定的处理程序

属同步事件,且不可屏蔽

ARM 处理器把上述三种事件以异常模式来处理,通过异常向量来响应。ARM 的每个异常向量中存放的是一条指令(一般是跳转指令),异常发生时,CPU 自动到指定的向量地址读取该指令并执行。


异常向量表

ARM 的异常向量一般是完成程序跳转的指令


在 ARM720T,ARM9 系列及以后的内核中,异常向量表可放置在 0xFFFF0000 开始的高位地址空间

异常向量表

具体内容

异常向量表内容

如果异常处理程序的起始地址位于 32MB 的范围内,可以直接用分支指令完成跳转

如果异常处理程序的起始地址是一个合法的 ARM 指令立即数(可由0~255内的数循环右移偶数位得到),则可以用数据传输指令将该地址加载到 PC 中


其他情况需采用 LDR 指令完成对 PC 的加载


ARM 引起的异常事件类型

综合

异常响应过程

当一个异常产生,处理器核会

把 CPSR 的内容拷贝到对应模式下的 SPSR_< mode> 寄存器

设置 CPSR 的相关位(改变到ARM态、改变到异常模式 、关闭中断(如果适合))

把返回地址保存在对应模式下的 LR_< mode> 寄存器中

把 PC 拨到异常向量表地址

从异常返回,异常处理程序需要

从 SPSR_< mode> 恢复 CPSR

把 PC 拨到 LR_< mode> 指向的地址(返回地址加载到 PC)

以上只能在 ARM 状态完成

Reset 异常

Reset 被触发时,CPU 进入 Supervisor 模式并禁止 FIQ 和 IRQ


R14_svc = 不确定的值

SPSR_svc = CPSR

CPSR[4:0] = 0b10011   ;进入管理模式

CPSR[5] = 0           ;在ARM态中执行

CPSR[6] = 1           ;禁止快速中断FIQ

CPSR[7] = 1           ;禁止普通中断IRQ


未定义指令异常

触发该异常,有两种情形


CPU 执行一条协处理器指令,未等到任何协处理器的应答

CPU 执行一条未被定义的指令时

一旦发生该异常,CPU 将完成如下动作


R14_und = 未定义指令的下一条指令地址

SPSR_und = CPSR

CPSR[4:0] = 0b11011   ;进入未定义模式

CPSR[5] = 0           ;在ARM态中执行

CPSR[7] = 1           ;禁止普通中断IRQ


常用的异常返回方式


MOVS PC, R14      ;跳过发生异常的指令

SUBS PC, R14, #4  ;重新执行发生异常的指令


软件中断异常

执行 SWI 指令时触发,主要用于进入 OS 的系统调用

软中断

R14_svc = SWI指令的下一条指令地址

SPSR_svc = CPSR

CPSR[4:0] = 0b10011   ;进入管理模式

CPSR[5] = 0           ;在ARM态中执行

CPSR[7] = 1           ;禁止普通中断IRQ


常用的异常返回方式:MOVS PC, R14


指令预取异常

读取指令时发生读内存错误时被标记为中止,该指令还要执行时触发该异常,若未执行,不触发该异常


即 CPU 试图执行已被标记为无效的指令时,触发该异常


R14_abt = 中止指令的下一条指令地址

SPSR_abt = CPSR

CPSR[4:0] = 0b10111   ;进入中止模式

CPSR[5] = 0           ;在ARM态中执行

CPSR[7] = 1           ;禁止普通中断IRQ


常用的异常返回方式:SUBS PC, R14, #4


数据中止异常

CPU 和存储系统之间进行加载/存储数据操作时,若发生错误则触发该异常,分为两种情况


内部中止异常

由CPU内核自己引起,如 MMU/MPU 错误,意味着需要采取正确的措施并重新执行合适的指令


外部中止异常

由存储系统引起,可能是硬件错误,可能是内存地址不存在


R14_abt = 中止指令的下一条指令地址

SPSR_abt = CPSR

CPSR[4:0] = 0b10111   ;进入中止模式

CPSR[5] = 0           ;在ARM态中执行

CPSR[7] = 1           ;禁止普通中断IRQ


常用的异常返回方式


SUBS PC, R14, #4  ;跳过发生异常的指令

SUBS PC, R14, #8  ;返回到发生异常的指令


IRQ

当外部IRQ输入请求发生并且IRQ中断响应已经被使能,触发该异常


R14_irq = 下一条指令地址

SPSR_irq = CPSR

CPSR[4:0] = 0b10010   ;进入IRQ模式

CPSR[5] = 0           ;在ARM态中执行

CPSR[7] = 1           ;禁止普通中断IRQ


常用的异常返回方式:SUBS PC, R14, #4


FIQ

当外部 FIQ 输入请求发生并且 FIQ 中断响应已经被使能,触发该异常


通常用于快速传输数据


R14_fiq = 下一条指令地址

SPSR_fiq = CPSR

CPSR[4:0] = 0b10001   ;进入FIQ模式

CPSR[5] = 0           ;在ARM态中执行

CPSR[6] = 1           ;禁止快速中断FIQ

CPSR[7] = 1           ;禁止普通中断IRQ


常用的异常返回方式:SUBS PC, R14, #4


异常返回

除复位异常外,其他异常在处理完成后都可以返回异常发生时被打断的程序中继续执行

通常在异常处理程序的最后使用一条数据传输指令来完成

在异常模式下,在指令后加后缀 ’ S ’ ,将 PC 作为目标寄存器,这样不仅将更新 PC 的值,还会将 SPSR 寄存器的内容加载到 CPSR 中

校正返回地址的一大原因是 ARM 处理器的流水线

计算返回地址的注意点

发生异常时 PC 的值是否已经更新

异常返回后被中断的指令是否还需要执行

LR = PC - 4


异常优先级

异常被赋以了优先级,据此决定被响应的顺序

异常优先级

在所有异常的入口,IRQ 中断被屏蔽,只有重新被使能才可触发内核响应(如中断嵌套处理)


在 FIQ 和 Reset 异常的入口,FIQ 中断被屏蔽


异常处理中的寄存器使用

异常发生时伴随的模式切换意味着, 被调用的异常处理程序会访问

它自己的堆栈指针 (SP_)

它自己的链接寄存器 (LR_)

它自己的备份程序状态寄存器 (SPSR_)

如果是 FIQ异常处理,5个其它的通用状态寄存器 (r8_FIQ to r12_FIQ)

其它寄存器和原来模式下的寄存器是相同的

在外部接口上,堆栈指针(SP_) 必须保持8字节对齐

异常处理程序在返回前必须保证其它(被破坏的寄存器) 被重新载入,以恢复到异常发生前的状态

这可以通过将工作(即被破坏)寄存器的内容压栈,而在返回前出栈恢复来完成

应用的初始化代码将执行必要的寄存器初始化工作

中断处理

ARM 可响应两个外部中断请求信号,FIQ 和 IRQ


FIQ 中断比 IRQ 中断的优先级更高


当多个中断发生时,首先处理 FIQ

在响应 FIQ 中断时屏蔽 IRQ 中断(和 FIQ中断),直到 FIQ 中断处理程序完成,IRQ 中断才会被处理

以下设计使得 IFQ 尽快的响应


FIQ 向量在异常向量表的最后,使 FIQ 处理程序可以直接从 FIQ 向量开始,省去跳转的时间

FIQ 模式下有五个额外的寄存器 (R8_FIQ to R12_FIQ),这些寄存器在进入和退出 FIQ 时不需保存和恢复

FIQ 中断在 FIQ 中断处理程序的入口是被屏蔽的,需要重新使能(FIQ 中断源可以有多个,但是为了最好的系统性能应该避免 FIQ 中断的嵌套)

绝大多数基于 ARM 的系统有两个以上的中断源,因此需要一个中断控制器 (通常是内存映射编址))来控制中断信号如何进入 ARM 芯片

多级中断

关键字:ARM  处理器  中断与异常 引用地址:ARM 处理器 ~ 中断与异常

上一篇:Arm架构异常处理流程之中断
下一篇:ARM异常与中断处理

推荐阅读最新更新时间:2024-11-10 10:35

基于LPC2114处理器实现人形机器人控制系统的设计
1 系统方案设计 人形机器人控制系统包括机器人控制器和机器人遥控器两部分。其中控制器以飞利浦公司的ARM7处理器为核心,包含17个舵机控制驱动电路与接口、串口通信调试电路、遥控接口、电源等。通过串口下载和传输控制信息。机器人遥控器使用无线模块向机器人控制器发送指令,控制机器人完成规定动作。 2 硬件设计 人形机器人控制器主板由控制核心LPC2114、电源及检测电路、外部晶振、JTAG调试接口、串口模块、遥控模块、舵机接口、LED指示灯等组成,组成框图如图1所示。 LPC2114基于一个支持实时仿真和跟踪的32位ARM7TDMI-S CPU,并带有128 k字节的高速Flash存储器,非常小的LQFP64封装、极低的功耗、2
[单片机]
基于LPC2114<font color='red'>处理器</font>实现人形机器人控制系统的设计
Arm 生态系统为物联网奠定信任根基
物联网 (IoT) 现正处在一个意义非凡的时刻 。随着人工智能 (AI) 的快速发展,云原生 DevOps 开发方式在数据中心之外迅速扩展,以及越来越多大规模的设备和计算的部署,物联网行业面临着一个明显的拐点——支持和管理潜在巨大规模的物联网部署所需的必要技术已经达到了成熟的临界点。物联网正在扩大规模并加速发展,进而驱动着全新的经济。而 Arm 生态系统正是这一巨大机遇背后的推动力。 Arm 之所以是物联网成功的关键,有以下三大主要原因 。首先,它是目前承载智能物联边缘算力的主要架构。在 2021 年出货的近 300 亿颗基于 Arm 架构的芯片中,有 2/3(近 200 亿颗)被部署到了物联网和嵌入式应用中。这是一个非常惊
[物联网]
TI Sitara AM574x处理器贸泽即将发售
专注于引入新品并提供海量库存的电子元器件分销商贸泽电子 (Mouser Electronics) 即日起备货Texas Instruments (TI) 的Sitara™AM574x处理器。这些基于Arm® Cortex®的器件具有很高的处理能力,旨在满足各种现代嵌入式应用领域的高强度处理需求,这些应用包括工业通信、人机界面 (HMI) 以及自动化和控制等。 贸泽分销的TI Sitara AM574x处理器采用了带Arm Neon™扩展的双核Arm Cortex-A15精简指令集计算机 (RISC) CPU以及两个TI C66x浮点DSP核心,包含两个双核可编程实时单元和工业通信子系统 (PRU-ICSS),可用于各种工
[嵌入式]
TI Sitara AM574x<font color='red'>处理器</font>贸泽即将发售
更强劲!苹果发布八核A12X处理器
10月30日的这场发布会,苹果节奏非常快,而好多年没更新的产品都获得了更新,比如Mac mini,当然还有新版的MacBook Air,不过我们还是来看看新iPad Pro上的A12X处理器。A12X处理器也采用了台积电的7nm工艺制程,不过相比A12更夸张的是,它拥有100亿个晶体管(A12只有69亿个),至于这颗处理器的性能,苹果直接强调,超越了目前92%便携PC的处理器性能。 这次的A12X变成了八核处理器,其内置有八颗CPU核心,同时还有七核GPU(苹果自主设计),支持曲面细分和多层渲染、无损内存压缩,至于GPU的性能,苹果表示相比上一代iPad Pro翻一番。 虽然性能进一步提升,但是功耗并不会有所降
[嵌入式]
更强劲!苹果发布八核A12X<font color='red'>处理器</font>
ARM核心板在脑电监测TCI注射泵中的应用
1.1背景事件 针对患者手术中麻醉剂的施用,当麻醉剂量超标时,容易造成患者心跳、呼吸骤停从而造成脑损伤。传统的麻醉剂注射依靠麻醉师的经验,而新型的脑电监测TCI注射泵则将BIS(脑电监测)与TCI(靶控输注)相结合,真正在医疗电子中实现个体化镇静麻醉,减少麻醉风险。 1.2脑电监测TCI注射泵控制主板功能需求 脑电监测TCI注射泵在常规注射泵基础上,通过接收“脑电分析仪”的数据来进行分析决策注射量和注射速度,使注射更加科学,更加安全。 控制主板主要功能需求 : 显示接口,外接7寸以上真彩液晶,支持触摸屏; RS-232接口,连接脑电分析仪; PWM,控制注射电机; ADC,采集注射管位置数据信息; 声卡,注射过程提示
[医疗电子]
<font color='red'>ARM</font>核心板在脑电监测TCI注射泵中的应用
TI Jacinto™7处理器加速ADAS和网关技术大规模应用速度
德州仪器(TI)推出了全新的Jacinto™ 7处理器平台。新型Jacinto™处理器平台基于TI数十年的汽车系统和功能安全知识,具有强化的深度学习功能和先进的网络处理,以解决高级驾驶辅助系统(ADAS)和汽车网关应用中的设计挑战。 平台系列中首先面世的两款汽车级芯片,即应用于ADAS的TDA4VM处理器和应用于网关系统的DRA829V处理器,包含用于加速数据密集型任务的专用加速器,如计算机视觉和深度学习。此外,TDA4VM和DRA829V处理器包含支持功能安全的微控制器(MCU),使得汽车厂商(OEM)和一级供应商能够用单芯片同时支持ASIL-D高安全要求的任务和功能。这两款芯片共享一套软件平台,使得开发人员能够在多个车辆域
[汽车电子]
TI Jacinto™7<font color='red'>处理器</font>加速ADAS和网关技术大规模应用速度
ARM裸机开发中内存管理库RT_HEAP的使用
在使用arm芯片进行裸机开发的时候,很多时候都需要内存管理的功能,我们可以使用自己写的内存管理程序,也可以直接使用标准库,不过我一般比较喜欢标准库,速度快,今天就来说说在C语言环境下怎么样进行内存的动态使用 首先,应该初始化C堆,初始化代码如下 #include malloc.h #pragma import (__use_realtime_heap) //这个函数在rt_heap.h中声明,需要用户自己去实现,返回任意值 unsigned __rt_heap_extend(unsigned size, void **block) { return 0; } void MallocInit(void
[单片机]
gsm库(libgsm)在ARM-Linux下的移植
GSM是常见的VOIP的语音编解码库,在Linux下用libgsm来实现。在项目中需要用到libgsm库。因此试着直接编译GSM库来编译.官网已经停止服务了,因此在这个网址下了最新版来编译 解压后发现,这个Makefile是一个手写而非 Au toconf生成的Makefile,并且只有编译静态库,而没有常见的动态库的Makefile. 因此将其修改一下,使用其能在ARM编译并且成动态库。这也是一个典型的Makefile的修改练习,如果想编译成静态库,简单把 LIBEXT 改成 a即可 # Copyright 1992-1996 by Jutta Degener and Carsten Bormann, Technis
[单片机]
gsm库(libgsm)在<font color='red'>ARM</font>-Linux下的移植
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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