ARM中的中断
arm中断处理过程
![arm中断处理过程](https://img.taocdn.com/s3/m/032b45f8770bf78a65295417.png)
Arm的中断处理流程1:芯片输入管脚,按照中断的配置发生变化,(比如产生上升沿),arm芯片内部就会检测到中断。
2:ARM要求中断向量表必须放置在从0开始、连续8×4字节的空间内。
所以地址空间“0x00000000-0x00000032”就是所谓的中断向量表。
3:arm检测到中断后,会根据中断的类型强行设置PC寄存器的值。
把当前cpsr的内容保存到spsr_mode . 然后改变cpsr得内容。
(并且把相应的irq或者fiq设置为1,以禁止中断)中断的类型如下表:比如,这个时候来的是复位中断,则IP寄存器的值为0x00000000, 如果来的是IRQ中断则设置IP寄存器的值为 0x00000018。
注意上述中断信号的产生, cpsr 内容的保存,cpsr自动更改,PC寄存器值的设置,都是arm硬件自动完成。
4: arm CPU接下来就会从“IP寄存器所指的地址”内取指令,比如IP内的值是0x00000018,则会从地址 0x00000018 内取指令。
5:中断向量表的内容是我们先前设置好的。
假设是一个IRQ , 0x00000018处的指令为:B INT_IRQ;则代码跳到 INT_IRQ 处的程序执行。
6:INT_IRQ;; /* This Code is to fix a bug in the ARM Core */;STMDB sp!, {r1}MRS r1, SPSRTST r1, #I_BITLDMIA sp!, {r1}SUBNES pc,lr,#4; //保存环境; /* End ARM Core Fix */STMDB sp!, {a1 - v7, fp, ip, lr} ; Save context…… //里面会进行某些状态位判断,以确定具体是哪个中断,然后调用相应处理程序//恢复环境INT_IRQ_EXITLDMIA sp!, {a1 - v7, fp, ip, lr} ; Restore contextSUBS pc, lr, #4 ; Return to interrupted codeEND ; end file7:What happens if an interrupt occurs as it is being disabled?Applies to:If an interrupt is received by the core during execution of an instruction that disables interrupts, the ARM7 family will still take the interrupt. This occurs for both IRQ and FIQ interrupts.For example, consider the follow instruction sequence:MRS r0, cpsrORR r0, r0, #I_Bit:OR:F_Bit ;disable IRQ and FIQ interruptsMSR cpsr_c, r0If an IRQ interrupt is received during execution of the MSR instruction, then the behavior will be as follows:The IRQ interrupt is latchedThe MSR cpsr, r0 executes to completion setting both the I bit and the F bit in the CPSRThe IRQ interrupt is taken because the core was committed to taking the interrupt exception before the I bit was set in the CPSR. The CPSR (with the I bit and F bit set) is moved to the SPSR_irq上面是arm的一个bug。
arm中断嵌套的原理
![arm中断嵌套的原理](https://img.taocdn.com/s3/m/616bc0cc85868762caaedd3383c4bb4cf7ecb706.png)
arm中断嵌套的原理摘要:1.引言2.arm 中断嵌套的原理2.1 arm 的中断向量表2.2 中断嵌套的实现2.3 中断嵌套的优点和应用3.arm 中断嵌套的实现3.1 硬件方面的支持3.2 软件方面的支持4.arm 中断嵌套的注意事项4.1 中断处理时间的考虑4.2 中断优先级的处理5.总结正文:在嵌入式系统中,中断处理是一个常见的功能。
ARM 处理器提供了丰富的中断处理功能,使得开发者可以灵活地处理各种中断事件。
中断嵌套是ARM 中断处理的一个重要特性,可以提高系统的响应速度和处理效率。
本文将详细介绍ARM 中断嵌套的原理、实现以及注意事项。
首先,我们需要了解ARM 中断嵌套的原理。
ARM 的中断向量表是一个关键概念。
中断向量表是一个存储中断向量地址的数组,用于快速定位和处理各种中断事件。
当有中断请求时,处理器会根据中断类型号在中断向量表中查找对应的中断向量地址,然后跳转到该地址执行中断处理程序。
中断嵌套的实现主要依赖于中断向量表的布局和中断处理程序的设计。
在一个系统中,可能会有多个中断源,它们的中断向量地址可能会相互重叠。
为了实现中断嵌套,我们需要保证中断向量表中的下一个中断向量地址在当前中断处理程序执行完毕之前可以被访问到。
这样,当一个中断请求到来时,处理器可以在当前中断处理程序执行完毕后,快速跳转到下一个中断向量地址,执行下一个中断处理程序。
中断嵌套的优点主要体现在可以提高系统的响应速度和处理效率。
例如,当一个外部中断请求到来时,处理器可以在执行当前中断处理程序的同时,响应外部中断请求,这样可以减少中断处理的时间。
此外,中断嵌套还可以实现中断优先级的功能,使得高优先级的中断请求能够更快地被处理。
要实现ARM 中断嵌套,需要硬件和软件两方面的支持。
在硬件方面,处理器需要支持中断嵌套,这通常需要处理器具有中断控制器,可以实现中断请求的排队和嵌套处理。
在软件方面,需要编写适当的中断处理程序,确保在当前中断处理程序执行完毕之前可以跳转到下一个中断向量地址。
ARM微处理器的七种运行模式
![ARM微处理器的七种运行模式](https://img.taocdn.com/s3/m/363f9d9ddbef5ef7ba0d4a7302768e9951e76e8a.png)
ARM微处理器的七种运⾏模式
ARM微处理器的七种运⾏模式:
1. ⽤户模式(usr):正常的程序执⾏状态
2. 快速中断模式(fiq):⽤于处理快速中断,对⾼速数据传输或通道处理。
3. 中断模式(irq):对⼀般情况下的中断进⾏处理。
4. 管理模式(svc):操作系统使⽤的保护模式,处理软件中断swi reset。
5. 系统模式(sys):运⾏具有特权的操作系统任务
6. 数据访问终⽌模式(abt):数据或指令预取终⽌时进⼊该模式,可⽤于处理存储器故障、实现虚拟存储器和存储器保护。
7. 未定义指令终⽌模式(und):未定义的指令执⾏时进⼊该模式,处理未定义的指令陷阱,当未定义的指令执⾏时进⼊该模式,可⽤于
⽀持硬件协处理器的软件仿真。
特别说明
运⾏模式可以通过软件来进⾏模式切换,或者发⽣各类中断、异常时CPU⾃动进⼊相应的模式。
除⽤户模式外,其余6种⼯作模式都属于特权模式。
特权模式中除了系统模式以外的其余5种模式称为异常模式。
⼤多数程序运⾏于⽤户模式。
进⼊特权模式是为了处理中断、异常、或者访问被保护的系统资源。
arm中断实验的实验报告
![arm中断实验的实验报告](https://img.taocdn.com/s3/m/0decb9ff970590c69ec3d5bbfd0a79563d1ed452.png)
arm中断实验的实验报告ARM中断实验的实验报告引言:ARM中断是一种常用的处理器功能,它可以在特定条件下中断当前的程序执行,转而执行指定的中断服务程序。
本次实验旨在通过ARM中断实验,深入了解中断的原理和应用。
一、实验背景ARM中断是ARM处理器中的一种重要功能,它可以在特定条件下中断当前的程序执行,转而执行指定的中断服务程序。
中断可以分为外部中断和内部中断两种类型。
外部中断是指来自外部设备的中断请求,例如外部设备的输入信号变化;内部中断是指来自处理器内部的中断请求,例如算术溢出、指令错误等。
二、实验目的1. 了解中断的概念和原理;2. 掌握ARM中断的实现方法;3. 学习如何编写中断服务程序。
三、实验步骤1. 准备实验环境:搭建ARM开发板,连接必要的外设;2. 配置中断控制器:根据实验需求,配置中断控制器的相关寄存器,使其能够正确响应中断请求;3. 编写中断服务程序:根据实验需求,编写中断服务程序,实现中断处理的相关功能;4. 运行实验程序:将编写好的程序下载到ARM开发板上,运行程序,观察中断的触发和响应情况;5. 实验结果分析:根据实验结果,分析中断的触发条件、中断服务程序的执行情况等。
四、实验结果与分析通过实验,我们成功实现了ARM中断的功能。
在实验过程中,我们配置了外部设备的中断引脚,当引脚状态发生变化时,中断控制器会产生中断请求,处理器则会立即中断当前的程序执行,转而执行中断服务程序。
在中断服务程序中,我们可以完成一些特定的操作,例如读取外设数据、更新系统状态等。
实验结果表明,中断服务程序能够正确地响应中断请求,并完成相应的操作。
五、实验总结本次实验通过ARM中断的实验,我们深入了解了中断的原理和应用。
中断是一种重要的处理器功能,它可以在特定条件下中断当前的程序执行,转而执行指定的中断服务程序。
掌握了中断的实现方法和编写中断服务程序的技巧,我们可以在实际应用中更好地利用中断功能,提高系统的响应速度和稳定性。
arm的内部函数
![arm的内部函数](https://img.taocdn.com/s3/m/57b84c16ec630b1c59eef8c75fbfc77da26997de.png)
arm的内部函数ARM的内部函数是指在ARM架构下实现的一些特定功能的函数。
这些函数在ARM处理器中运行,并且可以直接访问处理器的内部寄存器和功能模块,以提供更高效的操作和更好的性能。
本文将介绍一些常见的ARM内部函数,并对它们的功能和用法进行详细解释。
1. __disable_irq()函数:该函数用于禁用中断。
在ARM处理器中,中断是一种常见的硬件机制,用于处理外部事件或异常情况。
通过调用__disable_irq()函数,可以在需要的时候临时禁用中断,以确保特定的代码段可以在不被中断干扰的情况下执行。
一旦禁用了中断,除非显式地调用__enable_irq()函数,否则中断将一直被禁用。
2. __enable_irq()函数:该函数用于启用中断。
与__disable_irq()函数相对应,__enable_irq()函数可以在需要的时候重新启用中断。
一旦中断被启用,处理器将可以响应外部事件和异常情况,并按照相应的中断处理程序执行相应的操作。
3. __nop()函数:该函数用于插入一个空操作。
在某些情况下,为了实现精确的时间延迟或调整代码的执行顺序,我们可能需要在代码中插入一些不执行任何操作的语句。
__nop()函数可以实现这个目的,它会在执行期间执行一个空操作,不会对处理器的状态或寄存器产生任何影响。
4. __wfi()函数:该函数用于使处理器进入等待模式。
等待模式是一种低功耗状态,在该状态下,处理器会暂停执行并进入休眠状态,以降低功耗。
通过调用__wfi()函数,我们可以将处理器置于等待模式,直到外部事件或中断唤醒处理器。
5. __dmb()函数:该函数用于实现数据屏障操作。
在多核或多线程的系统中,为了保证数据的一致性和可见性,我们需要使用数据屏障操作。
__dmb()函数可以在代码中插入数据屏障指令,以确保特定的内存访问顺序和数据同步。
6. __rev()函数:该函数用于反转字节顺序。
在某些应用场景下,我们需要将数据的字节顺序进行反转,以满足特定的数据格式要求。
ARM中断控制器
![ARM中断控制器](https://img.taocdn.com/s3/m/512a517d31b765ce0508143a.png)
VIC是处于芯片外设和ARM内核之间的一个模块,对芯片所有外设中断进行管理,决定哪些中断源可以产生中断、产生哪种类型的中断以及中断后执行哪段服务程序。
ARM处理器内核具有两个中断输入:向量中断请求(IRQ)和快速中断请求(FIQ)。
向量中断控制器使用32个中断请求输入,可将其编程分配为FIQ或向量IRQ类型。
可编程分配机制意味着外设中断的优先级可动态分配和调整。
中断向量控制器的作用?答:ARM处理器内核本身只有FIQ和IRQ这2条中断输入信号线,只能接受2个中断源,而向量中断控制器就使LPC2000系列ARM具有正确快速处理多个外部中断事件的能力的模块。
快速中断请求具有最高优先级。
向量IRQ具有可编程的中断优先级。
特性:*ARM PrimeCell向量中断控制器 *映射到AHB地址空间以高速访问*支持32个向量IRQ *16个可编程的中断优先级*在每个可编程优先级内的硬件优先级固定 *硬件优先级屏蔽*任何中断都可分配为FIQ *软件中断功能中断源分配表向量中断控制器(VIC)具有32个中断请求输入,可将其编程分为3类:FIQ,向量IRQ和非向量IRQ。
可编程分配机制意味着不同外设的中断优先级可以动态分配并调整。
快速中断请求:具有最高优先级。
如果分配给FIQ的请求多余1个,VIC将中断请求“相或”后向ARM处理器产生FIQ信号,当只有一个中断被分配为FIQ时可实现FIQ的最短等待时间,因为FIQ服务程序只要简单的启动器件的处理就可以产生了。
但如果分配给FIQ级的中断多于一个,FIQ服务程序需要读取FIQ状态寄存器来识别产生中断请求的FIQ中断源。
向量IRQ具有中等优先级。
该级别可分配32个请求中的16个。
32个请求中的任意一个中断都可分配到16个向量IRQsolt中的任意一个,其中slot0具有最高优先级,而solt15则为最低优先级。
非向量IRQ中断的优先级最低VIC将所有的中断向量和非向量IRQ相或,向ARM处理器产生IRQ信号。
ARM的启动和中断向量表
![ARM的启动和中断向量表](https://img.taocdn.com/s3/m/2070288950e79b89680203d8ce2f0066f5336447.png)
ARM的启动和中断向量表启动的⽅式对于S3C2440⽽⾔,启动的⽅式有两种,⼀是Nor Flash⽅式启动,⼆是Nand Flash⽅式启动。
使⽤Nor Flash⽅式启动Nor Flash的地址范围如下0x0000.0000—0x0800.0000 (2M Nor Flash)⽚内的BootSRAM地址被置为0x4000.0000—0x4000.DFFF (4K BootSRAM)由于可以在Nor Flash直接运⾏代码,因此BootSRAM被映射到别的地址上去,可作为其他⽤途。
程序映像直接存放到NOR FLASH⾥⾯,中断向量表存放在0x0000.0000开始的8×4⼤⼩的空间中。
中断产⽣时,PC被置为相对应的向量地址。
如上电或者按Reset键时,PC直接置为0x00,从NOR FLASH的0x00处开始执⾏。
使⽤NAND Flash⽅式启动此时,⽚内的BootSRAM地址被置为0x0000.0000—0x0800.0000 (4K BootSRAM)NAND Flash地址接NFCE由于NAND Flash中不能运⾏代码,因此必须复制到内存之中再运⾏。
程序映像存放在NAND FLASH中,中断向量表位置在程序映像的最前⾯。
由于NAND FLASH不能运⾏代码,系统上电或者Reset的时候,内置的NAND FLASH 将访问控制接⼝,并将中断向量表和引导代码⾃动加载到内部SRAM(此时该SRAM 定位于起始地址空间0x00000000,容量为4KB),并且置PC值为0x00运⾏程序(这⼀切是有芯⽚内部的硬件逻辑完成的)。
之后,SRAM 中的引导程序将操作系统镜像加载到SDRAM 中,操作系统就能够在SDRAM 中运⾏。
启动完毕,4KB 的启动SRAM 就可以⽤于其他⽤途。
中断向量表的设置ARM中的异常与中断总共有7种按响应优先级从⾼到低按中断向量表顺序复位复位数据中⽌未定义指令中断FIQ SWIIRQ预取指令中⽌预取指令中⽌数据中⽌异常未定义指令、SWI IRQFIQARM要求中断向量表必须放置在从0地址开始,连续8×4字节的空间内(ARM720T和ARM9、ARM10也⽀持从0xFFFF0000开始的⾼地址向量表),各异常和中断向量在向量表中的位置如下地址中断0x00Reset0x04Undef0x08SWI0x0C Prefetch Abort0x10Data Abort0x14(Reserved)0x18IRQ0x2C FIQ0x2C FIQ当中断产⽣时ARM处理器强制把PC指针置为中断向量表中相对应的向量地址。
新手必看 ARM里中IRQ与FIQ的不同
![新手必看 ARM里中IRQ与FIQ的不同](https://img.taocdn.com/s3/m/9110c05cb84ae45c3b358c3f.png)
新手必看ARM里中IRQ与FIQ的不同
熟悉ARM学习的朋友一定知道,ARM运行时有着非常多的模式,中断模式(IRQ)和快速中断模式(FIQ)就是其中两种。
之所以特别提及到这两种模式,是因为在入门阶段,很多人对这两种模式的区别并不了解。
所以经常会造成两种模式混淆的情况,本文将为大家介绍这两种模式的区别,并简单的进行比较。
在进行比较之前,首先对这两种模式的概念进行介绍。
IRQ (InterruptRequest)指中断模式。
FIQ(FastInterrupt Request)指快速中断模式。
IRQ与FIQ是ARM处理器的两种不同编程模式(ARM有7种处理模式)。
两者的不同
1、在FIQ中,开发者必须进快处理中断请求,并离开这个模式。
2、IRQ可以被FIQ所中断,但FIQ不能被IRQ所中断,在处理FIQ时必须要关闭中断。
3、FIQ的优先级比IRQ高。
4、FIQ模式下,比IRQ模式多了几个独立的寄存器。
不要小看这几个寄存器,ARM在编译的时候,如果FIQ中断处理程序足够用这几个独立的寄存器来运作,它就不会进行通用寄存器的压栈,这样也省了一些时间。
5、FIQ的中断向量地址在0x0000001C,而IRQ的在0x00000018。
(也有的在FFFF001C以及FFFF0018)写过完整汇编系统的都比较明白这点的差别,18只能放一条指令,为了不与1C处的FIQ冲突,这个地方只能跳转,而FIQ不一样,1C以后没有任何中断向量表了,这样可以直接在1C处放FIQ的中断处理程序,由于跳转的范围限制,至少减少一条跳转指令。
ARM7内核的中断屏蔽方法
![ARM7内核的中断屏蔽方法](https://img.taocdn.com/s3/m/def3885a11a6f524ccbff121dd36a32d7375c70d.png)
ARM7内核的中断屏蔽方法ARM7内核的中断屏蔽方法是通过设置与中断相关的寄存器来实现的。
ARM7内核提供了多个中断屏蔽寄存器,可以分别对不同的中断进行屏蔽设置。
下面将对常见的中断屏蔽方法进行详细介绍,包括通过CPSR寄存器和INTCON寄存器进行中断屏蔽。
1.CPSR寄存器屏蔽中断ARM7内核的CPSR寄存器(Current Program Status Register)是一个32位寄存器,其中的第7位(I-bit)用于控制中断的屏蔽。
当I位为1时,中断被屏蔽,当I位为0时,中断不被屏蔽。
通过修改CPSR寄存器的I位,可以实现对中断的屏蔽和开启。
中断屏蔽可以通过以下方式进行设置:(1)通过修改CPSR寄存器的I位:在特权级别下,可以直接修改CPSR寄存器的I位,来控制中断的屏蔽。
(2)通过使用屏蔽和解屏函数:ARM提供了两个专门的汇编指令用于修改CPSR寄存器的I位,分别是CPSID和CPSIE。
CPSID指令用于屏蔽中断,CPSIE指令用于解除中断的屏蔽。
2.INTCON寄存器屏蔽中断ARM7内核还提供了INTCON寄存器(Interrupt Control Register)用于屏蔽和控制外部中断的响应。
INTCON寄存器是一个32位的寄存器,每个位对应一个外部中断的屏蔽位。
当一些屏蔽位为1时,对应的中断将被屏蔽,当屏蔽位为0时,对应的中断不被屏蔽。
通过修改INTCON寄存器的屏蔽位,可以实现对外部中断的屏蔽和开启。
中断屏蔽可以通过以下方式进行设置:(1)直接修改INTCON寄存器的屏蔽位:在特权级别下,可以通过直接写入INTCON寄存器来修改外部中断的屏蔽位。
(2)使用特殊函数来修改INTCON寄存器的屏蔽位:ARM提供了特殊的函数用于修改INTCON寄存器的屏蔽位。
需要注意的是,中断屏蔽方法只能屏蔽外部中断,对于内部中断(如软中断、异常中断)无法进行屏蔽。
同时,ARM7内核的中断屏蔽方法也存在优先级的问题,当多个中断同时发生时,只会响应优先级最高的中断请求。
interrupt arm中断与异常.ppt
![interrupt arm中断与异常.ppt](https://img.taocdn.com/s3/m/ecbfb46f0722192e4536f6f4.png)
➢ 上半部会立即被内核执行(now主要讲) 2020/4➢/17下半部的执行可以被延嵌迟入,式O可S 以在系统不太繁忙时执 6
❖ 允许不同类型中断的嵌套发生,这样能使更多的 I/O设备处于忙状态
❖ 尽管内核在处理一个中断时可以接受一个新的中 断,但在内核代码中还在存在一些临界区,在临 界区中,中断必须被禁止
其次,如果interrupt context A由于阻塞或是 其他原因睡眠,外界对系统的响应能力将变得不 可忍受
2020/4/17
嵌入式OS
13
4 ,那么interrupt context A和B的关系又如何呢?
由于可能在interrupt context的某个步骤打开了CPU的IF flag标
I and F 位是中断禁止位 M0, M1, M2, M3 and M4 位是模式位
开关中断
include/asm-arm/assembler.h
Interrupts are disabled when the I bit in the CPSR is set. If the I bit is clear, ARM checks for an IRQ at instruction boundaries.
中断和异常
李春杰
为什么会有中断
❖ 内核的一个主要功能就是处理硬件外设I/O ➢ 处理器速度一般比外设快很多 ➢ 内核必须处理其他任务,只有当外设真正完成了准备 好了时CPU才转过来处理外设IO ➢ IO方式: 轮询、中断、DMA等 ➢ 轮询方式效率不高
➢ 中断机制就是满足上述条件的一种解决办法
2020/4/17
2020/4/17
嵌入式OS
25
主要内容
arm中断嵌套的原理
![arm中断嵌套的原理](https://img.taocdn.com/s3/m/4c2d8e95b8f3f90f76c66137ee06eff9aef8493c.png)
arm中断嵌套的原理【实用版】目录1.ARM 中断嵌套的原理概述2.中断嵌套的实现机制3.中断嵌套的优缺点分析4.总结正文【1.ARM 中断嵌套的原理概述】ARM(Advanced RISC Machine)是一种高级精简指令集计算机(RISC)架构,广泛应用于嵌入式系统和移动设备等领域。
在 ARM 系统中,中断嵌套是一种重要的技术,用于实现多个中断之间的协同处理。
当一个中断处理程序(Interrupt Handler,IH)在执行过程中,可能会触发另一个中断处理程序,这就形成了中断嵌套。
【2.中断嵌套的实现机制】中断嵌套的实现主要依赖于 ARM 处理器的中断处理机制。
具体来说,当一个中断发生时,处理器会立即保存当前程序的状态,包括程序计数器、寄存器等,然后跳转到对应的中断处理程序入口。
在这个过程中,处理器会启用中断优先级控制,根据中断优先级确定处理程序的执行顺序。
在执行中断处理程序时,如果遇到另一个更高优先级的中断,处理器会再次保存当前程序的状态,并跳转到新的中断处理程序入口。
这样就形成了嵌套的层次结构。
在嵌套的过程中,处理器会按照优先级顺序逐个处理中断,直到所有中断处理完毕,恢复执行最初被中断的程序。
【3.中断嵌套的优缺点分析】中断嵌套技术具有以下优点:1.提高系统响应速度:当外部事件发生时,系统可以快速响应并进行处理,提高系统的实时性能。
2.资源利用率高:中断嵌套允许多个中断处理程序并发执行,充分利用系统资源。
然而,中断嵌套也存在以下缺点:1.代码复杂度增加:由于中断嵌套导致程序流程分支较多,可能会增加代码的复杂度,影响程序的可维护性。
2.系统稳定性降低:中断嵌套可能导致系统在处理多个中断时出现死锁、竞态等问题,影响系统的稳定性。
【4.总结】总之,ARM 中断嵌套技术在提高系统响应速度和资源利用率方面具有显著优势,但同时也带来了代码复杂度和系统稳定性方面的挑战。
arm cortex-m中断处理流程
![arm cortex-m中断处理流程](https://img.taocdn.com/s3/m/a25ed9f2f021dd36a32d7375a417866fb84ac096.png)
ARM Cortex—M处理器家族是一组为嵌入式系统制造的32位处理器。
这些处理器被用在很多诸如IOT设备,设备,汽车等等的东西中。
Cortex—M处理器的一个酷点是它们能处理中断,这意味着它们能对事件迅速作出反应。
在文章中,我们将讨论Cortex—M处理器如何
处理中断,我们将专注于所涉及的步骤和概念。
当一个Cortex—M处理器中断时,就像在电子游戏上按下暂停按钮。
处理器很快地将它所做的一切保存在堆栈上,类似于在游戏中保存你
的进度。
它记得它在哪里,它在做什么,和所有重要的环境。
是时候找出真正造成中断的原因了。
处理器检查其特殊的内存图称为
中断矢量表,这就像一个导致不同中断服务常规(ISR)的藏宝图。
这就像在游戏中寻找正确的路径来解决特定的挑战。
一旦处理器知道哪一个ISR去,就像跳进游戏的新关卡。
它开始执行
中断处理器代码,这就像用一套新的指令处理一个新的任务。
就像在
游戏中,处理器可以永远回到它留下的地方,继续冒险!
在ARM Cortex—M的微妙舞蹈中,中断处理是一种优雅的芭蕾舞,
它拯救了现在的时刻,从迷人的矢量台上寻找ISR的悄悄位置区域,
并跳入ISR的等待怀里,执行中断处理者的卡住密码。
这种受试过程
使处理器能够以优雅和高效的空气来响应外部事件的呼唤,将Cortex—M处理器铸成实时嵌入系统的发光星。
ARM异常中断以及对ARM异常返回地址的分析
![ARM异常中断以及对ARM异常返回地址的分析](https://img.taocdn.com/s3/m/972a9666caaedd3383c4d3b5.png)
返回地址:SUBS PC,R14,#8 返回地址分析: 当进入异常时,R14_abt = address of the aborted instruction + 8
所以要返回到有问题的指令处重新执行,所以返回的地址为 R14-8 IRQ 中断异常:
产生原因: 当处理器的外部中断请求引脚有效,且 CPSR 寄存器的 I 控制位被清除 时,处理器产生外部中断 IRQ 异常。
是因为当前指令即引起软件异常中断的指令执行后所引起的,说明当前指令已近执行,当从
中断返回时,执行的指令应该是当前指令的下一条指令,即待执行指令的地址应该是 0x3004, 而 R14 中存放的即为 0x3004,所以返回时使用将 R14 的值直接赋给 PC 即可。
指令预期中止异常: 发生原因:若在指令预取阶段遇到无效指令时,系统存储器将该预取的指令标记为无
效指令,当处理器试图去执行这一条被标记为预取无效的指令时,将产生指令预取中止异常, 注意若处理器没有执行无效指令时将不会产生异常中断(在流水线中存在一条分支指令,导 致该非法指令没有执行,将不会产生该异常)。
处理器动作: R14_abt = address of the aborted instruction + 4 SPSR_abt = CPSR ….. …..
2、各异常分析
举个小例子,下面是一段 ARM 汇编代码: (后面的返回地址分析中将会用到此图)
arm处理器异常中断响应过程
![arm处理器异常中断响应过程](https://img.taocdn.com/s3/m/b49f933ecd1755270722192e453610661ed95aca.png)
arm处理器异常中断响应过程ARM处理器是一种广泛应用于移动设备、嵌入式系统和服务器等领域的处理器架构。
在运行过程中,处理器可能会遇到各种异常情况,如访问非法内存、除零错误等。
当这些异常发生时,ARM处理器需要做出相应的中断响应,以保证系统的稳定性和安全性。
ARM处理器异常中断响应的过程可以分为异常触发、异常处理和恢复执行三个阶段。
首先是异常触发阶段。
当处理器在执行指令时,发生了某种异常情况,例如访问了非法的内存地址,处理器会立即检测到异常,并将当前指令的状态保存起来。
同时,处理器会根据异常类型,确定异常向量的地址,将控制转移到异常向量所指向的地址处。
接下来是异常处理阶段。
当处理器进入异常向量所指向的地址时,会执行相应的异常处理程序。
这个程序通常是由操作系统或应用程序提供的,用于处理不同类型的异常。
在异常处理程序中,可以进行一系列的操作,例如保存现场、记录异常信息、处理异常原因等。
处理程序还可以根据需要选择继续执行或终止当前指令。
最后是恢复执行阶段。
在异常处理程序执行完毕后,处理器会根据异常返回地址,将控制权返回到引发异常的指令处,继续执行后续指令。
在返回之前,处理器可能会进行一些必要的恢复操作,如恢复现场、清除异常状态等。
这样,系统就可以继续正常运行,不受异常的影响。
需要注意的是,ARM处理器还提供了一些特殊的异常处理方式,如中断(Interrupt)和陷阱(Trap)。
中断是外部设备触发的异常,用于异步事件的处理,例如外部设备的输入输出请求。
陷阱是由程序主动触发的异常,用于实现系统调用和调试功能。
这些异常的触发和处理方式与一般异常略有不同,但整体的处理过程仍然符合前述的异常中断响应流程。
在ARM处理器中,异常中断响应是保证系统正常运行和异常处理的关键环节。
通过合理的异常处理程序和恢复机制,可以有效地应对各种异常情况,提高系统的可靠性和稳定性。
同时,开发人员也需要根据具体应用场景和需求,灵活地配置和调整异常处理方式,以满足不同的需求。
ARM中断程序的原理和实现
![ARM中断程序的原理和实现](https://img.taocdn.com/s3/m/9fcfa5d950e79b89680203d8ce2f0066f53364a8.png)
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种异常与5种异常模式的对应关系
![ARM的7种异常与5种异常模式的对应关系](https://img.taocdn.com/s3/m/9be2d24ebe1e650e52ea99ea.png)
ARM处理器中有7种异常情况:
快速中断请求,中断请求,预取指中止,数据中止,软件中断,未定义指令,复位
快速中断请求异常进入快中断模式,支持高速数传输及通道处理(FIQ异常响应时进入此模式)
中断请求异常进入中断模式,用于通用中断处理,(IRQ异常响应时进入此模式)
预取指中止,数据中止异常进入中止模式,用于支持虚拟内存和/或存储器保护
未定义指令异常进入未定义模式,支持硬件协处理器的软件仿真(未定义指令异常响应时进入此模式)
软件中断,复位异常进入管理模式,操作系统保护代码(系统复位和软件中断响应时进入此模式)
CPRS的I位为中断禁止位,F位为快中断禁止位。
ARM系统中断产生流程
![ARM系统中断产生流程](https://img.taocdn.com/s3/m/1c3f056ef5335a8102d2201d.png)
ARM系统中断产生流程中断源按照硬件位置分为外部中断源和内部中断源,外部中断源和内部中断源又包含子外部中断源和子内部中断源,如上图所示(画了一整天)。
1. 子内部中断源的产生以UAR T0接收数据产生INT_RXD0中断为例,INT_RXD0产生后进入SUBSRCPND子中断源暂存寄存器,设置INT_RXD0对应的中断位,中断信号经过INTSUBMSK子中断屏蔽寄存器,如果INT_RXD0信号对应位没有被置位(屏蔽掉),中断信号继续向前传递,经过子内部中断源聚合器,将INT_RXD0聚合成对应的中断源信号INT_UAR T0,设置SRCPND中断源暂存寄存器里INT_UAR T0位,经过INTMSK中断屏蔽寄存器,如果INT_UAR T0信号没有被屏蔽掉,中断信号进入INTMOD中断模式寄存器判断是否为快速中断,如果被编程为快速中断,直接打断ARM内核,进入中断处理,如果中断信号为一般中断,进入中断优先级仲裁器进入优先级仲裁,如果INT_UAR T0信号为最高优先级或只有INT_UAR T0中断信号产生,则该中断信号被记录到INTPND最高优先级中断暂存寄存器,同时设置INTOFFSET的值为中断号28,最终将中断信号打断ARM内核进行中断处理。
如果同时产生多个中断且INT_UAR T0不是最高优先级,则该中断信号不会被处理,等最高优先级信号处理完后,再次进行优先级仲裁,也就是说中断信号不消失,一直保存在SRCPND里,只到被处理为止。
2. 内部中断源的产生该过程在子内部中断处理过程中已经包含,中断信号产生后直接进入SRCPND里,然后经历上述子内部中断后期处理过程。
3. 子外部中断的产生外部中断源共有24个,其中EINT0~EINT3为外部中断源,EINT4_7,EINT8_23为复合中断源,他们包含有子外部中断源。
由于外部硬件直接挂接到I/O Ports(详见S3C2440A硬件手册第9章)上的,我们要想让外设硬件中断得到处理,要先从EINT0~EINT23里选择中断信号,我们以EINT11为例,介绍子外部中断处理过程。
armv8中断处理流程
![armv8中断处理流程](https://img.taocdn.com/s3/m/c736fa94250c844769eae009581b6bd97f19bcca.png)
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)的值。
六、中断返回在恢复上下文后,处理器核会执行一条返回指令,将控制权从异常处理程序返回给原来的执行环境。
ARMlinux的中断处理过程(转)
![ARMlinux的中断处理过程(转)](https://img.taocdn.com/s3/m/7cb822b30129bd64783e0912a216147917117e2a.png)
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(处理器遇到⼀个未定义的指令的时候进⼊的异常模式)的时候也是采⽤了相同的策略。
arm中断向量表的作用及工作原理
![arm中断向量表的作用及工作原理](https://img.taocdn.com/s3/m/980cba21001ca300a6c30c22590102020740f2d9.png)
arm中断向量表的作用及工作原理
作用:
中断向量表在嵌入式系统和计算机体系结构中扮演着关键角色,其主要作用是存储了各个中断源对应的中断服务程序的入口地址。
当CPU接收到外部或内部产生的中断请求时,它会根据中断控制器传递过来的中断号,从预先定义好的中断向量表中查找到与该中断号对应的那个条目,这个条目中存放的就是ISR的地址。
工作原理:
1.中断触发:当一个中断事件发生时,硬件设备或内部逻辑会发出中断请求信号给中断控制器。
2.中断识别与优先级处理:中断控制器接收请求后,会按照优先级进行仲裁,确定最高优先级的中断并将其中断号发送给CPU。
3.中断响应:CPU停止当前执行的任务,保存现场,然后读取中断向量表中的相应位置。
4.跳转至ISR:根据中断号在中断向量表中找到对应的地址,并执行该地址处的指令,通常这个地址包含的是跳转指令,使得CPU 跳转到相应的中断服务程序的起始地址开始执行。
5.中断服务:ISR负责处理中断请求,执行相应的错误处理、数据交换或者任务调度等操作。
6.中断返回:当ISR执行完毕后,通过特定的指令序列恢复现场,清除中断标志位,并通过中断返回指令回到被中断的正常程序流程继续执行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、S5PV210中中断的特点1、特点• Supports 93 vectored IRQ interrupts• Fixed hardware interrupts priority levels• Programmable interrupt priority levels• Supports Hardware interrupt priority level masking• Programmable interrupt priority level masking• Generates IRQ and FIQ• Generates Software interrupt2、FIQ与IRQ的区别1)FIQ和IRQ并不是中断源,而是中断的类型,我们可以将一个中断源设置成FIQ也可以设置成IRQ。
2)FIQ是快速中断,IRQ是一般中断,FIQ的响应时间比IRQ短。
3)FIQ的优先级高于IRQ。
4)FIQ的分组寄存器(R8~R14)比IRQ(R13~R14)多。
当在FIQ产生的时候,R8~R14不需要保存,响应的速度会快。
3、S5PV210的中断源二、原理图分析三、如何以中断的方式来检测按键:GPH2_2(EINT18) 、GPH2_3(EINT19) 按键的检测:轮询:将GPIO配置成输入…….中断:将GPIO配置成外部中断…….1、GPIO的配置,将一个GPIO配置成外部中断2、外部中断的触发方式(高电平、低电平、上升沿、下降沿)3、外部中断的开关寄存器0 = Enables Interrupt 打开中断1 = Masked 关闭中断4、外部中断判断寄存器0 = Not occur 外部中断没有发生1 = Occur interrupt 触发了中断该寄存器的作用:1)读该寄存器,可以知道对应的中断源是否触发。
2)写该寄存器,可以实现清除中断,如果一个中断不清除,CPU就会认为该中断还是存在的,就会再次触发该中断,形成循环。
所以我们在中断处理程序中,需要清除中断。
清中断的方法:如果一个中断已经触发,该寄存器的相应位会自动置1,我们需要向该位写个“1”,就可以将该位清0,写“0”无效。
这是PEND寄存器的特点例如:清EINT18EXT_INT_2_PEND |= (1<<2);5、IRQ的状态寄存器通过该寄存器,可以得到某个IRQ类型中断源是否发生的状态。
6、中断类型设置寄存器7、打开中断的寄存器例:打开EINT18和EINT19VIC0INTENABLE |= (1<<16);EXT_INT_2_MASK &= ~(0x3<<2);8、关闭中断的寄存器例:关闭EINT18和EINT19VIC0INTENCLEAR |= (1<<16);EXT_INT_2_MASK |= (0x3<<2);9、VIC向量地址寄存器ISR ----- Interrupt Service Routine 中断处理程序该寄存器的内容是当前正在响应的中断服务程序的入口地址,我们可以通过该地址去调用中断服务程序。
向该寄存器写任何值,都可以清除中断,一般情况下,中断的清除都是在ISR的结束位置。
10、每个中断源的向量地址寄存器注意:该每个VIC(共有4个)有32个这样的寄存器,当我们在做中断初始化的时候,需要安装中断,安装中断的时候,要将中断服务程序的入口地址,写到对应的向量地址寄存器中。
例:void eint18_19_isr(void){//点灯//清中断}如何实现中断向量的安装???VIC0VECTADDR16 = (unsigned int)eint18_19_isr;EINT16~EINT31的向量地址寄存器= 中断服务程序的入口地址四、中断的响应过程。
以外部中断EINT18为例,分析中断的响应过程。
1、start.S_start:ldr sp, =0x40000000 //初始化管理模式的stack,stack在DDR2中mov r0, #0x53msr CPSR, r0 //对CPSR[7:0] = 010 10011,管理模式,arm状态、关闭FIQ、IRQ打开b main //进入C环境2、当一个IRQ中断发生的时候,首先进入IRQ中断的入口地址:PC = 0x00000018, 分析0x18地址上是什么内容???0x18地址是s5pv210内容iROM中的BL0,samsung固化。
3、在iRom的0x18地址有一个跳转指令,跳转到iRAM中异常中断向量表中。
PC = 0xD0037418 ???4、异常中断向量的安装int_init(void) //中断初始化的时候调用{//vector table of exception initializepExceptionUNDEF = (unsigned long)exceptionundef;//undefinepExceptionSWI = (unsigned long)exceptionswi;//software interruptpExceptionPABORT = (unsigned long)exceptionpabort;//pabortpExceptionDABORT = (unsigned long)exceptiondabort;//data abort pExceptionIRQ = (unsigned long)IRQ_handle;//IRQpExceptionFIQ = (unsigned long)FIQ_handle;//FIQ………………………………………….}分析异常中断向量表的安装:1)pExceptionIRQ#define pExceptionIRQ ( *((volatile unsigned long *)(_Exception_Vector + 0x18)) )#define _Exception_Vector 0xD0037400总结:pExceptionIRQ是0xD0037418地址下的内容,该地址是IRQ异常中断映射后的入口地址2)(unsigned long)IRQ_handle;IRQ_handle: @CPSR会由硬件自动保存到SPSR_irqldr sp, =0xD0037F80 //初始化IRQ模式的stacksub lr, lr, #4 //返回地址的修正,原因:IRQ中断的返回地址是LR-4,与流水线相关stmfd sp!, {r0-r12, lr} //将R0~R12及LR入栈保存,相当于保护现场bl Irq_Isrldmfd sp!, {r0-r12, pc}^ @将SPSR_irq恢复给CPSRLR的值为什么要修正:总结:IRQ_handle子程序的入口地址PC = IRQ_handle5、执行IRQ_handle子程序IRQ_handle: @CPSR会由硬件自动保存到SPSR_irqldr sp, =0xD0037F80sub lr, lr, #4stmfd sp!, {r0-r12, lr}bl Irq_Isrldmfd sp!, {r0-r12, pc}^ @将SPSR_irq恢复给CPSR6、现场保护后,执行Irq_Isrvoid Irq_Isr(void){int i;//VIC的向量地址寄存器unsigned long vicaddr[4] = {VIC0ADDRESS,VIC1ADDRESS,VIC2ADDRESS,VIC3ADDRESS};void (*isr)(void) = (void *)0; //定义一个函数指针,指向0地址for(i=0; i<4; i++){if(intc_getvicirqstatus(i) != 0){isr = (void (*)(void)) vicaddr[i]; //i = 0; isr=((void)(*)(void)) VIC0ADDRESSbreak;}}(*isr)(); //调用前面定义的函数}//查看中断的状态,当某个中断发生,VICIRQSTA TUS的相应的位就会为1,例:EINT18有效:VIC0IRQSTA TUS[16] =1unsigned long intc_getvicirqstatus(unsigned long ucontroller){if(ucontroller == 0)return VIC0IRQSTA TUS;else if(ucontroller == 1)return VIC1IRQSTA TUS;else if(ucontroller == 2)return VIC2IRQSTA TUS;else if(ucontroller == 3)return VIC3IRQSTA TUS;else{}return 0;}分析:isr=((void)(*)(void)) VIC0ADDRESS1)isr 函数指针2)((void)(*)(void)) VIC0ADDRESS当EINT18有效的时候,EINT18对应向量地址寄存器(VIC0VECTADDR16)中的内容会由硬件自动的拷贝到VIC0ADDRESS寄存器中。
总结:isr函数指令,是指向VIC0ADDRESS的内容,在这个位置又是一个isr函数的调用。
PC=VIC0ADDRESS= VIC0VECTADDR16,CPU就开始执行VIC0ADDRESS下的内容。
7、ARM开始执行VIC0VECTADDR16地址下的函数在中断初始化的时候://initialize vector interrupt address with num of init and isr.//中断的安装NUM_EINT16_31---中断号:16// EINT16_31_ISR---中断处理程序//将EINT16_31_ISR的入口地址写入到VEC0VECTADDR16intc_setvectaddr(NUM_EINT16_31, EINT16_31_ISR);分析://the address resigster of vector interrupt initialize//num of int, isr of int//intc_setvectaddr(NUM_EINT16_31, EINT16_31_ISR);该函数的作用:将一个中断服务程序的入口地址,写到该中断对应的向量地址寄存器中。
void intc_setvectaddr(unsigned long intnum, void (*handler)(void)){//VIC0if(intnum<32){//*( (volatile unsigned long *)(0xF2000000+0x100+0x40)=(unsigned int)EINT16_31_ISR得到EINT16_31_ISR的入口地址//VIC0VECTADDR16=EINT16_31_ISR的入口地址*( (volatile unsigned long *)(VIC0VECTADDR + 4*intnum) ) = (unsigned)handler;}//VIC1else if(intnum<64){*( (volatile unsigned long *)(VIC1VECTADDR + 4*(intnum-32)) ) = (unsigned)handler;}//VIC2else if(intnum<96){*( (volatile unsigned long *)(VIC2VECTADDR + 4*(intnum-64)) ) = (unsigned)handler;}//VIC3else{*( (volatile unsigned long *)(VIC3VECTADDR + 4*(intnum-96)) ) = (unsigned)handler;}return;}总结:PC= VIC0VECTADDR16 = (unsigned int ) EINT16_31_ISR;8、执行中断服务程序EINT16_31_ISR外部中断EINT16_31的中断服务程序,在该中断服务中,在去判断子中断EINT18、EINT19void EINT16_31_ISR(void) //EINT18/EINT19{if(EXT_INT_2_PEND & (1<<2))//EINT18发生{GPJ2DAT ^= (1<<0); //toggle D1// clear pending bitEXT_INT_2_PEND = 1<<2;// clear VIC0ADDRESS//VIC0ADDRESS = 0;intc_clearvectaddr();}if(EXT_INT_2_PEND & (1<<3))//EINT19反生{GPJ2DAT ^= (1<<1); //toggle D2// clear pending bitEXT_INT_2_PEND = 1<<3;// clear VIC0ADDRESSintc_clearvectaddr();}}9、中断返回IRQ_handle: @CPSR会由硬件自动保存到SPSR_irq ldr sp, =0xD0037F80sub lr, lr, #4stmfd sp!, {r0-r12, lr}bl Irq_Isrldmfd sp!, {r0-r12, pc}^ @将SPSR_irq恢复给CPSRldmfd sp!, {r0-r12, pc}^分析:1)将R0~R12出栈2)将LR出栈给PC,中断的返回3)将SPSR_irq恢复给CPSR。