ARM异常中断机制.

合集下载

单片机的中断与异常处理方法

单片机的中断与异常处理方法

单片机的中断与异常处理方法在单片机的工作过程中,中断和异常处理是非常重要的概念和方法。

它们能够有效地提高单片机的响应能力和灵活性,使其能够应对各种不同的工作需求和问题。

本文将介绍单片机中断的概念、中断的种类以及针对不同中断的处理方法,同时也会探讨单片机异常处理的原理和方法。

一、中断的概念和种类中断是指在一个程序执行的过程中,由于某种特殊的事件发生,导致程序的正常执行被打断,转而去执行一个与当前任务无关的子程序,完成该事件的相应处理。

中断可以分为外部中断和内部中断两种。

1. 外部中断外部中断是指当单片机外部引脚的电平或信号发生变化时,引发中断事件,使单片机停止当前任务的执行,去处理由该外部事件引发的中断服务程序(ISR)。

外部中断常用于与外部设备的交互,如按键输入、传感器检测等。

在编程中,我们可以通过设置中断触发条件和编写相应的中断服务程序来实现对外部中断的处理。

2. 内部中断内部中断是指当单片机内部某个特定的事件发生时,由硬件或软件触发中断请求,并且将控制权交给中断服务程序进行相应的处理。

内部中断的发生可以是由于某个特定条件的满足,如定时器溢出中断、串口接收中断等;也可以是由软件的运行结果触发,如除法溢出中断、地址错误中断等。

不同的内部中断需要通过编程实现相应的中断服务程序。

二、中断的处理方法中断处理是指在中断发生时,单片机通过中断向量表找到相应的中断服务程序,并对中断事件进行处理的过程。

下面将介绍两种常用的中断处理方法。

1. 优先级中断处理优先级中断处理是指对多个中断源按照优先级进行划分和处理的方法。

在单片机的中断系统中,每个中断源都被赋予了一个优先级,高优先级的中断可以打断当前正在执行的低优先级中断,从而增加了中断的响应速度和灵活性。

优先级中断处理需要在编程时设置中断的优先级,并根据不同的中断事件编写相应的中断服务程序。

2. 嵌套中断处理嵌套中断处理是指当一个中断正在执行的过程中,又发生了另一个中断时,将当前中断挂起,转而处理新发生的中断,并在处理完毕后返回原中断继续执行的方法。

nvic中断的工作原理和使用方法

nvic中断的工作原理和使用方法

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的七种异常类型

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架构中断
1.对x86架构而言,中断是由异步的部事件引起的。外 部事件及中断响应与正执行的指令没有关系。 异常是在执行指令期间检测到不正常的或非法的条件所 引起的。异常与正执行的指令有直接的联系。
2.ARM中,当正常的程序执行流程发生暂时的停止时,称 之为异常。中断包括在异常模式之内。
相同点:
1.ARM异常和X86中断一样,在执行时都会保护现场,在异常或中断 处理完之后会恢复现场,并且多个异常或中断会按照一定的优先级顺 序执行; 2.异常和中断的过程类似(请求、响应、处理、返回); 3.异常和中断可类似得分为软件和硬件两方面; 4.两者都提高了CPU的工作效率,能实现实时处理和故障处理;
不同点:
1.ARM异常的原因是正在执行的程序的暂停,而X86中断是由异步的 外部事件引起的,前者范围比后者要宽泛; 2.中断可以被屏蔽,而异常需要得到及时响应和处理,通常不能被屏 蔽。

arm中断实验的实验报告

arm中断实验的实验报告

arm中断实验的实验报告ARM中断实验的实验报告引言:ARM中断是一种常用的处理器功能,它可以在特定条件下中断当前的程序执行,转而执行指定的中断服务程序。

本次实验旨在通过ARM中断实验,深入了解中断的原理和应用。

一、实验背景ARM中断是ARM处理器中的一种重要功能,它可以在特定条件下中断当前的程序执行,转而执行指定的中断服务程序。

中断可以分为外部中断和内部中断两种类型。

外部中断是指来自外部设备的中断请求,例如外部设备的输入信号变化;内部中断是指来自处理器内部的中断请求,例如算术溢出、指令错误等。

二、实验目的1. 了解中断的概念和原理;2. 掌握ARM中断的实现方法;3. 学习如何编写中断服务程序。

三、实验步骤1. 准备实验环境:搭建ARM开发板,连接必要的外设;2. 配置中断控制器:根据实验需求,配置中断控制器的相关寄存器,使其能够正确响应中断请求;3. 编写中断服务程序:根据实验需求,编写中断服务程序,实现中断处理的相关功能;4. 运行实验程序:将编写好的程序下载到ARM开发板上,运行程序,观察中断的触发和响应情况;5. 实验结果分析:根据实验结果,分析中断的触发条件、中断服务程序的执行情况等。

四、实验结果与分析通过实验,我们成功实现了ARM中断的功能。

在实验过程中,我们配置了外部设备的中断引脚,当引脚状态发生变化时,中断控制器会产生中断请求,处理器则会立即中断当前的程序执行,转而执行中断服务程序。

在中断服务程序中,我们可以完成一些特定的操作,例如读取外设数据、更新系统状态等。

实验结果表明,中断服务程序能够正确地响应中断请求,并完成相应的操作。

五、实验总结本次实验通过ARM中断的实验,我们深入了解了中断的原理和应用。

中断是一种重要的处理器功能,它可以在特定条件下中断当前的程序执行,转而执行指定的中断服务程序。

掌握了中断的实现方法和编写中断服务程序的技巧,我们可以在实际应用中更好地利用中断功能,提高系统的响应速度和稳定性。

ARM的异常处理学习笔记转贴

ARM的异常处理学习笔记转贴

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异常与中断

学习笔记——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的值来触发异常返回机制。

分析流水线处理器的中断和异常响应机制

分析流水线处理器的中断和异常响应机制

分析流水线处理器的中断和异常响应机制——以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总是跳转到相应的固定地址。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 []找到该设备的中断服务程序。

相关文档
最新文档