ARM中异常中断处理概述
- 格式:doc
- 大小:122.50 KB
- 文档页数:6
ARM7支持六种操作模式:(1)用户模式(usr):正常的程序执行状态(2)FIQ模式(fiq):支持数据传送或通道处理(3)IRQ模式(irq):用于通用的中断处理(4)管理模式(svc):用于操作系统的保护模式(5)异常模式(abt):数据或者指令预取异常时进入(6)无定义模式(und):当无定义指令被执行时进入(7)软件控制,外部中断,异常处理都可以改变操作模式。
大部分的应用程序在用户模式下执行。
其他模式,比如管理模式,在中断、异常服务、或者访问被保护资源时进入。
ARM 的中央寄存器集是16 个用户寄存器R0 – R15。
这些寄存器均是32 位宽度,R0 – R12 没有其他特殊功能,寄存器R13 – R15在CPU中有特殊功能。
R13被用作栈指针(stack pointer,SP)。
R14被称为链接寄存器(link register, LR),当调用一个函数时返回地址被自动保存到链接寄存器,在函数返回时有效。
这使得快速进入和返回“叶”函数(不调用其他函数的函数)成为可能。
如果函数是分支的一部分(即该函数将调用另一个函数),链接寄存器必须入栈(R13)。
R15 是程序计数器(program counter, PC)。
有趣的是,许多指令也可以在R13 – R15中执行,就像它们是标准的用户寄存器。
ARM中断的问题ARM的七种异常类型---------1> 复位异常2> 数据访问中止异常3> 快速中断请求异常4> 一般中断请求5> 预取指令异常6> 软件中断异常7> 未定义异常-------------------------问题:1> 为什么除了进入复位异常模式外,在别的异常处理模式中都允许FIQ中断?2> 数据访问中止异常的优先级大于 FIQ异常,为什么在数据访问异常处理模式中,还允许 FIQ中断?这样不就成了:在高优先级异常处理中允许低优先级的中断发生?即使这样,因为FIQ中断的优先级 < 数据异常中断优先级,也不会进入 FIQ中断处理程序啊,这样不就更没有用处了??ARM体系的各种异常的分析(学习日记)- [ARM7TDMI]版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明/logs/10669519.html1.复位异常(1)当内核的nRESET信号被拉低时,ARM处理器放弃正在执行的指令,当nRESET信号再次变高时,ARM处理器进行复位操作;(2)系统复位后,进入管理模式对系统进行初始化,复位后,只有PC(0x00000000)和CPSR (nzcvqIFt_SVC)的值是固定的,另外寄存器的值是随机的。
arm异常处理 el级别ARM异常处理 EL级别ARM处理器是一种广泛应用于嵌入式系统和移动设备的处理器架构。
在ARM架构中,异常处理是一种重要的机制,用于处理硬件或软件引发的异常情况。
其中,EL级别异常(Exception Level)是ARM处理器中一种特殊的异常级别,本文将详细介绍EL级别异常处理的相关内容。
一、EL级别异常概述在ARM处理器中,异常分为四个级别:EL0、EL1、EL2和EL3。
EL0是用户级别,用于运行应用程序;EL1是内核级别,用于操作系统内核的运行;EL2和EL3是虚拟化扩展级别,用于虚拟化和安全扩展。
EL级别异常是指在特定级别下发生的异常情况。
二、EL级别异常分类EL级别异常主要分为同步异常和中断异常两类。
1. 同步异常同步异常是指由当前指令执行引起的异常,包括:- 未定义指令异常:执行未定义的指令时触发的异常。
- 系统调用异常:执行系统调用指令(例如Linux中的int 0x80)时触发的异常。
- 中止异常:执行中止指令(例如ARM的bkpt指令)时触发的异常。
- 数据访问异常:读写未映射内存、权限不足或对只读内存进行写操作时触发的异常。
2. 中断异常中断异常是指由外部中断或定时器中断引起的异常,包括:- 外部中断:来自外部设备的中断信号,如键盘输入、网络数据到达等。
- 定时器中断:由定时器触发的周期性中断信号。
三、EL级别异常处理流程EL级别异常处理的基本流程如下:1. 异常触发当发生同步异常或中断异常时,ARM处理器会自动进入异常模式,并切换到相应的EL级别。
2. 异常处理器异常处理器是用于处理异常的特殊代码段,通常由操作系统提供。
在异常模式下,ARM处理器会跳转到异常处理器的入口地址。
3. 异常处理异常处理器根据异常类型进行相应的处理,可能包括:- 保存当前上下文:将当前被打断的程序状态保存到特定的寄存器或栈中,以便在异常处理完成后能够恢复执行。
- 处理异常原因:根据异常类型进行相应的处理,如处理未定义指令异常、权限异常等。
arm处理器异常中断响应过程ARM处理器是一种广泛应用于移动设备、嵌入式系统和服务器等领域的处理器架构。
在运行过程中,处理器可能会遇到各种异常情况,如访问非法内存、除零错误等。
当这些异常发生时,ARM处理器需要做出相应的中断响应,以保证系统的稳定性和安全性。
ARM处理器异常中断响应的过程可以分为异常触发、异常处理和恢复执行三个阶段。
首先是异常触发阶段。
当处理器在执行指令时,发生了某种异常情况,例如访问了非法的内存地址,处理器会立即检测到异常,并将当前指令的状态保存起来。
同时,处理器会根据异常类型,确定异常向量的地址,将控制转移到异常向量所指向的地址处。
接下来是异常处理阶段。
当处理器进入异常向量所指向的地址时,会执行相应的异常处理程序。
这个程序通常是由操作系统或应用程序提供的,用于处理不同类型的异常。
在异常处理程序中,可以进行一系列的操作,例如保存现场、记录异常信息、处理异常原因等。
处理程序还可以根据需要选择继续执行或终止当前指令。
最后是恢复执行阶段。
在异常处理程序执行完毕后,处理器会根据异常返回地址,将控制权返回到引发异常的指令处,继续执行后续指令。
在返回之前,处理器可能会进行一些必要的恢复操作,如恢复现场、清除异常状态等。
这样,系统就可以继续正常运行,不受异常的影响。
需要注意的是,ARM处理器还提供了一些特殊的异常处理方式,如中断(Interrupt)和陷阱(Trap)。
中断是外部设备触发的异常,用于异步事件的处理,例如外部设备的输入输出请求。
陷阱是由程序主动触发的异常,用于实现系统调用和调试功能。
这些异常的触发和处理方式与一般异常略有不同,但整体的处理过程仍然符合前述的异常中断响应流程。
在ARM处理器中,异常中断响应是保证系统正常运行和异常处理的关键环节。
通过合理的异常处理程序和恢复机制,可以有效地应对各种异常情况,提高系统的可靠性和稳定性。
同时,开发人员也需要根据具体应用场景和需求,灵活地配置和调整异常处理方式,以满足不同的需求。
简述arm处理器异常处理过程ARM处理器是一种常用的嵌入式处理器架构,广泛应用于移动设备、嵌入式系统和物联网等领域。
在ARM处理器的运行过程中,会出现各种异常情况,如硬件故障、软件错误等。
为了保证系统的稳定性和可靠性,ARM处理器采用了异常处理机制来处理这些异常情况。
ARM处理器的异常处理过程可以分为两个阶段:异常发生阶段和异常处理阶段。
异常发生阶段是指异常事件发生时的处理过程,而异常处理阶段是指异常事件被捕获后的处理过程。
在异常发生阶段,ARM处理器会首先检测到异常事件的发生,并保存当前的处理状态。
然后,根据异常事件的类型,ARM处理器会进入相应的异常处理程序。
ARM处理器支持的异常类型包括中断、数据终止、指令终止、外部中断等。
每种异常类型都有对应的异常处理程序。
在异常处理阶段,ARM处理器会根据异常事件的类型执行相应的异常处理程序。
异常处理程序的执行过程包括以下几个步骤:首先,ARM处理器会保存当前的处理状态,包括程序计数器、寄存器等。
然后,ARM处理器会根据异常事件的类型执行相应的异常处理代码。
异常处理代码可以是硬件中断处理程序、软件异常处理程序或操作系统内核的异常处理程序等。
在执行异常处理代码时,ARM处理器会根据异常事件的优先级进行中断屏蔽,以保证异常处理的顺序和可靠性。
最后,ARM处理器会恢复保存的处理状态,并继续执行异常处理之前的程序。
在异常处理过程中,ARM处理器还提供了一些特殊的异常处理指令,用于处理特定的异常情况。
例如,ARM处理器提供了异常返回指令,用于从异常处理程序返回到之前的程序。
此外,ARM处理器还提供了一些特殊的异常处理寄存器,用于保存异常处理过程中的状态信息。
ARM处理器的异常处理过程是一个复杂而精细的机制,能够有效地处理各种异常情况。
通过异常处理机制,ARM处理器可以保证系统的稳定性和可靠性,提高系统的容错能力和可维护性。
同时,ARM 处理器的异常处理机制也为开发者提供了一种方便和灵活的异常处理方式,可以根据实际需求进行异常处理程序的编写和调试。
ARM中断程序的原理和实现中断是计算机系统中的一种强制性事件,它能够暂停正在执行的程序,并立即转移到一个特殊的处理程序上去执行。
ARM架构的处理器也支持中断机制,为了正确处理中断,ARM定义了一套中断处理的规范和流程。
本文将介绍ARM中断的原理和实现。
一、ARM中断的原理1. 中断请求(Interrupt Request, IRQ):外部设备或其它条件触发的一种中断请求信号,用于向处理器报告需要进行中断处理的事件。
2. 中断服务例程(Interrupt Service Routine,ISR):是一段特殊的程序代码,用于处理中断事件。
当中断被触发后,处理器会跳转到对应的中断服务例程中执行,完成相应的中断处理逻辑。
3. 中断控制器(Interrupt Controller):负责接收处理器的中断请求,并将其派发给对应的中断服务例程。
1.外设或其它条件触发中断请求,发送中断信号给中断控制器。
2.中断控制器接收到中断请求后,对中断请求进行优先级判断,确定哪个中断请求最先被处理。
3.中断控制器将中断请求发送给处理器,并将处理器的执行流转移到中断服务例程上。
4.处理器执行中断服务例程,处理相应的中断事件。
5.中断服务例程执行完毕后,处理器返回到中断发生前的状态,继续执行原程序。
二、ARM中断的实现1.配置中断控制器ARM架构提供了多种中断控制器,如VIC(Vectored Interrupt Controller)和GIC(Generic Interrupt Controller)等。
具体的中断控制器的选择和配置方式根据具体的处理器和系统架构而定。
配置中断控制器的基本步骤如下:(1)开启中断:通过设置相关的寄存器,使能中断功能。
(2)配置中断优先级:对不同中断请求进行优先级的设置,确保高优先级的中断能够被及时处理。
(3)分配中断服务例程:将不同的中断请求与相应的中断服务例程关联起来,当中断请求触发时,中断服务例程能够被正确执行。
ARM处理器中有7种异常情况:
快速中断请求,中断请求,预取指中止,数据中止,软件中断,未定义指令,复位
快速中断请求异常进入快中断模式,支持高速数传输及通道处理(FIQ异常响应时进入此模式)
中断请求异常进入中断模式,用于通用中断处理,(IRQ异常响应时进入此模式)
预取指中止,数据中止异常进入中止模式,用于支持虚拟内存和/或存储器保护
未定义指令异常进入未定义模式,支持硬件协处理器的软件仿真(未定义指令异常响应时进入此模式)
软件中断,复位异常进入管理模式,操作系统保护代码(系统复位和软件中断响应时进入此模式)
CPRS的I位为中断禁止位,F位为快中断禁止位。
ARMCortex-M3权威指南-中断和异常(2)中断和异常它⽀持16-4-1=11 种系统异常(同步)(保留了 4+1 个档位),外加 240 个外部中断输⼊(异步)。
在 CM3 中取消了 FIQ 的概念(v7 前的ARM 都有这个 FIQ,快中断请求),这是因为有了更新更好的机制——中断优先级管理以及嵌套中断⽀持,它们被纳⼊ CM3 的中断管理逻辑中。
因此,⽀持嵌套中断的系统就更容易实现 FIQ。
虽然 CM3 是⽀持 240 个外中断的,但具体使⽤了多少个是由芯⽚⽣产商决定。
CM3还有⼀个NMI(不可屏蔽中断)输⼊脚。
当它被置为有效(assert)时, NMI 服务例程会⽆条件地执⾏。
NMI 究竟被拿去做什么,还要视处理器的设计⽽定。
在多数情况下, NMI 会被连接到⼀个看门狗定时器,有时也会是电压监视功能块,以便在电压掉⾄危险级别后警告处理器。
向量表当 CM3 内核响应了⼀个发⽣的异常后,对应的异常服务例程(ESR)就会执⾏。
为了决定 ESR 的⼊⼝地址, CM3 使⽤了“向量表查表机制”。
这⾥使⽤⼀张向量表。
向量表其实是⼀个 WORD(32 位整数)数组,每个下标对应⼀种异常,该下标元素的值则是该 ESR 的⼊⼝地址。
向量表在地址空间中的位置是可以设置的,通过 NVIC 中的⼀个重定位寄存器来指出向量表的地址。
在复位后,该寄存器的值为 0。
因此,在地址 0 处必须包含⼀张向量表,⽤于初始时的异常分配。
举个例⼦,如果发⽣了异常 11(SVC),则 NVIC 会计算出偏移移量是11x4=0x2C,然后从那⾥取出服务例程的⼊⼝地址并跳⼊。
要注意的是这⾥有个另类: 0 号类型并不是什么⼊⼝地址,⽽是给出了复位后MSP 的初值。
CM3允许向量表重定位即从其它地址处开始执⾏各异常向量。
这些地址对应的区域可以是代码区,但也可以是 RAM 区。
在 RAM区就可以修改向量的⼊⼝地址了。
为了实现这个功能, NVIC中有⼀个寄存器,称为“向量表偏移量寄存器”(在地址 0xE000_ED08 处),通过修改它的值就能定位向量表。
ARMv8 中断处理流程一、中断请求中断请求是由硬件或软件发起的异常信号,用于打断正在执行的指令序列,将控制权转移到中断处理程序。
在ARMv8 架构中,中断请求由中断控制器(如GIC)产生,并通过中断信号线传递给处理器核。
二、中断响应当处理器核接收到中断请求时,它会根据优先级和其他因素决定是否响应中断。
如果处理器核决定响应中断,它将执行一系列指令来保存当前执行环境的状态,并跳转到中断处理程序的入口点。
在ARMv8 架构中,中断处理程序的入口点由中断向量表(IVT)或异常向量表(EVT)指定。
三、保存上下文在中断响应过程中,处理器核需要保存当前执行环境的状态,以便在中断处理程序执行完毕后能够恢复原来的执行环境。
在ARMv8 架构中,上下文保存的操作包括:1. 保存寄存器状态寄存器(xPSR)的值;2. 保存当前指令指针(PC)的值;3. 保存堆栈指针(SP)和链接寄存器(LR)的值;4. 如果当前执行环境是异常或中断处理程序,则保存相应的程序计数器(PC)和链接寄存器(LR)的值。
四、执行异常处理程序中断处理程序的入口点通常是指向异常向量表(EVT)或中断向量表(IVT)的一个跳转指令。
当处理器核跳转到这个地址时,它会执行该地址处的指令,即异常处理程序的入口点。
在执行异常处理程序时,处理器核会根据具体的异常类型和上下文信息执行相应的操作,如执行设备驱动程序或系统调用等。
五、恢复上下文在异常处理程序执行完毕后,处理器核需要恢复原来的执行环境。
在ARMv8 架构中,上下文恢复的操作包括:1. 恢复寄存器状态寄存器(xPSR)的值;2. 恢复当前指令指针(PC)的值;3. 恢复堆栈指针(SP)和链接寄存器(LR)的值;4. 如果当前执行环境是异常或中断处理程序,则恢复相应的程序计数器(PC)和链接寄存器(LR)的值。
六、中断返回在恢复上下文后,处理器核会执行一条返回指令,将控制权从异常处理程序返回给原来的执行环境。
中断异常处理流程1.特殊中断响应与返回系统运行时,特殊可能会随时发生。
当一个特殊出现以后,ARM微处理器会执行下列几步操作:1) 将下一条指令的地址存入相应连接寄存器LR,以便程序在处理特殊返回时能从正确的位置重新开始执行。
2) 将CPSR复制到相应的SPSR中。
3) 根据特殊类型,强制设置CPSR的运行模式位。
4) 强制PC从有关的特殊向量地址取下一条指令执行,从而跳转到相应的特殊处理程序处。
这些工作是由ARM 内核完成的,不需要用户程序参与。
特殊处理完毕之后,ARM 微处理器会执行下列几步操作从特殊返回:1) 将连接寄存器LR的值减去相应的偏移量后送到PC中。
2) 将SPSR复制回CPSR中。
3) 若在进入特殊处理时设置了中断禁止位,要在此清除。
这些工作务必由用户在中断处理函数中实现。
为保证在ARM处理器发生特殊时不至于处于未知状态,在应用程序的设计中,首先要进行特殊处理。
使用的方式是在特殊向量表中的特定位置放置一条跳转指令,跳转到特殊处理程序。
当ARM处理器发生特殊时,程序计数器PC会被强制设置为对应的特殊向量,从而跳转到特殊处理程序。
当特殊处理完成以后,返回到主程序继续执行。
能够认为应用程序总是从复位特殊处理程序开始执行的,因此复位特殊处理程序不需要返回。
2.特殊处理程序设计2.1 特殊响应流程由于向量表的限制,只能有一条指令B完成32MB范围内的跳转,并不能保证所有的特殊处理函数都位于32MB范围内。
为了扩展跳转范围,需要二次跳转才能把特殊处理函数的地址传送给PC。
特殊处理调用关系如图1所示。
三星公司网站提供了test2410_r11软件包,其中2410init.s有如下代码:HandlerXXXsub sp,sp,#4 ;减少sp,储存跳转地址stmfd sp!,{r0} ;将工作寄存器压入堆栈ldr r0,=HandleXXX ;将HandleXXX地址放入r0ldr r0,[r0] ;将中断程序入口地址放入r0str r0,[sp,#4] ;将中断程序入口地址压入堆栈ldmfd sp!,{r0,pc} ;将工作寄存器与中断程序入口地址弹出到r0与PC图1特殊处理调用同时在RAM中定义了存有中断程序入口地址表_ISR_STARTADDRESS:AREA RamData, DA TA, READWRITE^ _ISR_STARTADDRESSHandleReset # 4HandleUndef # 4HandleSWI # 4HandlePabort # 4HandleDabort # 4HandleReserved # 4HandleIRQ # 4HandleFIQ # 4通常HandlerXXX位于程序入口地址32MB范围内,HandleXXX是以_ISR_STARTADDRESS为基地址的RAM中地址。
ARMlinux的中断处理过程(转)⼀、前⾔本⽂主要以ARM体系结构下的中断处理为例,讲述整个中断处理过程中的硬件⾏为和软件动作。
具体整个处理过程分成三个步骤来描述:1、第⼆章描述了中断处理的准备过程2、第三章描述了当发⽣中的时候,ARM硬件的⾏为3、第四章描述了ARM的中断进⼊过程4、第五章描述了ARM的中断退出过程本⽂涉及的代码来⾃3.14内核。
另外,本⽂注意描述ARM指令集的内容,有些source code为了简短⼀些,删除了THUMB相关的代码,除此之外,有些debug相关的内容也会删除。
⼆、中断处理的准备过程1、中断模式的stack准备ARM处理器有多种process mode,例如user mode(⽤户空间的AP所处于的模式)、supervisor mode(即SVC mode,⼤部分的内核态代码都处于这种mode)、IRQ mode(发⽣中断后,处理器会切⼊到该mode)等。
对于 kernel,其中断处理处理过程中,ARM 处理器⼤部分都是处于SVC mode。
但是,实际上产⽣中断的时候,ARM处理器实际上是进⼊IRQ mode,因此在进⼊真正的IRQ异常处理之前会有⼀⼩段IRQ mode的操作,之后会进⼊SVC mode进⾏真正的IRQ异常处理。
由于IRQ mode只是⼀个过度,因此IRQ mode的栈很⼩,只有12个字节,具体如下:struct stack {u32 irq[3];u32 abt[3];u32 und[3];} ____cacheline_aligned;static struct stack stacks[NR_CPUS];除了irq mode,linux kernel在处理abt mode(当发⽣data abort exception或者prefetch abort exception的时候进⼊的模式)和und mode(处理器遇到⼀个未定义的指令的时候进⼊的异常模式)的时候也是采⽤了相同的策略。
异常中断处理概述1.ARM中异常中断处理概述1)在正常程序执行过程中,每执行一条ARM指令,程序计数器寄存器PC的值加4个字节;每执行一条Thumb指令,程序计数器寄存器PC的值加两个字节.整个过程是顺序执行.2)通过跳转指令,程序可以跳转到特定的地址标号处执行,或者跳转到特定的子程序处执行;B指令用于执行跳转操作;BL指令在执行跳转操作的同时,保存子程序的返回地址;BX指令在执行跳转操作的同时,根据目标地址的最低位可以将程序状态切换到Thumb状态;BLX指令执行3个操作:跳转到目标地址处执行,保存子程序的返回地址(R15保存在R14中),根据目标地址的最低位可以将程序状态切换到Thumb状态.3)当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行.在当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行.4)在进入异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程序退出时,要恢复被中断的程序的执行现场.本章讨论ARM体系中的异常中断机制.2.ARM体系中异常中断种类.ARM体系中的异常中断如下表所示:3.中断向量表中指定了各异常中断及其处理程序的对应关系.它通常存放在存储地址的低端.在ARM体系中,异常中断向量表的大小为32字节.其中,每个异常中断占据4个字节大小,保留了4个字节空间.每个异常中断对应的中断向量表的4.通过这两种指令,程序将跳转到相应的异常中断处理程序处执行.当几个异常中断同时发生时,就必须按照一定的次序来处理这些异常中断.在ARM 中通过给各异常中断富裕一定的优先级来实现这种处理次序.当然有些异常中断是不坑能同时发生的,如指令预取中止异常中断和软件中断(SWI)异常中断是有同一条指令的执行触发的,他们是不可能同时发生的.处理器执行某个特定的异常中断的过程中,称为处理器处于特定的中断模式.各异常中断的中断向量地址以及中断的处理优先级如表2所示.4.异常中断使用的寄存器各异常中断对应着一定的处理器模式.应用程序通常运行在用户模式下.ARM中的处理器模式如表3所示.各种不同的处理器模式可能有对应于该处理器模式的物理寄存器组,如表4所示,其中,R13_svc表示特权模式下的R13寄存器,R13_abt表示中止模式下的R13寄存器,其余的各寄存器名称含义类推.表4 各处理器模式的物理寄存器组如果异常中断处理程序中使用它自己的物理寄存器之外的其它寄存器,异常中断处理程序必须保存和恢复这些寄存器.在表4中各物理寄存器的名称(如R13_svc等)在ARM汇编语言中并没有被预定义.用户使用这些寄存器时,必须使用伪操作RN来定义这些名称.如可以通过下面操作定义寄存器名称R13_svc:R13_svc RN R13一.进入和退出异常中断的过程1.ARM处理器对异常中断的相应过程ARM处理器对异常中断的响应过程如下:a.保存处理器当前状态,中断屏蔽位以及各条件标志位.只是通过将当前程序状态寄存器CPSR的内容保存到将要执行的异常总段对应的SPSR寄存器中实现的.各异常中断有自己的物理SPSR寄存器.b.设置当前程序CPSR中相应的位.包括设置CPSR中的位,使处理器进入相应的执行模式;设置CPSR中的位,禁止IRQ:当进入FIQ模式时,禁止FIQ中断.c.将寄存器LR_mode(R14)设置成返回地址,R14从R15中得到PC的备份.d.将程序计数器值PC设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行.上述的处理器对异常中断的相应过程可以用如下的伪代码描述.e.响应复位异常中断.当处理器的复位引脚有效时,处理器中止当前指令.当处理器的复位引脚变成无效时,处理器开始执行下面的操作.R14_svc = UNPREDICTABLE valueSPSR_svc = UNPREDICTABLE valueCPSR[4:0] = 0b10011 //进入特权模式CPSR[5] = 0 //切换到ARM状态CPSR[6] = 1 //禁止FIQ异常中断CPSR[7] = 1 //禁止IRQ中断If high vectors configured thenPC = 0xffff0000ElsePC = 0x00000000f.响应未定义指令异常中断处理器相应未定义指令异常中断时的处理过程如下面的伪代码所示.R14_und = address of next instruction after the undefined instructionSPSR_und = CPSRCPSR[4:0] = 0b11011 //进入未定义指令异常中断模式CPSR[5] = 0 //切换到ARM状态CPSR[6] = 1 //禁止FIQ异常中断CPSR[7] = 1 //禁止IRQ中断If high vectors configured thenPC = 0xffff0004ElsePC = 0x00000004g.响应SWI异常中断处理器相应SWI异常中断时的处理过程如下面的伪代码所示.R14_svc = address of next instruction after the SWI instructionSPSR_svc = CPSRCPSR[4:0] = 0b10011 //进入特权模式CPSR[5] = 0 //切换到ARM状态CPSR[6] = 1 //禁止FIQ异常中断CPSR[7] = 1 //禁止IRQ中断If high vectors configured thenPC = 0xffff0008ElsePC = 0x00000008h.响应指令预取中止异常中断.处理器相应指令预取中止异常会总段时的处理过程如下面的伪代码所示.R14_abt = address of the aborted instruction + 4SPSR_abt = CPSRCPSR[4:0] = 0b10111 //进入指令预取中止模式CPSR[5] = 0 //切换到ARM状态CPSR[6] = 1 //禁止FIQ异常中断CPSR[7] = 1 //禁止IRQ中断If high vectors configured thenPC = 0xffff000cElsePC = 0x0000000ci.响应数据访问中止异常中断处理器相应数据访问中止异常中断时的处理过程如下面的伪代码所示.R14_abt = address of the aborted instruction + 8SPSR_abt = CPSRCPSR[4:0] = 0b10111 //进入数据访问中止模式CPSR[5] = 0 //切换到ARM状态CPSR[6] = 1 //禁止FIQ异常中断CPSR[7] = 1 //禁止IRQ中断If high vectors configured thenPC = 0xffff0010ElsePC = 0x00000010j.响应IRQ异常中断处理器相应IRQ异常总段时的处理过程如下面的伪代码所示.R14_irq = address of next instruction to be executed + 4SPSR_irq = CPSRCPSR[4:0] = 0b10010 //进入IRQ异常中断模式CPSR[5] = 0 //切换到ARM状态CPSR[6] = 0 //打开FIQ异常中断CPSR[7] = 1 //禁止IRQ中断If high vectors configured thenPC = 0xffff0018ElsePC = 0x00000018k.响应FIQ异常中断处理器相应FIQ异常中断时的处理过程如下面的伪代码所示.2.从异常中断处理程序种返回基本操作:1)恢复被中断的程序的处理器状态,即将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。
2)返回到发生异常中断的指令的下一条指令处执行,即将LR_mode寄存器的内容复制程序计数器PC中。
1)复位异常中断不需要返回。
整个应用系统是从复位异常中断处理程序开始执行的,因而它不需要返回。
2)SWI和未定义指令异常中断处理程序的返回SWI和未定义指令异常中断是由当前执行的指令自身产生的,PC指向了第三条指令,但PC的值还没有更新,还为第二条指令的地址值所以返回时,直接MOV PC,LR即可3)IRQ和FIQ异常中断处理程序的返回通常处理器执行完当前指令后,查询IRQ中断引脚及FIQ中断引脚,并且查看系统是否允许IRQ中断及FIQ中断。
如果由中断引脚有效,并且系统允许该中断产生,处理器将产生IRQ异常中断或FIQ异常中断。
PC指向了第三条指令,并且也得到更新所以返回时,SUBS PC, LR, #44)指令预取中止异常中断处理程序的返回当发生指令预取中止异常中断时,程序要返回到该有问题的指令处,重新读取并执行该指令。
因此指令预取中止异常中断程序应该返回到产生该指令预取中止异常中断的指令处,而不是像前面两种情况下返回到发生中断的指令的下一条指令。
PC指向第三条指令,还未更新,所以PC的值仍为第二条指令的地址返回时,SUBS PC, LR, #45)数据访问中止异常中断处理程序的返回其也要返回发生错误的地址处但,发生中断时,PC指向第三条指令,且已更新所以,返回时,SUBS PC, LR, #8寄存器(和保存它的 SPSR 寄存器)中的位分配如下:31 30 29 28 --- 7 6 - 4 3 2 1 0N Z C V I F M4 M3 M2 M1 M00 0 0 0 0 User26 模式// mode0 0 0 0 1 FIQ26 模式0 0 0 1 0 IRQ26 模式0 0 0 1 1 SVC26 模式1 0 0 0 0 User 模式1 0 0 0 1 FIQ 模式1 0 0 1 0 IRQ 模式1 0 0 1 1 SVC 模式1 0 1 1 1 ABT 模式1 1 0 1 1 UND 模式。