ARM异常中断机制.
单片机的中断与异常处理方法
![单片机的中断与异常处理方法](https://img.taocdn.com/s3/m/4e20f07366ec102de2bd960590c69ec3d5bbdb92.png)
单片机的中断与异常处理方法在单片机的工作过程中,中断和异常处理是非常重要的概念和方法。
它们能够有效地提高单片机的响应能力和灵活性,使其能够应对各种不同的工作需求和问题。
本文将介绍单片机中断的概念、中断的种类以及针对不同中断的处理方法,同时也会探讨单片机异常处理的原理和方法。
一、中断的概念和种类中断是指在一个程序执行的过程中,由于某种特殊的事件发生,导致程序的正常执行被打断,转而去执行一个与当前任务无关的子程序,完成该事件的相应处理。
中断可以分为外部中断和内部中断两种。
1. 外部中断外部中断是指当单片机外部引脚的电平或信号发生变化时,引发中断事件,使单片机停止当前任务的执行,去处理由该外部事件引发的中断服务程序(ISR)。
外部中断常用于与外部设备的交互,如按键输入、传感器检测等。
在编程中,我们可以通过设置中断触发条件和编写相应的中断服务程序来实现对外部中断的处理。
2. 内部中断内部中断是指当单片机内部某个特定的事件发生时,由硬件或软件触发中断请求,并且将控制权交给中断服务程序进行相应的处理。
内部中断的发生可以是由于某个特定条件的满足,如定时器溢出中断、串口接收中断等;也可以是由软件的运行结果触发,如除法溢出中断、地址错误中断等。
不同的内部中断需要通过编程实现相应的中断服务程序。
二、中断的处理方法中断处理是指在中断发生时,单片机通过中断向量表找到相应的中断服务程序,并对中断事件进行处理的过程。
下面将介绍两种常用的中断处理方法。
1. 优先级中断处理优先级中断处理是指对多个中断源按照优先级进行划分和处理的方法。
在单片机的中断系统中,每个中断源都被赋予了一个优先级,高优先级的中断可以打断当前正在执行的低优先级中断,从而增加了中断的响应速度和灵活性。
优先级中断处理需要在编程时设置中断的优先级,并根据不同的中断事件编写相应的中断服务程序。
2. 嵌套中断处理嵌套中断处理是指当一个中断正在执行的过程中,又发生了另一个中断时,将当前中断挂起,转而处理新发生的中断,并在处理完毕后返回原中断继续执行的方法。
nvic中断的工作原理和使用方法
![nvic中断的工作原理和使用方法](https://img.taocdn.com/s3/m/7468ccb1f71fb7360b4c2e3f5727a5e9856a27a5.png)
nvic中断的工作原理和使用方法中断是计算机系统中一种重要的事件处理机制,用于在系统运行过程中处理和响应各种外部事件和异常情况。
中断是一种异步事件,能够打断当前正在执行的指令序列,转而执行中断处理程序,然后再返回到原来的执行位置继续执行。
中断控制器是负责管理和处理中断的硬件设备。
常见的中断控制器有基于硬件的8259和基于软件的NVIC(Nested Vectored Interrupt Controller)。
本文将详细介绍NVIC中断的工作原理和使用方法。
一、NVIC中断的工作原理NVIC是一种设备级中断控制器,广泛应用于ARM Cortex-M系列微控制器中。
它的主要工作原理如下:1.中断优先级:每个中断都有一个固定的优先级,优先级高的中断在发生时可以立即打断正在执行的指令序列。
ARM Cortex-M微控制器支持动态优先级,可以在运行时改变中断的优先级。
2.中断向量表:NVIC使用一个特殊的存储区域来保存中断向量表(Interrupt Vector Table)。
中断向量表是一个数组,其中每个元素都是一个指向中断处理程序的地址。
当中断发生时,CPU会根据中断号从中断向量表中找到对应的中断处理程序并跳转到该地址执行。
3.中断处理程序:每个中断都有一个对应的中断处理程序,用于处理中断事件。
中断处理程序一般包括保存寄存器状态、处理中断事件、发送中断产生的结果等步骤。
在中断处理程序执行完毕后,CPU会根据中断优先级重新选择下一个要执行的中断处理程序。
4.嵌套中断:NVIC支持嵌套中断,即在一个中断处理程序中允许发生其他中断。
当一个中断处理程序正在执行时,如果发生了其他中断,CPU会中断当前的中断处理程序,先执行新的中断处理程序。
当新的中断处理程序执行完毕后,CPU会返回到之前中断处理程序的执行位置继续执行。
二、NVIC中断的使用方法NVIC中断的使用方法包括中断初始化、中断注册和中断处理程序的编写。
ARM的七种异常类型
![ARM的七种异常类型](https://img.taocdn.com/s3/m/d40d946825c52cc58bd6be74.png)
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异常与X86架构中断
![ARM异常与X86架构中断](https://img.taocdn.com/s3/m/efd2384aad02de80d4d840b6.png)
2.ARM中,当正常的程序执行流程发生暂时的停止时,称 之为异常。中断包括在异常模式之内。
相同点:
1.ARM异常和X86中断一样,在执行时都会保护现场,在异常或中断 处理完之后会恢复现场,并且多个异常或中断会按照一定的优先级顺 序执行; 2.异常和中断的过程类似(请求、响应、处理、返回); 3.异常和中断可类似得分为软件和硬件两方面; 4.两者都提高了CPU的工作效率,能实现实时处理和故障处理;
不同点:
1.ARM异常的原因是正在执行的程序的暂停,而X86中断是由异步的 外部事件引起的,前者范围比后者要宽泛; 2.中断可以被屏蔽,而异常需要得到及时响应和处理,通常不能被屏 蔽。
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/71f44bdf112de2bd960590c69ec3d5bbfd0adaa5.png)
ARM 的异常处理学习笔记转贴ARM的异常处理这部分比较不好理解。
当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。
当异常中断处理程序执行完成后,程序返回到发生中断指令的下条指令处执行。
在进入异常中断处理程序时,要保存被中断程序的执行现场,从异常中断处理程序退出时,要恢复被中断程序的执行现场。
1、引起异常的原因(1)、指令执行引起的异常软件中断、未定义指令(包括所要求的协处理器不存在是的协处理器指令)、预取址中止(存储器故障)、数据中止。
(2)、外部产生的中断复位、FIQ、IRQ。
2、ARM中异常中断的种类(1)、复位(RESET)a、当处理器复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行,包括系统加电和系统复位。
b、通过设置PC跳转到复位中断向量处执行称为软复位。
(2)、未定义的指令当ARM处理器或者是系统中的协处理器认为当前指令未定义时,产生未定义的指令异常中断,可以通过改异常中断机制仿真浮点向量运算。
(3)、软件中断这是一个由用户定义的中断指令(SWI)。
可用于用户模式下的程序调用特权操作指令。
在实时操作系统中可以通过该机制实现系统功能调用。
(4)、指令与取终止(Prefech Abort)如果处理器预取的指令的地址不存在,或者该地址不允许当前指令访问,当被预取的指令执行时,处理器产生指令预取终止异常中断。
(5)、数据访问终止(DATAABORT)如果数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问终止异常中断。
(6)、外部中断请求(IRQ)当处理器的外部中断请求引脚有效,而且CPSR的寄存器的I控制位被清除时,处理器产生外部中断请求异常中断。
系统中个外设通过该异常中断请求处7)、快速中断请求(FIQ) 理服务。
(当处理器的外部快速中断请求引脚有效,而且CPSR的F控制位被清除时,处理器产生外部中断请求异常中断。
学习笔记——ARMCortex-M0异常与中断
![学习笔记——ARMCortex-M0异常与中断](https://img.taocdn.com/s3/m/c596fa9c03d276a20029bd64783e0912a2167c93.png)
学习笔记——ARMCortex-M0异常与中断1.异常类型及编号2.Cortex-M0的每个异常源都有一个单独的编号:3.1~15内部系统异常:Reset(1), NMI(2), H/W Error(3), SVC(11), PndSV(14), SysTick(15)其他编号未用;4.16~47外部中断: IRQ#0~IRQ#31.5.异常优先级(Cortex-M0 支持7个)6.1). Cortex-M0 支持3个固定的最高优先级(Reset(-3), NMI(-2), H/W Error(-1))和4个可编程优先级;7.2). 可编程寄存器有8bit宽,但只有Bit7和Bit6可配置,其余Bits为0. (优先级由高到低:0x00,0x40,0x80,0xC0);8.3). 如果两个同时发生的异常的优先级相同,则先执行异常编号小的。
(IRQ#0,IRQ#1 则先执行IRQ#0)9.向量表(异常处理所需的起始地址信息)10.异常向量的地址为异常编号乘以4(Reset向量的地址为:1*4=0x00000004),其他向量地址如下图所示:11.12.EXC_RETURN(32Bits)13.该值用于异常返回机制,下图是其位域的含义:14.3个合法值:0xFFFFFFF1 返回处理模式(嵌套异常发生的情况)0xFFFFFFF9 返回线程模式并在返回中使用主栈(MSP);0xFFFFFFFD 返回线程模式并在返回中使用进程栈(PSP);15.异常的流程接受异常请求:1) 中断和SysTick中断使能;2) 未被NMI屏蔽掉;3) 异常优先级大于当前执行的异常优先级。
压栈及相关寄存器更新:1) 压栈并更新栈指针(8个registers被压栈:R0~R3, R12, R14/LR, R15/PC, xPSR);2) 取出异常向量写入PC中;3) 3个寄存器更新(LR<–EXC_RETURN, IPSR<–异常编号, NVIC<–对应的中断控制和状态)执行异常处理:1) 自动定位异常向量,并处理;2) 利用EXC_TURN的值来触发异常返回机制。
分析流水线处理器的中断和异常响应机制
![分析流水线处理器的中断和异常响应机制](https://img.taocdn.com/s3/m/3fe4542a0066f5335a812144.png)
分析流水线处理器的中断和异常响应机制——以ARM7系列3级流水线为例SC11011042-吴德云为增加处理器指令流的速度,ARM7系列使用3级流水线,允许多个操作同时处理,比逐条指令执行要快。
[1]图1ARM7流水线技术示意图PC 指向正被取指的指令,而非正在执行的指令。
ARM 流水线的一条指令只有在完全通过”执行”阶段才被处理。
这句话很重要,也就是说,当处理器开始取第四条指令时,第一条指令才完成执行。
我们如果不考虑流水线的设计,只看它的原理,其实是很简单的,他的复杂之处在于发生流水线冒险时,如何保证其工作得仍然很好。
流水线冒险一般分为控制冒险和数据冒险,而数据冒险一般可分为阻塞(即下一条指令依赖于前一条指令的结果)、分支和跳转、异常(异常和中断)。
由于ARM 是硬件flush 流水设计的,当发生冒险时,会暂停取指,然后清流水,(MIPS 解决冒险通常依赖于编译器,比如插入一条NOP 指令及重新排列指令序列)。
1.1ARM7的中断响应机制1.1.1中断延时从外部请求信号发出到取出对应的中断服务程序(ISR)的第一条指令,这期间的间隔时间。
1.1.2中断过程ARM 体系中通常在存储地址的低端固化了一个32字节的硬件中断向量表,用来指定各异常中断及其处理程序的对应关系。
当一个异常出现以后,ARM 微处理器会执行以下几步操作:1)保存处理器当前状态、中断屏蔽位以及各条件标志位;2)设置当前程序状态寄存器CPSR 中相应的位;3)将寄存器lr_mode 设置成返回地址;4)将程序计数器(PC)值设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处从存储器中读取指令解码指令寄存器读(从寄存器Bank )移位及ALU 操作寄存器写(到寄存器Bank )PC PC PC -4PC-2PC -8PC -4ARM Thumb理程序处执行。
在接收到中断请求以后,ARM处理器内核会自动执行以上四步,程序计数器PC总是跳转到相应的固定地址。
ARM异常后返回的几种情况
![ARM异常后返回的几种情况](https://img.taocdn.com/s3/m/05bc1958fe00bed5b9f3f90f76c66137ee064ff8.png)
ARM异常后返回的几种情况当ARM处理器执行指令时,可能会遇到异常条件。
异常是一种CPU的响应,用于处理系统的特殊情况,例如错误指令,中断和系统调用。
当发生异常时,ARM处理器会暂停正在执行的任务,并执行特定的异常处理程序。
下面是几种ARM异常后返回的情况:1. 异常返回(Exception Return)指令:当ARM处理器遇到一个异常时,它会将程序状态保存在异常模式的专用寄存器中,并执行一个异常处理程序。
处理程序完成后,可以使用异常返回指令(例如bx或pop)来恢复中断指令后的执行。
2.异常向量表:ARM处理器使用异常向量表来存储异常处理程序入口地址。
当异常发生时,ARM会检索对应异常向量表中的地址并跳转到对应的处理程序。
这些异常向量表通常被存储在系统的固定内存位置,以便ARM能够快速找到异常处理程序。
3.异常处理程序:每个异常都有一个对应的异常处理程序。
异常处理程序负责处理异常情况,并采取适当的措施。
例如,当发生访问错误异常时,异常处理程序可能会尝试恢复,并重新执行导致访问错误的指令。
4. 异常级别(Exception Level):ARM处理器中存在不同的异常级别,用于处理不同优先级的异常。
较高的级别可以屏蔽较低级别的异常,以确保在优先级更高的异常发生时能够优先处理。
5.异常处理期间的状态保存:在进入异常处理程序时,ARM处理器会保存当前任务的状态,包括程序计数器值、寄存器值等。
这样,当异常处理程序执行完毕后,可以准确地返回到之前的任务。
6.异常处理程序的恢复操作:在异常处理程序执行完毕后,ARM处理器可能需要执行一些恢复操作,例如重新加载保存在堆栈中的寄存器值,以确保异常处理程序之后的指令能够正确执行。
7.异常处理程序之间的切换:在多个异常同时发生的情况下,ARM处理器可以通过执行特定的异常处理程序来处理不同的异常。
当多个异常同时发生时,ARM处理器可能会选择一个具有最高优先级的异常进行处理。
ARM异常处理机制
![ARM异常处理机制](https://img.taocdn.com/s3/m/6385383ca32d7375a41780aa.png)
关键词: ARM;异常处理;异常中断;VIC;SWI
中图分类 号:TP311. 11
文献标识码:A
作为嵌入式系统处理器,为了保证系统的实时 性和程序执行的稳定性,ARM 处理器建立了一套 完整的异常处理机制。ARM 处理器共有 7 种异常
NOP LDR LDR
;保留向量 PC, IRQ_Addr PC, FIQ_Add r
3)将返回地址修正为 PC 4,并保存到相应 的 LR 寄存器中;
4)异常向量地址入 PC,跳转并执行中断服务 程序。
1.2 用户程序中需要关心的问题
1)异常向量的重新定位
收稿日期:2006-01-07
作者简介:李 莉(1974 - ),女,山东青岛人。硕士,讲师。主要研究方向为单片机及嵌入式系统。
快速中断请求 FIQ
FIQ 模式
各异常都有固定的优先级,依次为:复位、数
据中止、FIQ、IRQ、预取指中止、未定义指令和
SWI。由表 1 可知,各异常向量之间只有 4 个字节
的空间,因此通常在向量表中放置跳转指令,程序
如下:
Vectors
LDR LDR LDR LDR LDR
PC , R eset_Addr PC , Undef_Addr PC , SWI_Ad dr PC , PAbt_Addr PC , DAbt_Addr
未定义指令
未定义模式
0x00000 008
软件中断 (SWI)
特权模式
0x00000 00C 预取指中止(从存储器取指出错) 中止模式
0x00000 010 数据中止(数据访问存储器出错) 中止模式
0x00000 014
保留
保留
0x00000 018
嵌入式系统基础第7章中断和异常
![嵌入式系统基础第7章中断和异常](https://img.taocdn.com/s3/m/e4a3eeceb8f67c1cfad6b86a.png)
为减少延时,ARM在快中断中采取了 两个措施: (1)专门为快中断FIQ设置了一个FIQ模式, 并为这个模式配置了较多的私有寄存器, 从而可使中断服务程序有足够的寄存
器来使用,而不必与被中断服务程序使用 同一组寄存器,这样就免去了因寄存器冲 突而必需的保护及恢复现场工作。
(2)ARM把FIQ的中断向量放在了中断 (异常)向量表末尾0X0000001C处,因此 它后面没有其它中断向量,允许用户将中 断服务车工许程序直接放在这里。
除了外部设备可以发出可以发出中断 请求之后,处理器内部也会有一些事件可 以发出中断请求,例如读取指令出错或在 进行除法运算时除数为零等。为了与外部 事件引起的中断相区别,人们把这种由内 部事件引起的中断叫做异常。
7.1.2
中断请求信号的屏蔽
处理器中用来屏蔽中断的积存器和开 关如下:
1、可屏ห้องสมุดไป่ตู้中断
1、低端和高端向量表
ARM有低端和高端两种向量表,用户可 以根据需要选用其中一种,如下所示:
ARM中断(异常)的各个向量在向量表 中的分配如下:
中断(异常) 复位(RESET) 未定义指令(UNDEF) 向量在低端向量表的地址 0x00000000 0x00000004 向量在高端向量表的地址 0xFFFF0000 0xFFFF0004
一般情况下,这个优先排队机构可能 在处理器中有一套,在中断控制器中也有 一套,甚至在借口电路中也会有一套。
(2)软件实现方法
就是把所有中断源的中断请求信号分 成两路,其中一路经“或”逻辑送到处理 器的中断请求输入端,而另一路则送入中 断接口电路经数据总线送入处理器。
中断源的软件查询法电路的接线如下 图所示:
异常/中断 复位(RESET) 未定义指令(UNDEF) 软中断(SWI) 地址 LR LR 说明 指向未定义指令的下一条指令 指向SWI指令的下一条指令
ARM自举程序的中断管理机制
![ARM自举程序的中断管理机制](https://img.taocdn.com/s3/m/98e9def1770bf78a652954d2.png)
自举 程序是 操作 系统 内核或 用户 应用程 序运 行
之前, 首先 必须 运行 的汇 编语 言 编 写 的 一段 程 序 代
码 I , 2பைடு நூலகம்主要 包 括 C U 内部 各 个关 键 的寄 存 器 、 P 配 置外 围硬件 电路 相关 寄存器 、 系统 存储 器 、 栈 和 中 堆 断 向量表 等初始 化 , 准备 好 高 级语 言编 写 的 软 件 并 的运 行环境 , 然后 跳 转 到一 般 由高 级语 言 编 写 的 主 函数 的应用 程序代 码 去 执行 , 成 系统 设 计 所要 求 完
广泛。
的 7种异 常 向量地 址 OO 0 l 。S C 4 O x0~ xC 3 4 B X还 规 定 了 EN O到 IT AD IT N _ C等 2 6个 中断源 的中断 向量
地址 0 2 0 c , 且 这 2 x0~ x0 而 6个 中断 向量 仅 在 I Q R 向量模式 下 有 效 。 向量 表 中 的 向量 地 址 是 不 连 续 的, 未列 出 的向量地 址保 留待后 用 。 在 中断 或 异 常 发 生 时 ,3 4 B X 硬 件 逻 辑 将 S C4 O
0 引 言
采 用 中断方式克 服 了 C U查 询 等待 的缺 点 , P 提
() 1 硬件 固有 的 中断 向量 表 A MTM R 7 D I内核 规 定 了 复位 、 定 义 指 令 、 未 软 件 中断 、 预取 中止 、 数据 中止 、R I Q中 断 和 FQ 中断 I
高 了 C U 的 效 率 , 此 在 嵌 人 式 系 统 中 应 用 很 P 因
摘
要:给 出了 于 SC 4 O 基 3 4 B X开发板启动代码 中的中断管理机制 ,给 出了构造硬件 固有 中断
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/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位为快中断禁止位。
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)的值。
六、中断返回在恢复上下文后,处理器核会执行一条返回指令,将控制权从异常处理程序返回给原来的执行环境。
ARM之Cortex-M内核中断异常系统详解
![ARM之Cortex-M内核中断异常系统详解](https://img.taocdn.com/s3/m/dd47a10015791711cc7931b765ce05087632753a.png)
ARM之Cortex-M内核中断异常系统详解问题最近在使用STM32F3芯片的时候,遇到这样一个问题:如果外部中断来的频率足够快,上一个中断没有处理完成,新来的中断如何处理?在调试时,发现有中断有挂起、激活、失能等状态,考虑这些状态都是干啥用的呢!他们是Cortex-M核所共有的,因此这里不针对与具体用的STM32 MCU,直接上升到 Cortex-M内核来了解一下!简介 中断(也称为“异常”)是微控制器一个很常见的特性。
中断一般是由硬件(例如外设、外部引脚)产生,当中断产生以后 CPU 就会中断当前的程序执行流程转而去处理中断服务中指定的操作。
所有的Cortex-M 内核都会系统一个用于中断处理的组件:NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)。
它处理处理中断,还处理其他需要服务的事件(例如 SVC 指令),通常称为“异常”。
按照 ARM 的说法,中断也是一种异常。
Cortex-M3和 Cotex-M4 的 NVIC 最多支持 240 个 IRQ(中断请求)、1 个不可屏蔽中断(NMI)、1个 Systick(滴答定时器)定时器中断和多个系统异常。
而 Cortex-M0 最多支持32个IRQ、1 个不可屏蔽中断(NMI)、1 个 Systick(滴答定时器)定时器中断和多个系统异常。
IRQ:多数由定时器、IO端口、通信接口等外设产生NMI:通常由看门狗定时器或者掉电检测器等外设产生其他:主要来自系统内核注意,本文所说的 Cortex-M 主要指定是 Cotex-M3和 Cotex-M4。
Cortex-M0、Cortex-M0+、Cortex-M1 基于 ARMv6-M。
与Cotex-M3和 Cotex-M4相比,他们的指令集较小。
而且,Cortex-M1 是专门为FPGA应用设计的,没有独立MCU。
异常类型 Cortex-M 处理器的异常中,编号 1~15 的为系统异常,16及以上的则为中断输入。
中断异常处理流程
![中断异常处理流程](https://img.taocdn.com/s3/m/9c674880b1717fd5360cba1aa8114431b90d8eea.png)
中断异常处理流程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中地址。
ARM中断编程实验
![ARM中断编程实验](https://img.taocdn.com/s3/m/7b143cc880eb6294dd886c24.png)
数字信息技术实验学校学院专业实验题目 ARM 中断实验编程小组成员二Ο一七年三月一.实验目的通过本次实验了解中断是什么以及学会如何进行中断编程。
二.实验要求基础实验:利用Exynos4412 的K1、K2 这2 个I/O 引脚的中断模式,分别点亮LED1和LED2,扩展实验:配置K3为中断模式,点亮LED3.三.实验仪器1、计算机2、USB转9脚串口线(通过USB与计算机连接,母头与实验平台连接)3、Exynos4412处理器开发与应用实验平台4、BL-JTAG 仿真器(通过USB与计算机连接,JTAG口与实验平台连接)5、电源线(与实验平台相连接的交流电源线)四.实验原理1.电路原理K1、K2、K3 分别与GPX1_1、GPX1_2、GPX3_2相连,在没有按下按键时这些引脚上一直处于高电平,当按键按下时产生下降沿触发中断。
EXYNOS4412 中断实验电路图实验箱上按键位置2、编程流程去除GPX1_2、GPX1_2,GPX3_2 内部上下拉属性,配置为中断模式。
GPIO 控制器中关闭屏蔽、使能中断;在GIC 中断控制器中使能中断;设置中断优先级;使能GIC;选择中断发送给CPU0;等待中断产生,然后进入中断处理函数;清除中断源。
五.实验内容(1)连接好开发板与计算机之间的串口线和BL-JTAG 仿真器(2)连接好开发板的交流电源线(3)接下来利用计算机演示集成开发环境的使用,以及LED灯的控制实验软硬件仿真流程,打开Eclipse,导入工程Key_Int,进行相应代码编写,编译,配置相关debug信息,装载程序,按下KEY1,KEY2,KEY3在putty串口终上查看相应的信息输出以及可以看到LED1和LED2和LED3亮灭情况。
六.实验步骤根据实验一步骤,连接仿真器、串口线,打开Eclipse,导入工程Key_Int,进行相应代码编写,编译,配置相关debug信息,装载程序,按下KEY1,KEY2,在putty 串口终端上查看相应的信息输出以及可以看到LED1和LED1亮灭情况。
基于ARM系统下映像文件的执行与中断运行机制的实现
![基于ARM系统下映像文件的执行与中断运行机制的实现](https://img.taocdn.com/s3/m/26b9ad00bb68a98271fefa55.png)
通常 A M 映像文件有 af bn两种 格式 , 于裸机 而 R x和 i 对
言( l h 面没有任何 的信息) A M 20上电或复位后从 F s里 a 在 R 90 0 0处开始执行 ,i x bn文件是真正 的可执行文 件 , af 而 x 文件是
A M特有 的调试 文件 , 面除 了 bn文件 的 内容之外 , R 里 i 还有 很多的附加调试 信 息 , 些调 试 信息 可 以在 A M 的开 发环 这 R
l A M 映像 文件 的概念 R
A M 中的各种源 文件 ( 括汇 编程 序、 R 包 C语言 程序 以及 C+ +语言程 序 ) 过 A M 编 译 后 生成 E F格 式 的 目标文 经 R L 件, 该类文件和相应的运行 时库 经过 A M 连接器 处理 后 , R 生 成 E F格式 的映像 文件 (m g ) 这 种格 式 的映像 文 件可 以 L iae ,
摘
要: 阐述 了 A M 系统 下 的映像 文件执 行和 调 用过程 , 以 A M 20下对 FQ相 应的 处理过 R 并 R 90 I
程 为例 阐述 了 中断运行 的相 关机 制 。
关键词 : 中断 ; 映像 文件 ; R 重映射 A M; 中图分类 号 : 嘞 l .2 15 文献标 识码 : A
A E 1E U , A A R A WR E 数据部分 RO R AL O TD T , E D 1 ( N T V
E ND
从上面 的代码可 以发现 :
域 整个 b 映像 文件 , 就是 说整个 程 序 的映像 文件 i n 也 中只有 一个域 ( 加载域) 。
输 出段 有两个输 出段 R O和 R W。
00 00 0 w x 0 0 0 0,
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ARM9(以S3C2410为例)中断机制一、ARM异常机制介绍ARM9处理器有7种工作模式。
分别是(除了用户模式其他都是异常模式用户模式(usr:ARM处理器正常的程序执行状态。
快速中断模式(fiq:用于高速数据传输或通道处理。
外部中断模式(irq:用于通用的中断处理。
管理模式(svc:操作系统使用的保护模式。
数据访问终止模式(abt:当数据或指令预取终止时进入该模式。
系统模式(sys:运行具有特权的操作系统任务。
未定义指令中止模式(und:当未定义的指令执行时进入该模式。
每种模式通过5位二进制编码进行标示:用户模式10000快速中断模式10001外部中断模式10010管理模式10011数据访问终止模式10111未定义指令中止模式11011系统模式11111模式编码存放在CPSR(程序当前状态寄存器,记录当前工作模式的编码的值)中的[4:0]。
快速中断模式、外部中断模式、数据访问终止模式、未定义指令中止模式、管理模式称为异常模式。
异常类型具体含义复位当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常处理程序处执行。
未定义指令遇到不能处理的指令时,产生未定义指令异常。
软件中断该异常由执行SWI指令产生,可用于用户模式下的程序调用特权操作指令。
可使用该异常机制实现系统功能调用。
指令预取中止若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常。
数据中止若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。
IRQ(外部中断请求)当处理器的外部中断请求引脚有效,且CPSR中的I 位为0时,产生IRQ异常。
系统的外设可通过该异常请求中断服务。
FIQ(快速中断请求)当处理器的快速中断请求引脚有效,且CPSR中的F 位为0时,产生FIQ异常。
当多个异常发生时,处理器根据优先级进行处理。
优先级1(最高)复位2 数据中止3 FIQ4 IRQ5 预取指令中止6(最低)未定义指令、SWI异常中断发生时,处理器执行完当前的指令,需要保存当前执行现场,切换到相应的异常模式,并跳转到相应的异常中断处理程序。
中断处理完成后,处理器返回现场执行下条指令。
异常处理一般过程如下:(1)把当前工作模式中的下一条即将运行的指令地址保存到R14中;(2)保存当前CPSR到SPSR(保存程序状态寄存器);(3)改写CPSR中的工作模式为当前产生异常的工作模式;(4)禁止IRQ(如果进入FIQ则禁止FIQ);(5)跳转到相应异常向量表入口;如果是复位异常处理会禁止所有中断,另外由于不用返回,因此不需要作(1)(2)步。
以上的异常处理操作都是由处理器自动完成的。
二、异常向量表Linux内核启动时,向量表的创建过程为:init/main.c->start_kernel(->trap_init(。
trap_init函数位于/arch/$(ARCH/kernel/traps.c中。
trap_init函数中向量表创建的相关代码如下:unsigned long vectors = CONFIG_VECTORS_BASE;……memcpy((void *vectors, __vectors_start, __vectors_end - __vectors_start;memcpy((void *vectors + 0x200, __stubs_start, __stubs_end - __stubs_start;其中CONFIG_VECTORS_BASE是向量表的基地址。
在ARM V4及V4T以后的大部分处理器中,向量表可以有两个位置:一个是0,另一个是0xffff0000。
通过CP15协处理器c1寄存器中V位(bit[13]控制。
V和异常向量表的对应关系如下:V=0 ~ 0x00000000~0x0000001CV=1 ~ 0xffff0000~0xffff001CCONFIG_VECTORS_BASE的值在内核的相关配置文件中定义。
比如在/arch/arm/configs/s3c2410_defconfig中CONFIG_VECTORS_BASE=0xffff0000。
异常向量表存放在__vectors_start至__vectors_end定义的空间内。
异常向量表的逻辑结构(8*4个字节)为:异常类型工作模式地址复位管理模式0x00000000未定义指令未定义指令中止模式0x00000004软件中断管理模式0x00000008数据访问终止模式0x0000000C中止(预取指令)中止(数据)数据访问终止模式0x00000010保留0x00000014IRQ 外部中断模式0x00000018FIQ 快速中断模式0x0000001C异常向量表的物理结构位于arch/arm/kernel/entry-armv.S中,如下所示:.globl __vectors_start__vectors_start:swi SYS_ERROR0:b vector_und + stubs_offset //复位异常:ldr pc, .LCvswi + stubs_offset //未定义指令异常:b vector_pabt + stubs_offset //软件中断异常:b vector_dabt + stubs_offset //数据异常(预取指令中止、数据中止):b vector_addrexcptn + stubs_offset //保留:b vector_irq + stubs_offset //普通中断异常:b vector_fiq + stubs_offset //快速中断异常:.globl __vectors_end:__vectors_end:异常向量表中各种异常对应位置上放置了一条跳转指令,用于指向相应异常的处理程序。
__stubs_start至__stubs_end之间是异常处理程序的位置。
stubs_offset的值为:.equ stubs_offset, __vectors_start + 0x200 - __stubs_start三、中断处理中断发生后,处理器执行向量表中的b vector_irq + stubs_offset指令。
接着根据进入中断前的具体工作模式,执行irq_handler处理过程。
irq_handler处理过程位于/arch/arm/kernel/entry-armv.S中,如下所示:.macro irq_handler……1: get_irqnr_and_base r0, r6, r5, lr @判断中断号,通过R0返回……bne asm_do_IRQ @进入中断处理。
…….endm中断号的值是在和平台相关的文件中决定的。
比如IRQ_EINT0在include/asm/arch-s3c2410/irqs.h中定义。
这说明中断号的具体值和硬件中断挂起寄存器中的中断号是不等的。
asm_do_IRQ位于arch/arm/kernel/irq.c,如下所示:asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs{struct pt_regs *old_regs = set_irq_regs(regs;struct irq_desc *desc = irq_desc + irq; //根据中断号找到对应的irq_desc。
irq_desc 是外部中断描述符表,用于存储中断的相关信息……desc_handle_irq(irq, desc;// 根据中断号和desc进入中断处理irq_finish(irq;irq_exit(;set_irq_regs(old_regs;}static inline void desc_handle_irq(unsigned int irq, struct irq_desc *desc{desc->handle_irq(irq, desc; //中断处理}在include/linux/interrupt.h中定义了irqaction结构体,如下所示:struct irqaction {irq_handler_t handler; //中断处理函数,注册时提供unsigned long flags; //中断标志,注册时提供cpumask_t mask; //中断掩码const char *name; //中断名称void *dev_id; //设备id,本文后面部分介绍中断共享时会详细说明这个参数的作用struct irqaction *next; //如果有中断共享,则继续执行,int irq; //中断号,注册时提供struct proc_dir_entry *dir; //指向IRQn相关的/proc/irq/n目录的描述符};在注册中断号为irq的中断服务程序时,系统会根据注册参数封装相应的irqaction 结构体。
并把中断号为irq的irqaction结构体写入irq_desc [irq]->action。
这样就把设备的中断请求号与该设备的中断服务例程irqaction联系在一起了。
当CPU接收到中断请求后,就可以根据中断号通过irq_desc []找到该设备的中断服务程序。