《武汉创维特ARM教学系统-06 异常中断处理课件》由会员分享,可在线阅读,更多相关《武汉创维特ARM教学系统-06 异常中断处理课件(29页珍藏版)》请在金锄头文库上搜索。
1、嵌入式系统教案,武汉创维特信息技术有限公司,2020/8/13,2,提纲,1,3,2,ARM 异常中断处理概述,中断处理程序的安装,第六章 异常中断处理,异常的响应和退出,各种异常中断的处理,4,3,ARM异常中断处理概述,当正常的程序执行流程发生暂时的停止时,称之为异常,例如处理一个外部的中断请求。在处理异常之前,当前处理器的状态必须保留,这样当异常处理完成之后,当前程序可以继续执行。处理器允许多个异常同时发生,它们将会按固定的优先级进行处理。 ARM体系结构中的异常,与8位/16位体系结构的中断有很大的相似之处,但异常与中断的概念并不完全等同。,ARM异常中断处理概述,4,ARM体系结构所
2、支持的异常类型,ARM异常中断处理概述,5,异常向量表(Exception Vectors),ARM异常中断处理概述,6,异常优先级(Exception Priorities),ARM异常中断处理概述,7,对异常的响应,当一个异常出现以后,ARM微处理器会执行以下几步操作 将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。 将CPSR复制到相应的SPSR中。 根据异常类型,强制设置CPSR的运行模式位。 强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。,对异常的响应,8,异常响应伪代码,处理器处于Thumb状态,则当异常
3、向量地址加载入PC时,处理器自动切换到ARM状态。ARM微处理器对异常的响应过程用伪码可以描述为: R14_ = Return Link SPSR_ = CPSR CPSR4:0 = Exception Mode Number CPSR5 = 0 If = Reset or FIQ then CPSR6 = 1 CPSR7 = 1 PC = Exception Vector Address,对异常的响应,9,从异常返回,异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回: 将连接寄存器LR的值减去相应的偏移量后送到PC中。 将SPSR复制回CPSR中。 若在进入异常处理时设置了中断禁
4、止位,要在此清除。 可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。,对异常的响应,10,中断处理程序的安装,一般在系统的启动代码中安装异常处理程序。大致可以分为两种情况: 0地址处存储器为ROM/FLASH 0地址处存储器为RAM,中断处理程序的安装,11,在ROM/FLASH中安装中断处理程序,在ROM/FLASH的异常中断向量表中,可以使用LDR指令直接向程序计数器PC中赋值,也可以直接使用跳转指令转到异常中断处理程序。 使用LDR指令: Vector_entry: LDRPC, Reset_Handle LDRPC, Undef_Handle LDRP
5、C, SWI_Handle,中断处理程序的安装,12,在ROM/FLASH中安装中断处理程序,LDRPC, Prefetch_Handle LDRPC, Abort_Handle NOP LDRPC, IRQ_Handle LDRPC, FIQ_Handle Vector_table: Reset_Handle: .LONGStart_Boot Undef_Handle: .LONGUndef_Isr ,中断处理程序的安装,13,在ROM/FLASH中安装中断处理程序,使用跳转指令: Vector_entry: BReset_Handle BUndef_Handle BSWI_Handle B
6、Prefetch_Handle BAbort_Handle NOP BIRQ_Handle BFIQ_Handle,中断处理程序的安装,14,RAM中安装中断处理程序,当0地址处为RAM时,中断向量表必须使用数据读取指令直接指向PC中赋值的形式。而且必须把中断向量从ROM中复制到RAM地址的0地址处。 MOVr8, #0 ADRr9, Vector_Init_Block LDMIAr9!, r0-r7 STMIAr8!, r0-r7,中断处理程序的安装,15,在C程序中安装异常中断处理程序,中断向量表使用数据处理指令的情况 在中断向量vector处安装location处指向的处理程序 unsi
7、gned ist_handler( unsigned location, unsigned *vector) unsigned vec, oldvec; vec = (location (unsigned)vector 0 x08) | 0 xe59ff000; oldvec = *vector; *vector = vec; return oldvec; ,中断处理程序的安装,16,在C程序中安装异常中断处理程序,中断向量表使用跳转指令的情况 在中断向量vector处安装routine处理程序 unsigned ist_handler( unsigned routine, unsigned
8、*vector) unsigned vec, oldvec; vec = (routine (vector 0 x08)2); vec = 0 xea000000 | vec; oldvec = *vector; *vector = vec; return oldvec; ,中断处理程序的安装,17,ABORT(中止),产生中止异常意味着对存储器的访问失败。ARM微处理器在存储器访问周期内检查是否发生中止异常。 中止异常包括两种类型: 指令预取中止:发生在指令预取时。 数据中止:发生在数据访问时。,各种异常中断的处理,18,指令预取异常中断的处理,系统中不包含MMU时,指令预取中止异常处理程序
9、只是简单的报告错误,然后退出; 在使用MMU的系统中,则发生错误的指令触发虚拟地址失效,在该失效处理程序中重新读取该指令。指令预取异常是在有错误的指令被执行时才触发的。当异常发生时,Lr_abt寄存器没有被更新,它指向引起该指令的后面1条指令。 异常的返回地址应该是该有问题的指令,即Lr_abt4处。,各种异常中断的处理,19,数据访问异常中断的处理,系统中不包含MMU时,数据访问中止异常处理程序只是简单的报告错误,然后退出; 在使用MMU的系统中,数据访问中止异常处理程序要处理该数据访问异常。当异常发生时,Lr_abt寄存器已经被更新,它指向引起该异常的指令的后面2条指令。 异常的返回地址是
10、引起数据访问中止异常中断的指令,即Lr_abt8处。,各种异常中断的处理,20,ABORT(中止)处理函数的退出,当确定了中止的原因后,Abort处理程序均可以执行以下指令从中止模式返回,无论是在ARM状态还是Thumb状态: SUBS PC, R14_abt, #4;指令预取中止 SUBS PC, R14_abt, #8;数据中止,各种异常中断的处理,21,FIQ(Fast Interrupt Request),FIQ异常是为了支持数据传输或者通道处理而设计的。 若将CPSR的F位置为1,则会禁止FIQ中断,若将CPSR的F位清零,处理器会在指令执行时检查FIQ的输入。注意只有在特权模式下才
11、能改变F位的状态。 可由外部通过对处理器上的nFIQ引脚输入低电平产生FIQ。不管是在ARM状态还是在Thumb状态下进入FIQ模式,FIQ处理程序均可以执行以下指令从FIQ模式返回: SUBS PC,R14_fiq ,#4,各种异常中断的处理,22,IRQ(Interrupt Request),IRQ异常属于正常的中断请求,可通过对处理器的nIRQ引脚输入低电平产生,IRQ的优先级低于FIQ,当程序执行进入FIQ异常时,IRQ可能被屏蔽。 若将CPSR的I位置为1,则会禁止IRQ中断,若将CPSR的I位清零,处理器会在指令执行完之前检查IRQ的输入。注意只有在特权模式下才能改变I位的状态。
12、不管是在ARM状态还是在Thumb状态下进入IRQ模式,IRQ处理程序均可以执行以下指令从IRQ模式返回: SUBS PC , R14_irq , #4,各种异常中断的处理,23,IRQ/FIQ处理程序示例,STMFDsp!, r0-r12, lr 调用IRQ/FIQ处理程序 LDMFDsp!, r0-r12, lr SUBSpc, lr, #4,各种异常中断的处理,24,Undefined Instruction(未定义指令),当ARM处理器遇到不能处理的指令时,会产生未定义指令异常。采用这种机制,可以通过软件仿真扩展ARM或Thumb指令集。 处理器执行以下程序返回,无论是在ARM状态还是
13、Thumb状态: MOVS PC, R14_und 以上指令恢复PC(从R14_und)和CPSR(从SPSR_und)的值,并返回到未定义指令后的下一条指令。,各种异常中断的处理,25,SWI(软件中断),软件中断指令(SWI)用于进入管理模式,常用于请求执行特定的管理功能。软件中断处理程序执行以下指令可以从SWI模式返回,无论是在ARM状态还是Thumb状态: MOVS PC , R14_svc 以上指令恢复PC(从R14_svc)和CPSR(从SPSR_svc)的值,并返回到SWI的下一条指令。,各种异常中断的处理,26,SWI一级处理程序,STMFDsp!, r0-r12, lr LD
14、R r0, lr, #-4 BICr0, r0, #0 xFF000000 在此调用二级处理程序 LDMFDsp!, r0-r12, lr,各种异常中断的处理,27,SWI二级处理程序,CMPr0, #maxSWI LDRLSpc, pc, r0, LSL #2 B SWIOutofRange SWIJmpTable: .LONGSWInum0 .LONGSWInum1 .LONGSWInum2 ,各种异常中断的处理,28,异常进入/退出小节,各种异常中断的处理,29,注意事项,在此PC应是具有预取中止的BL/SWI/未定义指令所取的地址。 在此PC是从FIQ或IRQ取得不能执行的指令的地址。 在此PC是产生数据中止的加载或存储指令的地址。 系统复位时,保存在R14_svc中的值是不可预知的。,各种异常中断的处理,