




已阅读5页,还剩34页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
异常处理,Agenda,序言中断处理软中断(SWI)处理其它异常处理,VectorTable,Vectortablecanbeat0 xFFFF0000onARM720TandonARM9/10familydevices,FIQ,IRQ,(Reserved),DataAbort,PrefetchAbort,SoftwareInterrupt,UndefinedInstruction,Reset,异常处理,当异常产生时,ARMcore:拷贝CPSR到SPSR_设置适当的CPSR位:改变处理器状态进入ARM状态改变处理器模式进入相应的异常模式设置中断禁止位禁止相应中断(如果需要)保存返回地址到LR_设置PC位相应的异常向量返回时,异常处理需要:从SPSR_恢复CPSR从LR_恢复PCNote:这些操作只能在ARM态执行.,从SWI和Undef异常返回MOVSpc,lr从FIQ,IRQ和预取异常(PrefectAbort)返回SUBSpc,lr,#4从数据异常(DataAbort)返回SUBSpc,lr,#8如果LR之前被压栈的话使用LDM“”LDMFDsp!,pc,异常返回:使用一数据处理指令:相应的指令取决于什么样的异常在特权模式不仅仅更新PC,而且拷贝SPSR到CPSR,设置CPSR,“S”bitPC做为目的寄存器,异常返回指令,Seeendofpresentationforbackgroundinformationontheseinstructions,异常优先级,异常在当前指令执行完成之后才被响应多个异常可以在同一时间产生异常指定了优先级和固定的服务顺序:ResetDataAbortFIQIRQPrefetchAbortSWIUndefinedinstruction,向量表指令,32Mbytes,2个的中断源!因此需要一个中断控制器(通常是地址映射的)来控制中断是怎样传递给ARM的。在许多系统中,一些中断的优先级比其它中断的优先级高,他们要抢先任何正在处理的低优先级中断。Note:通常中断处理程序总是应该包含清除中断源的代码。,地址映射中断控制器,nIRQ,nFIQ,ARM,MultiplePeripheralinterruptsources,ARM读控制器寄存器并找到IRQ/FIQ中断源,ARM写外设寄存器清相应中断源,FIQvsIRQ,FIQ和IRQ提供了非常基本的优先级级别。在下边两种情况下,FIQs有高于IRQs的优先级:当多个中断产生时,FIQ高于IRQ.处理FIQ时禁止IRQs.IRQs将不会被响应直到FIQ处理完成.FIQs的设计使中断处理尽可能的快.FIQ向量位于中断向量表的最末.为了使中断处理程序可从中断向量处连续执行FIQ模式有5个额外的私有寄存器(r8-r12)中断处理必须保护其使用的非私有寄存器可以有多个FIQ中断源,但是考虑到系统性能应避免嵌套。,C语言简单中断处理程序,在C中可以在函数定义时使用关键词“_irq”来写一个简单的中断处理程序.这将导致:函数所有用到的寄存器被保护如果可能,任何远程调用所使用的其他寄存器也被保护函数退出使用正确的返回指令(修正pc=lr-4并从spsr恢复cpsr)_irq仅仅可在armcc中使用.可是被_irq函数调用的子程序可以用tcc编译.确保IRQ的堆栈指针已经设置!,C中断处理示例,_irqvoidIRQHandler(void)volatileunsignedint*source=(unsignedint*)0 x80000000;if(*source=1)/whichinterruptwasitint_handler_1();/processtheinterrupt/insertchecksforotherinterruptsourceshere*(source+1)=0;/cleartheinterruptOutputwithout_irqOutputwith_irqSTMFDsp!,r4,lrSTMFDsp!,r0-r4,r12,lrMOVr4,#0 x80000000MOVr4,#0 x80000000LDRr0,r4,#0LDRr0,r4,#0CMPr0,#1CMPr0,#1BLEQint_handler_1BLEQint_handler_1MOVr0,#0MOVr0,#0dfgSTRr0,r4,#4STRr0,r4,#4LDMFDsp!,r4,pcLDMFDsp!,r0-r4,r12,lrSUBSpc,lr,#4,C中断处理示例,_irqvoidIRQHandler(void)volatileunsignedint*source=(unsignedint*)0 x80000000;if(*source=1)/whichinterruptwasit?int_handler_1();/processtheinterrupt/insertchecksforotherinterruptsourceshere*(source+1)=0;/cleartheinterrupt,Outputwithout_irqOutputwith_irq,STMFDsp!,r4,lrMOVr4,#0 x80000000LDRr0,r4,#0CMPr0,#1LEQint_handler_1MOVr0,#0STRr0,r4,#4LDMFDsp!,r4,pc,STMFDsp!,r0-r4,r12,lrMOVr4,#0 x80000000LDRr0,r4,#0CMPr0,#1BLEQint_handler_1MOVr0,#0STRr0,r4,#4LDMFDsp!,r0-r4,r12,lrSUBSpc,lr,#4,中断重新使能的问题,当另外一个中断抢先当前中断时,如果程序员使用下边特殊的步骤来防止系统状态丢失,中断是可以嵌套:保存IRQ状态下的LR(LR_irq)保存IRQ状态下的SPSR(SPSR_IRQ)当中断可重入时,在中断处理程序中使用“BL”必须特别小心:如果第二个中断产生,BL调用的返回地址(LR_irq)可能被冲掉,子程序将错误的返回导致无限循环!解决方法是在使用“BL”之前改变模式来避免LR_irq被冲掉通常使用“System”模式(这时BL使用LR_usr)在处理程序结束,必须:切换回IRQ模式禁止中断(来避免在恢复SPSR_irq到一个临时的寄存器中后它被冲掉)._irq不能用来写可重入中断处理程序必须采用采用下页中汇编代码段来代替。,C可重入中断示例,IRQHandlerSUBlr,lr,#4STMFDsp!,lrMRSr14,SPSRSTMFDsp!,r12,r14MOVr12,#IntBaseLDRr12,r12,#IntSourceMRSr14,CPSRBICr14,r14,#0 x9FORRr14,r14,#0 x1FMSRCPSR_c,r14STMFDsp!,r0-r3,lrMOVr0,r12BLC_irq_handlerLDMFDsp!,r0-r3,lrMRSr12,CPSRBICr12,r12,0 x1FORRr12,r12,0 x92MSRCPSR_c,r12LDMFDsp!,r12,r14MSRSPSR_csxf,r14LDMFDsp!,PC,切换到IRQ模式同时禁止IRQ.,LR_irq,SPSR_irq和工作寄存器(r12)压栈保护来避免下一次中断发生使它们被冲掉,保存R0-3,LR_user到user栈中,然后调用C子程序,中断源(R0)作为一个参数传入C处理函数。,恢复LR_irq,SPSR_irq和工作寄存器(r12),然后退出中断处理使用修正后的LR,读/清中断控制器中断源,切换到System模式同时使能IRQ,Quiz,1)中断向量表位于存储器的什么位置?2)IRQ或FIQ异常的返回指令是什么?3)什么类型的中断优先级最高?4)什么指令可以放在中断向量表?5)FIQ的什么特点使得它处理的速度比IRQ快?6)在嵌套的中断处理程序中,如何确保LR没有被破坏?,Agenda,序言中断处理软中断(SWI)处理其它异常处理,软中断,SWI0 x01,向量表,用户程序(C/ASM),SWI处理程序(ASM),(可选),SWI处理程序(C),用户程序调用SWISWI中断处理程序包含汇编部分和可选用的C部分,SWI调用,汇编中,SWI调用使用“SWI中断号”实现,e.g:SWI0 x24小心在汇编中如果SWI调用时处于Supervisor模式将会冲掉LR_svc.例如:在SWI处理程序中的二级调用解决方法:在SWI调用之前对LR_svc压栈保护C中,使用关键词“_swi”来定义一个软中断函数.,ForExample,compilesto:,_swi(0 x24)voidmy_swi(void);voidfoo(void)my_swi();,fooSTMFDsp!,lrSWI0 x24LDMFDsp!,pc,传递参数到SWIs,参数传递使用:SWI号(e.g.semi-hosting,使用0 x123456(ARM)or0 xAB(Thumb)内核寄存器汇编中,简单设置需要的寄存器,然后调用SWI即可:LDRr1,=Text;stringpointerMOVr0,#4;SYS_WRITE0SWI0 x123456;ARMsemihostingSWI:TextDCBARM”,0C中,关键字“_swi”允许最多4个参数,使用r0-r3来传递Note:因为SWI调用将切换到supervisor模式,所以不能采用堆栈来传递参数函数声明_swi(0 x123456)voidSemihosting(unsignedop,char*s);函数调用Semihosting(0 x4,“ARM”);,ARM内核不提供直接传递软中断(SWI)号到处理程序的机制:SWI处理程序必须定位SWI指令,并提取SWI指令中的常数域为此,SWI处理程序必须确定SWI调用是在哪一种状态(ARM/Thumb).检查SPSR的T-bitSWI指令在ARM状态下在LR-4位置,Thumb状态下在LR-2位置SWI指令按相应的格式译码:ARM态格式:Thumb态格式:,存取SWI号,存取SWI参数,汇编中,存取调用者设置的寄存器即可.在返回之前,修改寄存器的值,传回参数给调用者.传参数给C,通常采用压栈的方法.将参数压栈给调用的函数传递一个指向这些参数的指针也可以通过将参数值写回到适当的堆栈位置,将参数传回,软中断(SWI)处理示例,T_bitEQU0 x20SWI_HandlerSTMFDsp!,r0-r3,r12,lrMOVr1,spMRSr0,spsrSTMFDsp!,r0TSTr0,#T_bitLDRNEHr0,lr,#-2BICNEr0,r0,#0 xff00LDREQr0,lr,#-4BICEQr0,r0,#0 xff000000;r0nowcontainsSWInumber;r1nowcontainspointertoparametersonstackBLC_SWI_HandlerLDMFDsp!,r1MSRspsr_csxf,r1LDMFDsp!,r0-r3,r12,pc,提取SWI指令的常量域(24-bits:如果从ARM中调用,8-bits:如果从Thumb中调用),恢复寄存器并返回,取出spsr并压栈保存,寄存器压栈,设置堆栈指针,调用CSWI处理程序,/Memorymappedregistersvolatileunsignedparallel_output,parallel_input;:voidC_SWI_Handler(unsignednumber,int*param)/r0=SWInumber/r1=pointertoSWIparametersinmemoryswitch(number)case0:parallel_output=param0;break;case1:param0=parallel_input;break;default:break;,CSWI处理程序示例,Agenda,序言中断处理软中断(SWI)处理其它异常处理,复位(reset),Reset处理程序执行的动作取决于不同的系统.例如它可以:设置异常向量初始化存储器系统(e.g.MMU/PU)初始化所有需要的模式的堆栈和寄存器初始化所有C所需的变量初始化所有I/O设备使能中断改变处理器模式或/和状态调用主应用程序详细资料请参考“EmbeddedSoftwareDevelopment”模块.,未定义指令,下列情况将引起未定义指令异常:ARM试图执行一真正的未定义指令ARM遇到一协处理器指令,可是系统中的协处理器硬件并不存在ARM遇到一协处理器指令,系统中协处理器硬件也存在,可是ARM不是在超级用户模式(privilegedmode)例如:操作协处理器15(cp15)-ARMcache控制器解决方法:在处理程序中执行软协处理器仿真禁止在非超级用户模式下操作报告错误并退出,预取异常,不论异常是发生在ARM还是Thumb状态下,导致预取异常的指令地址在lr-4处.处理方法取决于存储器管理策略有存储器管理的系统(e.g.demandpagedvirtualmemory)修正问题(e.g.enablecorrectmemorypage)返回并重新执行预取异常的指令(SUBSpc,lr,#4)没有存储器管理的系统通常表示一个致命的错误报告错误(如果可能)然后退出,数据异常,导致异常的指令的地址在lr-8处.处理方法取决于存储器管理策略有存储器管理的系统(e.g.demand-pagedvirtualmemory)如果使用了MMU,数据异常的地址在MMU的“FaultAddress”寄存器中修正问题(e.g.enablecorrectpageofmemory)返回并重新执行数据异常的指令SUBSpc,lr,#8没有存储器管理的系统通常表示一个致命的错误报告错误(如果可能)然后退出,TheAbortModel,许多ARM存储器存取指令将更新基址寄存器:e.g.LDRr0,r1,#8!;“!”将更新R1如果异常是数据异常,对基址寄存器的影响取决于使用的是哪种ARMcore.“BaseRestoredAbortModel”StrongARM,ARM9andARM10系列支持基址寄存器由ARMcore自动恢复.“BaseUpdatedAbortModel”ARM7TDMI系列支持在异常指令重新执行之前基址寄存器必须由处理程序进行恢复两种模式的例子程序包含在ADSexamples目录下。,Quiz,1)预取和数据异常之间的差别是什么?2)什么会导致未定义指令异常发生?3)为什么异常只能在arm状态下返回?4)如何禁止中断?5)为什么在异常处理程序中,你可能想切换到Thumb状态?,更多信息,更多信息清参考:ADSDeveloperGuideSection6:HandlingProcessorExceptionsSection4:InterworkingARMandThumbADSToolsGuideSection3:ARMCompilerReferenceApplicationNote30,“SoftwarePrioritizationofInterrupts”ReferencePeripheralSpecification(ARMDDI0062),Jumptolastslide,异常返回地址,ARM状态:在异常产生的时候内核设置LR_mode=PC-4.处理程序需要调整LR_mode(取决于是哪一个异常发生了),以便返回到正确的地址Thumb状态:处理器根据发生的异常自动修改存在LR_mode中的地址不论异常产生时的状态如何,处理器确保处理程序的ARM返回指令能返回到正确的地址(和正确的状态),从SWIs和未定义指令返回,异常是由指令本身引起的,因此内核在计算LR时的PC值并没有被更新.ARMThumbSWIpc-8pc-4;Exceptiontakenherexxxpc-4pc-2;lr=ne
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- CA认证费用管理办法
- 药品注册管理办法新
- 衢州市阅读馆管理办法
- 2025年互联网行业产品经理面试题预测与应对策略
- 2025年乡镇社保服务岗位面试要点及模拟题解析
- 2025年京东集团校园招聘笔试模拟题及面试技巧
- 2025年人工智能工程师中级考试预测题及解析
- 2025年人力资源管理师考试题库及模拟题集
- 贷款人员管理办法试行
- 中国好人动态管理办法
- 从课本到奥数课件
- 人类行为与社会环境全套课件
- (全国通用)三甲人民医院诊断证明书请假条模板(广东佛山)
- 部编版一年级上册语文研课标说教材课件
- 2022年廊坊市投资控股集团有限公司招聘笔试题库及答案解析
- 最新VTE指南解读(静脉血栓栓塞症的临床护理指南解读)
- 旅行社计调实务课件完整版电子教案
- 乌有先生传(原文+注释+译文)精编版
- DB53∕T 1022-2021 三七栽培技术规程
- 直接还原铁生产工艺
- 《幂的运算》习题精选及答案
评论
0/150
提交评论