嵌入式系统教案 武汉创维特信息技术有限公司 2019/4/29
提纲 第六章 异常中断处理 1 ARM 异常中断处理概述 2 异常的响应和退出 3 中断处理程序的安装 4 各种异常中断的处理
ARM异常中断处理概述 ARM异常中断处理概述 当正常的程序执行流程发生暂时的停止时,称之为异常,例如处理一个外部的中断请求。在处理异常之前,当前处理器的状态必须保留,这样当异常处理完成之后,当前程序可以继续执行。处理器允许多个异常同时发生,它们将会按固定的优先级进行处理。 ARM体系结构中的异常,与8位/16位体系结构的中断有很大的相似之处,但异常与中断的概念并不完全等同。
ARM体系结构所支持的异常类型 ARM异常中断处理概述 异常类型 具体含义 复位 复位电平有效时,产生复位异常,程序跳转到复位处理程序处执行。 未定义指令 遇到不能处理的指令时,产生未定义指令异常。 软件中断 执行SWI指令产生,用于用户模式下的程序调用特权操作指令。 指令预取中止 处理器预取指令的地址不存在,或该地址不允许当前指令访问,产生指令预取中止异常。 数据中止 处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。 IRQ 外部中断请求有效,且CPSR中的I位为0时,产生IRQ异常。 FIQ 快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常。
异常向量表(Exception Vectors) ARM异常中断处理概述 异常向量表(Exception Vectors) 地 址 异 常 进入模式 0x0000,0000 复位 管理模式 0x0000,0004 未定义指令 未定义模式 0x0000,0008 软件中断 0x0000,000C 中止(预取指令) 中止模式 0x0000,0010 中止(数据) 0x0000,0014 保留 0x0000,0018 IRQ 0x0000,001C FIQ
异常优先级(Exception Priorities) ARM异常中断处理概述 异常优先级(Exception Priorities) 优先级 异 常 1(最高) 复位 2 数据中止 3 FIQ 4 IRQ 5 预取指令中止 6(最低) 未定义指令、SWI
对异常的响应 对异常的响应 当一个异常出现以后,ARM微处理器会执行以下几步操作 将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。 将CPSR复制到相应的SPSR中。 根据异常类型,强制设置CPSR的运行模式位。 强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。 若异常是从ARM状态进入,LR寄存器中保存的是下一条指令的地址(当前PC+4或PC+8,与异常的类型有关); 若异常是从Thumb状态进入,则在LR寄存器中保存当前PC的偏移量,这样,异常处理程序就不需要确定异常是从何种状态进入的。 例如:在软件中断异常SWI,指令 MOV PC,R14_svc总是返回到下一条指令,不管SWI是在ARM状态执行,还是在Thumb状态执行。
对异常的响应 异常响应伪代码 处理器处于Thumb状态,则当异常向量地址加载入PC时,处理器自动切换到ARM状态。ARM微处理器对异常的响应过程用伪码可以描述为: R14_<Exception_Mode> = Return Link SPSR_<Exception_Mode> = CPSR CPSR[4:0] = Exception Mode Number CPSR[5] = 0 If <Exception_Mode> == Reset or FIQ then CPSR[6] = 1 CPSR[7] = 1 PC = Exception Vector Address
从异常返回 对异常的响应 异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回: 将连接寄存器LR的值减去相应的偏移量后送到PC中。 将SPSR复制回CPSR中。 若在进入异常处理时设置了中断禁止位,要在此清除。 可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。
中断处理程序的安装 中断处理程序的安装 一般在系统的启动代码中安装异常处理程序。大致可以分为两种情况: 0地址处存储器为ROM/FLASH 0地址处存储器为RAM
在ROM/FLASH中安装中断处理程序 中断处理程序的安装 在ROM/FLASH的异常中断向量表中,可以使用LDR指令直接向程序计数器PC中赋值,也可以直接使用跳转指令转到异常中断处理程序。 使用LDR指令: Vector_entry: LDR PC, Reset_Handle LDR PC, Undef_Handle LDR PC, SWI_Handle
在ROM/FLASH中安装中断处理程序 中断处理程序的安装 LDR PC, Prefetch_Handle LDR PC, Abort_Handle NOP LDR PC, IRQ_Handle LDR PC, FIQ_Handle Vector_table: Reset_Handle: .LONG Start_Boot Undef_Handle: .LONG Undef_Isr ……
在ROM/FLASH中安装中断处理程序 中断处理程序的安装 使用跳转指令: Vector_entry: B Reset_Handle B Undef_Handle B SWI_Handle B Prefetch_Handle B Abort_Handle NOP B IRQ_Handle B FIQ_Handle
RAM中安装中断处理程序 中断处理程序的安装 当0地址处为RAM时,中断向量表必须使用数据读取指令直接指向PC中赋值的形式。而且必须把中断向量从ROM中复制到RAM地址的0地址处。 MOV r8, #0 ADR r9, Vector_Init_Block LDMIA r9!, {r0-r7} STMIA r8!, {r0-r7}
在C程序中安装异常中断处理程序 中断处理程序的安装 中断向量表使用数据处理指令的情况 在中断向量vector处安装location处指向的处理程序 unsigned ist_handler( unsigned location, unsigned *vector) { unsigned vec, oldvec; vec = (location – (unsigned)vector – 0x08) | 0xe59ff000; oldvec = *vector; *vector = vec; return oldvec; }
在C程序中安装异常中断处理程序 中断处理程序的安装 中断向量表使用跳转指令的情况 在中断向量vector处安装routine处理程序 unsigned ist_handler( unsigned routine, unsigned *vector) { unsigned vec, oldvec; vec = ((routine – (vector – 0x08)>>2); vec = 0xea000000 | vec; oldvec = *vector; *vector = vec; return oldvec; }
ABORT(中止) 各种异常中断的处理 产生中止异常意味着对存储器的访问失败。ARM微处理器在存储器访问周期内检查是否发生中止异常。 中止异常包括两种类型: 指令预取中止:发生在指令预取时。 数据中止:发生在数据访问时。
指令预取异常中断的处理 各种异常中断的处理 系统中不包含MMU时,指令预取中止异常处理程序只是简单的报告错误,然后退出; 在使用MMU的系统中,则发生错误的指令触发虚拟地址失效,在该失效处理程序中重新读取该指令。指令预取异常是在有错误的指令被执行时才触发的。当异常发生时,Lr_abt寄存器没有被更新,它指向引起该指令的后面1条指令。 异常的返回地址应该是该有问题的指令,即Lr_abt-4处。
数据访问异常中断的处理 各种异常中断的处理 系统中不包含MMU时,数据访问中止异常处理程序只是简单的报告错误,然后退出; 在使用MMU的系统中,数据访问中止异常处理程序要处理该数据访问异常。当异常发生时,Lr_abt寄存器已经被更新,它指向引起该异常的指令的后面2条指令。 异常的返回地址是引起数据访问中止异常中断的指令,即Lr_abt-8处。
ABORT(中止)处理函数的退出 各种异常中断的处理 当确定了中止的原因后,Abort处理程序均可以执行以下指令从中止模式返回,无论是在ARM状态还是Thumb状态: SUBS PC, R14_abt, #4 ;指令预取中止 SUBS PC, R14_abt, #8 ;数据中止
FIQ(Fast Interrupt Request) 各种异常中断的处理 FIQ(Fast Interrupt Request) FIQ异常是为了支持数据传输或者通道处理而设计的。 若将CPSR的F位置为1,则会禁止FIQ中断,若将CPSR的F位清零,处理器会在指令执行时检查FIQ的输入。注意只有在特权模式下才能改变F位的状态。 可由外部通过对处理器上的nFIQ引脚输入低电平产生FIQ。不管是在ARM状态还是在Thumb状态下进入FIQ模式,FIQ处理程序均可以执行以下指令从FIQ模式返回: SUBS PC,R14_fiq ,#4
IRQ(Interrupt Request) 各种异常中断的处理 IRQ(Interrupt Request) IRQ异常属于正常的中断请求,可通过对处理器的nIRQ引脚输入低电平产生,IRQ的优先级低于FIQ,当程序执行进入FIQ异常时,IRQ可能被屏蔽。 若将CPSR的I位置为1,则会禁止IRQ中断,若将CPSR的I位清零,处理器会在指令执行完之前检查IRQ的输入。注意只有在特权模式下才能改变I位的状态。 不管是在ARM状态还是在Thumb状态下进入IRQ模式,IRQ处理程序均可以执行以下指令从IRQ模式返回: SUBS PC , R14_irq , #4
IRQ/FIQ处理程序示例 各种异常中断的处理 STMFD sp!, {r0-r12, lr} 调用IRQ/FIQ处理程序 LDMFD sp!, {r0-r12, lr} SUBS pc, lr, #4
Undefined Instruction(未定义指令) 各种异常中断的处理 Undefined Instruction(未定义指令) 当ARM处理器遇到不能处理的指令时,会产生未定义指令异常。采用这种机制,可以通过软件仿真扩展ARM或Thumb指令集。 处理器执行以下程序返回,无论是在ARM状态还是Thumb状态: MOVS PC, R14_und 以上指令恢复PC(从R14_und)和CPSR(从SPSR_und)的值,并返回到未定义指令后的下一条指令。
各种异常中断的处理 SWI(软件中断) 软件中断指令(SWI)用于进入管理模式,常用于请求执行特定的管理功能。软件中断处理程序执行以下指令可以从SWI模式返回,无论是在ARM状态还是Thumb状态: MOVS PC , R14_svc 以上指令恢复PC(从R14_svc)和CPSR(从SPSR_svc) 的值,并返回到SWI的下一条指令。
SWI一级处理程序 各种异常中断的处理 STMFD sp!, {r0-r12, lr} LDR r0, [lr, #-4] BIC r0, r0, #0xFF000000 在此调用二级处理程序 LDMFD sp!, {r0-r12, lr}^
SWI二级处理程序 各种异常中断的处理 CMP r0, #maxSWI LDRLS pc, [pc, r0, LSL #2] B SWIOutofRange SWIJmpTable: .LONG SWInum0 .LONG SWInum1 .LONG SWInum2 ……
异常进入/退出小节 各种异常中断的处理 返回指令 以前的状态 注意 ARM R14_x Thumb R14_x BL MOV PC,R14 返回指令 以前的状态 注意 ARM R14_x Thumb R14_x BL MOV PC,R14 PC+4 PC+2 1 SWI MOVS PC,R14_svc UDEF MOVS PC,R14_und FIQ SUBS PC,R14_fiq,#4 2 IRQ SUBS PC,R14_irq,#4 PABT SUBS PC,R14_abt,#4 DABT SUBS PC,R14_abt,#8 PC+8 3 RESET NA - 4
注意事项 各种异常中断的处理 在此PC应是具有预取中止的BL/SWI/未定义指令所取的地址。 在此PC是从FIQ或IRQ取得不能执行的指令的地址。 在此PC是产生数据中止的加载或存储指令的地址。 系统复位时,保存在R14_svc中的值是不可预知的。