您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 第9章异常中断处理.
AssembleLanguageofARM1第9章异常中断处理AssembleLanguageofARM29.1ARM异常中断处理概述控制程序的执行流程有3种方式:正常情况下,程序每执行一条指令,程序计数器寄存器pc将增加4或2字节;通过跳转指令,程序可以跳转到特定的地址标号处执行,或者跳转到特定的子程序处执行;B指令BL指令BLX指令,BX指令当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。AssembleLanguageofARM3异常中断名称含义复位当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常处理程序处执行。未定义指令当ARM处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。可使用该异常机制进行软件仿真。软件中断(SWI)该异常由执行SWI指令产生,可用于用户模式下的程序调用特权操作指令。可使用该异常机制实现系统功能调用。指令预取中止若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常。数据访问中止若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。外部中断请求(IRQ)当处理器的外部中断请求引脚有效,且CPSR中的I位为0时,产生IRQ异常。系统的外设可通过该异常请求中断服务。快速中断请求(FIQ)当处理器的快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常。9.1.1ARM体系中异常中断种类AssembleLanguageofARM4中断向量表指定了各异常中断及其处理程序的对应关系,通常放在内存的低地址端。在ARM体系中,异常中断向量表的大小为32字节,其中每个异常中断占据4个字节,保留4个字节。每个异常中断对应的中断向量表中的4个字节空间中存放一条跳转指令或者一条向PC寄存器中赋值的数据访问指令。9.1.2异常中断向量表及异常中断优先级AssembleLanguageofARM5各异常中断的中断向量地址及其异常中断处理优先级表中断向量地址异常中断类型异常中断模式优先级*0x0复位特权模式(SVC)10x4未定义的指令未定义指令中止模式(Undef)60x8软件中断(SWI)特权模式(SVC)60x0c指令预取中止中止模式50x10数据访问中止中止模式20x14保留未使用未使用0x18外部中断请求(IRQ)外部中断(IRQ)模式40x1c快速中断请求(FIQ)快速中断(FIQ)模式3*注:1最高;6最低AssembleLanguageofARM69.1.3异常中断使用的寄存器各异常中断对应着一定的处理器模式。应用程序通常运行在用户模式下。各种不同的处理器模式对应于该处理器模式的物理寄存器组。AssembleLanguageofARM7异常处理中的寄存器使用与异常发生相关的模式改变意味着所调用的异常处理程序至少要访问:私有的SP_mode(stackpointer).私有的LR_mode(linkregister).私有的SPSR_mode(savedprogramstatusregister).在FIQ异常处理中,另有5个私有的通用寄存器(r8_fiqtor12_fiq).其它的寄存器是所有模式公用的.异常处理程序必须确保其他的寄存器在退出前恢复到原来的状态这可以通过将任何正在使用的寄存器的内容保存在堆栈中,并在返回前恢复来实现任何所需寄存器的初始化要由应用程序的起始代码来完成,参阅:“EmbeddedSoftwareDevelopment”AssembleLanguageofARM8AssembleLanguageofARM9处理器模式描述用户模式(usr)正常程序执行的模式快速中断模式(fiq)用于高速数据传输或通道处理外部中断模式(irq)用于通用的中断处理特权模式(svc)供操作系统使用的保护模式(复位或软中断)中止模式(abt)当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。未定义指令中止模式(und)当未定义的指令执行时进入该模式,可用于支持通过软件仿真硬件的协处理器。系统模式(sys)用于运行具有特权级的操作系统任务。ARM中的处理器模式AssembleLanguageofARM10VectorTableVectortablecanbeat0xFFFF0000onARM720TandonARM9/10familydevicesFIQIRQ(Reserved)DataAbortPrefetchAbortSoftwareInterruptUndefinedInstructionReset0x1C0x180x140x100x0C0x080x040x00当异常产生时,ARMcore:拷贝CPSR到SPSR_mode设置适当的CPSR位:改变处理器状态进入ARM状态改变处理器模式进入相应的异常模式设置中断禁止位禁止相应中断(如果需要)保存返回地址到LR_mode设置PC位相应的异常向量返回时,异常处理需要:从SPSR_mode恢复CPSR从LR_mode恢复PCNote:这些操作只能在ARM态执行.2.9进入和退出异常中断的过程AssembleLanguageofARM11ARM微处理器对异常的响应过程用伪码可以描述为:R14_Exception_Mode=ReturnLinkSPSR_Exception_Mode=CPSRCPSR[4:0]=ExceptionModeNumberCPSR[5]=0;当运行于ARM工作状态时IfException_Mode==ResetorFIQthenCPSR[6]=1;当响应FIQ异常时,禁止新的FIQ异常CPSR[7]=1;禁止新的IRQ异常PC=ExceptionVectorAddressAssembleLanguageofARM12各种中断响应的伪代码参见教材P.265-268AssembleLanguageofARM139.2.2从异常中断处理程序中返回从异常中断处理程序中返回包括以下两个基本操作:1、恢复被中断的程序的处理器状态,即将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。2、返回到发生异常中断的指令的下一条指令执行,即将lr_mode寄存器的内容复制到程序计数器PC中。复位异常中断处理程序不需要返回,整个应用系统是从复位异常中断处理程序开始执行的。SUBSPC,R14_fiq,#4或MOVPC,R14_svcAssembleLanguageofARM14异常返回指令从SWI和Undef异常返回MOVSpc,lr从FIQ,IRQ和预取异常(PrefectAbort)返回SUBSpc,lr,#4从数据异常(DataAbort)返回SUBSpc,lr,#8如果LR之前被压栈的话使用LDM“^”LDMFDsp!,{pc}^异常返回:使用一数据处理指令:相应的指令取决于什么样的异常在特权模式不仅仅更新PC,而且拷贝SPSR到CPSR设置CPSR,“S”bitPC做为目的寄存器AssembleLanguageofARM15向量表指令LiteralpoolcontainingaddressofUndefHandlerIRQhandlerwithin32MBytesBranchinstructionrangeSWIExceptionhandlerplacedonapplicableaddressboundaryFIQhandlerfollowsvectortableUndefhandleroutside32MBytesbranchinstructionrange32Mbytes4Kbytes0x00x10000x20000000xFFC0x80x180x300000000xFFFFFFFF0x1C0x4MOVPC,#0x30000000BIRQ_handler0x30008000IRQHandlerSWIHandlerFIQHandlerLDRPC,[PC,#+0xFF0]UndefHandler0x30008000AssembleLanguageofARM16ARMorThumb?Thumb/ARM混合应用程序ARMCodeARMCodeThumbCodeFIQIRQ(Reserved)DataAbortPrefetchAbortSoftwareInterruptUndefinedInstructionResetAssembleLanguageofARM179.3在应用程序中安装异常中断处理程序将异常中断处理程序注册到异常中断向量表中有两种办法:使用跳转指令使用数据读取指令LDRAssembleLanguageofARM181.地址0x0处为ROM的情况使用数据读取指令LDR直接向程序计数器PC中赋值;使用跳转指令直接跳转到异常中断处理器程序参见教材P.271的代码AssembleLanguageofARM192.地址0x0处为RAM的情况只能使用数据读取指令LDR直接向程序计数器PC中赋值;而且必须将中断向量表从ROM中复制到RAM的地址0x0开始处的存储空间中。AssembleLanguageofARM209.4SWI异常中断处理程序通过SWI异常中断,用户模式的应用程序可以调用系统模式下的代码。在SWI指令中包括一个24位的立即数,指示了用户请求的特定的SWI功能。AssembleLanguageofARM21软中断SWI0x01向量表用户程序(C/ASM)SWI处理程序(ASM)(可选)SWI处理程序(C)用户程序调用SWISWI中断处理程序包含汇编部分和可选用的C部分AssembleLanguageofARM229.4.2SWI异常中断调用执行SWI指令后,系统将会把CPSR寄存器的内容保存到寄存器SPSR_svc中,将返回地址保存到LR_svc中。在特权模式调用SWI须将原始的寄存器SPSP_svc和寄存器LR_svc值保存在数据栈中,以免内容被破坏。从应用程序中调用SWI使用汇编指令调用特定的SWI功能从C程序中调用特定的SWI功能从应用程序中动态调用SWI直到运行时才能确定需要调用的SWI功能号AssembleLanguageofARM23SWI调用汇编中,SWI调用使用“SWI中断号”实现,e.g:SWI0x24小心在汇编中如果SWI调用时处于Supervisor模式将会冲掉LR_svc.例如:在SWI处理程序中的二级调用解决方法:在SWI调用之前对LR_svc压栈保护C中,使用关键词“__swi”来定义一个软中断函数.ForExamplecompilesto:__swi(0x24)voidmy_swi(void);voidfoo(void){my_swi();}fooSTMFDsp!,{lr}SWI0x24LDMFDsp!,{pc}AssembleLanguageofARM24传递参数到SWIs参数传递使用:SWI号(e.g.semi-hosting,使用0x123456(ARM)or0xAB(Thumb)内核寄存器汇编中,简单设置需要的寄存器,然后调用SWI即可:LDRr1,=Text;stringpointerMOVr0,#4;SYS_WRITE0SWI0x123456;ARMsemihostingSWI:TextDCBARM”,0C中,关键字“__swi”允许最多4个参数,使用r0-r3来传递Note:因为SWI调用将切换到supervisor模式,所以不能采用堆栈来传递参数函数声明__swi(0x123456)voidSemihosting(unsignedop,char*s);函数调用Semihosting(0x4,“ARM”);AssembleLanguageofARM25存取SWI号ARM
本文标题:第9章异常中断处理.
链接地址:https://www.777doc.com/doc-2113455 .html