资源预览内容
第1页 / 共19页
第2页 / 共19页
第3页 / 共19页
第4页 / 共19页
第5页 / 共19页
第6页 / 共19页
第7页 / 共19页
第8页 / 共19页
第9页 / 共19页
第10页 / 共19页
亲,该文档总共19页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
ARM 异常中断处理概述1、中断的概念中断是一个过程,是 CPU 在执行当前程序的过程中因硬件或软件的原因插入了另一段程序 运行的过程。 因硬件原因引起的中断过程的出现是不可预测的, 即随机的, 而软中断是事先 安排的。2、中断源的概念我们把可以引起中断的信号源称之为中断源。3、中断优先级的概念ARM 处理器中有 7 种类型的异常,按优先级从高到低的排列如下:复位异常(Reset)、数据异常(Data Abort )、快速中断异常 ( FIQ)、外部中断异常 (IRQ)、预取异常 (Prefetch Abort )、 软件中断 (SWI)和未定义指令异常( Undefined instruction )ARM体系异常种类面是 ARM 的 7 种异常当异常发生时,处理器会把 PC设置为一个特定的存储器地址。这一地址放在被称为向量表 ( vector table )的特定地址范围内。向量表的入口是一些跳转指令,跳转到专门处理某个异 常或中断的子程序。当异常产生时 , ARM core:拷贝 CPSR 到 SPSR_ 设置适当的 CPSR 位: 改变处理器状态进入 ARM 状态 改变处理器模式进入相应的异常模式 设置中断禁止位禁止相应中断(如果需要 )保存返回地址到 LR_ 设置 PC 为相应的异常向量 返回时 , 异常处理需要 :从 SPSR_恢复 CPSR从 LR_恢复 PCNote:这些操作只能在 ARM 态执行 .当异常发生时,分组寄存器 r14 和 SPSR用于保存处理器状态,操作伪指令如下。R14_ = return link SPSR_ = CPSR0x1C快速中断请求 FIQ外部中断请求 IRQ0x18保留0x10数据异常预取异常CPSR4 0 = exception mode numberCPSR5 = 0 /* 进入 ARM状态 */If = = reset or FIQ thenCPSR6 = 1 /* 屏蔽快速中断 FIQ*/CPSR7 = 1 /* 屏蔽外部中断 IRQ*/PC = exception vector address 异常返回时, SPSR内容恢复到 CPSR, 连接寄存器 r14 的内容恢复到程序计数器 PC。注:cortex-A8系统中支持通过设置 CP15的 c12 寄存器将异常向量表的首地址设置在任意地 址。例如: mcr p15, 0, r0, c12, c0, 01复位异常当处理器的复位引脚有效时, 系统产生复位异常中断, 程序跳转到复位异常中断处理程序处 执行。复位异常中断通常用在下面两种情况下。系统上电。系统复位。 当复位异常时,系统执行下列伪操作:R14_svc = UNPREDICTABLE valueSPSR_svc = UNPREDICTABLE valueCPSR40 = 0b10011 /* 进入特权模式 */CPSR5 = 0 /* 处理器进入 ARM 状态 */CPSR6 = 1 /* 禁止快速中断 */CPSR7 = 1 /* 禁止外设中断 */If high vectors configured thenPC = 0xffff0000ElsePC = 0x00000000复位异常中断处理程序的主要功能: 设置异常中断向量表。初始化数据栈和寄存器。初始化存储系统,如系统中的 MMU 等。 初始化关键的 I/O 设备。使能中断。 处理器切换到合适的模式。初始化 C 变量,跳转到应用程序执行。2未定义指令异常当 ARM 处理器执行协处理器指令时,它必须等待一个外部协处理器应答后,才能真正执行 这条指令。若协处理器没有相应,则发生未定义指令异常 当未定义异常发生时,系统执行下列的伪操作:r14_und = address of next instruction after the undefined instruction SPSR_und = CPSRCPSR40 = 0b11011CPSR5 = 0/* 进入未定义指令模式 */* 处理器进入 ARM 状态 */*CPSR6保持不变 */CPSR7 = 1/* 禁止外设中断 */If high vectors configured thenPC = 0xffff0004ElsePC = 0x000000043软中断 SWI软中断异常发生时, 处理器进入特权模式, 执行一些特权模式下的操作系统功能。 软中断异 常发生时,处理器执行下列伪操作。r14_svc = address of next instruction after the SWI instructionSPSR_und = CPSRCPSR40 = 0b10011CPSR5 = 0/* 进入特权模式 */* 处理器进入 ARM 状态 */*CPSR6保持不变 */CPSR7 = 1/* 禁止外设中断 */If high vectors configured then PC = 0xffff0008ElsePC = 0x000000084预取指令异常预取指令异常是由系统存储器报告的。当处理器试图去取一条被标记为预取无效的指令时, 发生预取异常。如果系统中不包含 MMU 时,指令预取异常中断处理程序只是简单地报告错误并退出。 若包 含 MMU ,引起异常的指令的物理地址被存储到内存中。 预取异常发生时,处理器执行下列伪操作:r14_svc = address of the aborted instruction + 4SPSR_und = CPSRCPSR40 = 0b10111 /* 进入特权模式 */CPSR5 = 0 /* 处理器进入 ARM 状态 */*CPSR6保持不变 */CPSR7 = 1 /* 禁止外设中断 */If high vectors configured thenPC = 0xffff000CElsePC = 0x0000000C5数据访问中止异常数据访问中止异常是由存储器发出数据中止信号, 它由存储器访问指令 Load/Store 产生。 当 数据访问指令的目标地址不存在或者该地址不允许当前指令访问时, 处理器产生数据访问中 止异常。当数据访问中止异常发生时,处理器执行下列伪操作。r14_abt = address of the aborted instruction + 8 SPSR_abt = CPSRCPSR40 = 0b10111CPSR5 = 0/*CPSR6保持不变 */CPSR7 = 1 /* 禁止外设中断 */If high vectors configured thenPC = 0xffff000C10ElsePC = 0x00000010 当数据访问中止异常发生时,寄存器的值将根据以下规则进行修改: 返回地址寄存器 r14 的值只与发生数据异常的指令地址有关,与 PC 值无关 如果指令中没有指定基址寄存器回写,则基址寄存器的值不变 如果指令中指定了基址寄存器回写,则寄存器的值和具体芯片的 Abort Models 有关,由 芯片的生产商指定 如果指令只加载一个通用寄存器的值,则通用寄存器的值不变 如果是批量加载指令,则寄存器中的值是不可预知的值 如果指令加载协处理器寄存器的值,则被加载寄存器的值不可预知6外部中断 IRQ当处理器的外部中断请求引脚有效,而且CPSR寄存器的 I 控制位被清除时,处理器产生外部中断 IRQ 异常。系统中各外部设备通常通过该异常中断请求处理器服务。当外部中断 IRQ 发生时,处理器执行下列伪操作。r14_irq = address of next instruction to be executed + 4SPSR_irq = CPSRCPSR40 = 0b10010 /* 进入特权模式 */CPSR5 = 0 /* 处理器进入 ARM 状态 */*CPSR6保持不变 */CPSR7 = 1 /* 禁止外设中断 */If high vectors configured thenPC = 0xffff0018ElsePC = 0x000000187快速中断 FIQ当处理器的快速中断请求引脚有效且CPSR寄存器的 F 控制位被清除时,处理器产生快速中断请求 FIQ 异常。当快速中断异常发生时,处理器执行下列伪操作。r14_fiq = address of next instruction to be executed + 4 SPSR_fiq = CPSRCPSR40 = 0b10001/* 进入 FIQ模式*/CPSR5 = 0CPSR6 = 1CPSR7 = 1If high vectors configured thenPC= 0xffff001cElsePC = 0x0000001c三 ARM 异常的优先级四 ARM 处理器模式和异常ARM 处理器异常及其对应的模式:每一种异常都会导致内核进入一种特定的模式。也可以通过编程改变CPSR,进入任何一种ARM 处理器模式。注:用户模式和系统模式是仅有的不可以通过异常进入的两种模式,也就是说,要进入这 两张模式必须通过编程改变 CPSR五 ARM 异常响应和处理程序返回1.中断响应的概念中断响应大致可以分为以下几个步骤:1、保护断点,即保存下一将要执行的指令的地址,就是把这个地址送入堆栈。Sub lr, lr, #4Stmfd sp!, r0-r12, lr2、寻找中断入口,根据不同的中断源所产生的中断,查找不同的入口地址。Bl c_irq_handler3、执行中断处理程序。可以写在 main 函数中4、中断返回:执行完中断指令后,就从中断处返回到主程序,继续执行。Ldmfd sp!, r0-r12, pc2.ARM异常响应流程1.判断处理状态2.向量表跳转指令 B 的跳转范围为 32MB ,但很多情况下不能保证所有的异常处理函数都定位在向 量的 32MB 范围内, 需要更大范围的跳转, 而且由于向量表空间的限制, 只能由一条指令完 成。具体实现方法有下面两种。(1)MOV PC, imme_value 这种办法将目标地址直接赋值给PC。但这种方法受格式限制不能处理任意立即数。这个立即数由一个 8 位数值循环右移偶数位得到。(2)LDR PC, PC+offset 把目标地址先存储在某一个合适的地址空间,然后把这个存 储器单元的 32 位数据传送给 PC 来实现跳转。这种方法对目标地址值没有要求。但
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号