欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    《异常中断处理》PPT课件.ppt

    • 资源ID:5507167       资源大小:334.99KB        全文页数:48页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    《异常中断处理》PPT课件.ppt

    Assemble Language of ARM,1,第9章 异常中断处理,Assemble Language of ARM,2,9.1 ARM异常中断处理概述控制程序的执行流程有3种方式:正常情况下,程序每执行一条指令,程序计数器寄存器pc将增加4或2字节;通过跳转指令,程序可以跳转到特定的地址标号处执行,或者跳转到特定的子程序处执行;B指令BL指令BLX指令,BX指令当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。,Assemble Language of ARM,3,9.1.1 ARM体系中异常中断种类,Assemble Language of ARM,4,中断向量表指定了各异常中断及其处理程序的对应关系,通常放在内存的低地址端。在ARM体系中,异常中断向量表的大小为32字节,其中每个异常中断占据4个字节,保留4个字节。每个异常中断对应的中断向量表中的4个字节空间中存放一条跳转指令或者一条向PC寄存器中赋值的数据访问指令。,9.1.2 异常中断向量表及异常中断优先级,Assemble Language of ARM,5,各异常中断的中断向量地址及其异常中断处理优先级表,*注:1最高;6最低,Assemble Language of ARM,6,9.1.3 异常中断使用的寄存器各异常中断对应着一定的处理器模式。应用程序通常运行在用户模式下。各种不同的处理器模式对应于该处理器模式的物理寄存器组。,Assemble Language of ARM,7,异常处理中的寄存器使用,与异常发生相关的模式改变意味着所调用的异常处理程序至少要访问:私有的 SP_(stack pointer).私有的 LR_(link register).私有的 SPSR_(saved program status register).在 FIQ异常处理中,另有5个私有的通用寄存器(r8_fiq to r12_fiq).其它的寄存器是所有模式公用的.异常处理程序必须确保其他的寄存器在退出前恢复到原来的状态这可以通过将任何正在使用的寄存器的内容保存在堆栈中,并在返回前恢复来实现任何所需寄存器的初始化要由应用程序的起始代码来完成,参阅:“Embedded Software Development”,Assemble Language of ARM,8,Assemble Language of ARM,9,ARM中的处理器模式,Assemble Language of ARM,10,当异常产生时,ARM core:拷贝 CPSR 到 SPSR_设置适当的 CPSR 位:改变处理器状态进入 ARM 状态改变处理器模式进入相应的异常模式设置中断禁止位禁止相应中断(如果需要)保存返回地址到 LR_设置 PC 位相应的异常向量返回时,异常处理需要:从 SPSR_恢复CPSR从LR_恢复PC Note:这些操作只能在 ARM 态执行.,2.9 进入和退出异常中断的过程,Assemble Language of ARM,11,ARM微处理器对异常的响应过程用伪码可以描述为:R14_=Return LinkSPSR_=CPSRCPSR4:0=Exception Mode NumberCPSR5=0;当运行于ARM工作状态时If=Reset or FIQ thenCPSR6=1;当响应FIQ异常时,禁止新的FIQ异常 CPSR7=1;禁止新的IRQ异常PC=Exception Vector Address,Assemble Language of ARM,12,各种中断响应的伪代码参见教材P.265-268,Assemble Language of ARM,13,9.2.2 从异常中断处理程序中返回从异常中断处理程序中返回包括以下两个基本操作:1、恢复被中断的程序的处理器状态,即将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。2、返回到发生异常中断的指令的下一条指令执行,即将lr_mode寄存器的内容复制到程序计数器PC中。复位异常中断处理程序不需要返回,整个应用系统是从复位异常中断处理程序开始执行的。,SUBS PC,R14_fiq,#4,或 MOV PC,R14_svc,Assemble Language of ARM,14,异常返回指令,从SWI 和 Undef异常返回MOVS pc,lr从FIQ,IRQ 和 预取异常(Prefect Abort)返回SUBS pc,lr,#4从数据异常(Data Abort)返回SUBS pc,lr,#8如果 LR之前被压栈的话使用LDM“”LDMFD sp!,pc,异常返回:使用一数据处理指令:相应的指令取决于什么样的异常在特权模式不仅仅更新PC,而且 拷贝SPSR 到 CPSR,设置CPSR,“S”bitPC做为目的寄存器,Assemble Language of ARM,15,向量表指令,Assemble Language of ARM,16,ARM or Thumb?,Assemble Language of ARM,17,9.3 在应用程序中安装异常中断处理程序将异常中断处理程序注册到异常中断向量表中有两种办法:使用跳转指令使用数据读取指令LDR,Assemble Language of ARM,18,1.地址0 x0处为ROM的情况使用数据读取指令LDR直接向程序计数器PC中赋值;使用跳转指令直接跳转到异常中断处理器程序参见教材P.271的代码,Assemble Language of ARM,19,2.地址0 x0处为RAM的情况只能使用数据读取指令LDR直接向程序计数器PC中赋值;而且必须将中断向量表从ROM中复制到RAM的地址0 x0开始处的存储空间中。,Assemble Language of ARM,20,9.4 SWI异常中断处理程序通过SWI异常中断,用户模式的应用程序可以调用系统模式下的代码。在SWI指令中包括一个24位的立即数,指示了用户请求的特定的SWI功能。,Assemble Language of ARM,21,软中断,用户程序调用 SWISWI 中断处理程序包含汇编部分和可选用的 C 部分,Assemble Language of ARM,22,9.4.2 SWI异常中断调用执行SWI指令后,系统将会把CPSR寄存器的内容保存到寄存器SPSR_svc中,将返回地址保存到LR_svc中。在特权模式调用SWI须将原始的寄存器SPSP_svc和寄存器LR_svc值保存在数据栈中,以免内容被破坏。从应用程序中调用SWI使用汇编指令调用特定的SWI功能从C程序中调用特定的SWI功能从应用程序中动态调用SWI直到运行时才能确定需要调用的SWI功能号,Assemble Language of ARM,23,SWI 调用,汇编中,SWI 调用使用“SWI 中断号”实现,e.g:SWI 0 x24小心在汇编中如果SWI 调用时处于Supervisor模式将会冲掉LR_svc.例如:在SWI处理程序中的二级调用解决方法:在SWI调用之前对LR_svc 压栈保护C 中,使用关键词“_swi”来定义一个软中断函数.,For Example,compiles to:,_swi(0 x24)void my_swi(void);void foo(void)my_swi();,foo STMFD sp!,lr SWI 0 x24 LDMFD sp!,pc,Assemble Language of ARM,24,传递参数到SWIs,参数传递使用:SWI 号(e.g.semi-hosting,使用0 x123456(ARM)or 0 xAB(Thumb)内核寄存器汇编中,简单设置需要的寄存器,然后调用SWI 即可:LDR r1,=Text;string pointerMOV r0,#4;SYS_WRITE0SWI 0 x123456;ARM semihosting SWI:TextDCB ARM”,0C 中,关键字“_swi”允许最多 4个参数,使用 r0-r3 来传递Note:因为SWI调用将切换到supervisor 模式,所以不能采用堆栈来传递参数函数声明 _swi(0 x123456)void Semihosting(unsigned op,char*s);函数调用 Semihosting(0 x4,“ARM”);,Assemble Language of ARM,25,存取 SWI 号,ARM 内核不提供直接传递软中断(SWI)号到处理程序的机制:SWI 处理程序必须定位SWI 指令,并提取SWI指令中的常数域为此,SWI 处理程序必须确定SWI 调用是在哪一种状态(ARM/Thumb).检查 SPSR 的 T-bitSWI 指令在ARM 状态下在 LR-4 位置,Thumb 状态下在 LR-2位置SWI 指令按相应的格式译码:ARM 态格式:Thumb 态格式:,Assemble Language of ARM,26,存取 SWI 参数,汇编中,存取调用者设置的寄存器即可.在返回之前,修改寄存器的值,传回参数给调用者.传参数给C,通常采用压栈的方法.将参数压栈给调用的函数传递一个指向这些参数的指针也可以通过将参数值写回到适当的堆栈位置,将参数传回,Assemble Language of ARM,27,软中断(SWI)处理示例,SWI_Handler;中断向量表中使用B SWI-Handler指令 T_bitEQU 0 x20STMFD sp!,r0-r3,r12,lr MOV r1,spMRS r0,spsrSTMFD sp!,r0TST r0,#T_bitLDRNEH r0,lr,#-2 BICNE r0,r0,#0 xff00LDREQ r0,lr,#-4 BICEQ r0,r0,#0 xff000000;r0 now contains SWI number;r1 now contains pointer to parameters on stackBL C_SWI_Handler;根据中断号跳转到相应的功能程序LDMFD sp!,r1MSR spsr_csxf,r1LDMFD sp!,r0-r3,r12,pc,提取SWI 指令的常量域(24-bits:如果从ARM中调用,8-bits:如果从Thumb 中调用),恢复寄存器并返回,取出 spsr 并压栈保存,寄存器压栈,设置堆栈指针,调用 C SWI 处理程序,Assemble Language of ARM,28,C SWI 处理程序示例,/Memory mapped registersvolatile unsigned parallel_output,parallel_input;:void C_SWI_Handler(unsigned number,int*param)/r0=SWI number/r1=pointer to SWI parameters in memory switch(number)case 0:parallel_output=param0;break;case 1:param0=parallel_input;break;default:break;,Assemble Language of ARM,29,9.5 FIQ和IRQ异常中断处理程序FIQ和IRQ异常中断用于外部设备向CPU请求中断服务,这两个中断的引脚都是低电平有效的。当CPSR中的F和I控制位为1时,FIQ和IRQ异常中断被屏蔽。FIQ比IRQ优先级高,表现在:当FIQ和IRQ异常中断同时产生时,CPU先处理FIQ异常中断。在FIQ异常中断处理程序中IRQ异常中断被禁止。,Assemble Language of ARM,30,外部中断,ARM 有两级外部中断 FIQ,IRQ.可是大多数的基于ARM 的系统有 2个的中断源!因此需要一个中断控制器(通常是地址映射的)来控制中断是怎样传递给ARM的。在许多系统中,一些中断的优先级比其它中断的优先级高,他们要抢先任何正在处理的低优先级中断。Note:通常中断处理程序总是应该包含清除中断源的代码。,Assemble Language of ARM,31,FIQ vs IRQ,FIQ 和 IRQ 提供了非常基本的优先级级别。在下边两种情况下,FIQs有高于IRQs的优先级:当多个中断产生时,FIQ高于IRQ.处理 FIQ时禁止 IRQs.IRQs 将不会被响应直到 FIQ处理完成.FIQs 的设计使中断处理尽可能的快.FIQ 向量位于中断向量表的最末.为了使中断处理程序可从中断向量处连续执行FIQ 模式有5个额外的私有寄存器(r8-r12)中断处理必须保护其使用的非私有寄存器可以有多个FIQ中断源,但是考虑到系统性能应避免嵌套。,Assemble Language of ARM,32,C语言简单中断处理程序,在C中可以在函数定义时使用关键词“_irq”来写一个简单的中断处理程序.这将导致:函数所有用到的寄存器被保护 如果可能,任何远程调用所使用的其他寄存器也被保护函数退出使用正确的返回指令(修正 pc=lr-4 并从 spsr恢复cpsr)_irq 仅仅可在 armcc中使用.可是被_irq 函数调用的子程序可以用 tcc编译.确保 IRQ的堆栈指针已经设置!,Assemble Language of ARM,33,C 中断处理示例,_irq void IRQHandler(void)volatile unsigned int*source=(unsigned int*)0 x80000000;if(*source=1)/which interrupt was itint_handler_1();/process the interrupt/insert checks for other interrupt sources here*(source+1)=0;/clear the interruptOutput without _irq Output with _irq STMFD sp!,r4,lr STMFD sp!,r0-r4,r12,lrMOV r4,#0 x80000000 MOV r4,#0 x80000000LDR r0,r4,#0 LDR r0,r4,#0CMP r0,#1 CMP r0,#1BLEQ int_handler_1 BLEQ int_handler_1MOV r0,#0 MOV r0,#0 dfg STR r0,r4,#4 STR r0,r4,#4LDMFD sp!,r4,pc LDMFD sp!,r0-r4,r12,lr SUBS pc,lr,#4,Assemble Language of ARM,34,C 中断处理示例,_irq void IRQHandler(void)volatile unsigned int*source=(unsigned int*)0 x80000000;if(*source=1)/which interrupt was it?int_handler_1();/process the interrupt/insert checks for other interrupt sources here*(source+1)=0;/clear the interrupt,Output without _irq Output with _irq,STMFD sp!,r4,lrMOV r4,#0 x80000000LDR r0,r4,#0CMP r0,#1LEQ int_handler_1MOV r0,#0STR r0,r4,#4LDMFD sp!,r4,pc,STMFD sp!,r0-r4,r12,lrMOV r4,#0 x80000000LDR r0,r4,#0CMP r0,#1BLEQ int_handler_1MOV r0,#0STR r0,r4,#4LDMFD sp!,r0-r4,r12,lrSUBS pc,lr,#4,Assemble Language of ARM,35,中断重新使能的问题,当另外一个中断抢先当前中断时,如果程序员使用下边特殊的步骤来防止系统状态丢失,中断是可以嵌套:保存IRQ状态下的LR(LR_irq)保存IRQ状态下的SPSR(SPSR_IRQ)当中断可重入时,在中断处理程序中使用“BL”必须特别小心:如果第二个中断产生,BL调用的返回地址(LR_irq)可能被冲掉,子程序将错误的返回 导致无限循环!解决方法是在使用“BL”之前改变模式来避免 LR_irq 被冲掉通常使用“System”模式(这时 BL 使用 LR_usr)在处理程序结束,必须:切换回 IRQ 模式 禁止中断(来避免在恢复SPSR_irq 到一个临时的寄存器中后它被冲掉)._irq 不能用来写可重入中断处理程序必须采用采用下页中汇编代码段来代替。,Assemble Language of ARM,36,C 可重入中断示例,IRQHandler SUBlr,lr,#4 STMFDsp!,lr MRSr14,SPSR STMFDsp!,r12,r14 MOVr12,#IntBase LDRr12,r12,#IntSource MRSr14,CPSR BICr14,r14,#0 x9F ORRr14,r14,#0 x1F MSRCPSR_c,r14 STMFDsp!,r0-r3,lr MOVr0,r12 BLC_irq_handler LDMFDsp!,r0-r3,lr MRSr12,CPSR BICr12,r12,0 x1F ORRr12,r12,0 x92 MSRCPSR_c,r12 LDMFDsp!,r12,r14 MSRSPSR_csxf,r14 LDMFDsp!,PC,切换到 IRQ 模式同时禁止 IRQ.,LR_irq,SPSR_irq 和工作寄存器(r12)压栈保护来避免下一次中断发生使它们被冲掉,保存R0-3,LR_user 到 user 栈中,然后调用 C 子程序,中断源(R0)作为一个参数传入 C 处理函数。,恢复LR_irq,SPSR_irq 和工作寄存器(r12),然后退出中断处理使用修正后的LR,读/清中断控制器中断源,切换到 System 模式同时使能 IRQ,复位(reset),Reset 处理程序执行的动作取决于不同的系统.例如它可以:设置异常向量初始化存储器系统(e.g.MMU/PU)初始化所有需要的模式的堆栈和寄存器 初始化所有 C 所需的变量初始化所有I/O设备使能中断改变处理器模式或/和状态调用主应用程序详细资料请参考“Embedded Software Development”模块.,Assemble Language of ARM,38,未定义指令,下列情况将引起未定义指令异常:ARM 试图执行一真正的未定义指令ARM 遇到一协处理器指令,可是系统中的协处理器硬件并不存在ARM 遇到一协处理器指令,系统中协处理器硬件也存在,可是ARM 不是在超级用户模式(privileged mode)例如:操作协处理器15(cp15)-ARM cache 控制器解决方法:在处理程序中执行软协处理器仿真禁止在非超级用户模式下操作报告错误并退出,预取异常,不论异常是发生在 ARM 还是Thumb 状态下,导致预取异常的指令地址在 lr-4 处.处理方法取决于存储器管理策略有存储器管理的系统(e.g.demand paged virtual memory)修正问题(e.g.enable correct memory page)返回并重新执行预取异常的指令(SUBS pc,lr,#4)没有存储器管理的系统通常表示一个致命的错误报告错误(如果可能)然后退出,数据异常,导致异常的指令的地址在 lr-8 处.处理方法取决于存储器管理策略有存储器管理的系统(e.g.demand-paged virtual memory)如果使用了 MMU,数据异常的地址在 MMU 的“Fault Address”寄存器中修正问题(e.g.enable correct page of memory)返回并重新执行数据异常的指令SUBS pc,lr,#8没有存储器管理的系统通常表示一个致命的错误报告错误(如果可能)然后退出,The Abort Model,许多ARM 存储器存取指令将更新基址寄存器:e.g.LDRr0,r1,#8!;“!”将更新 R1如果异常是数据异常,对基址寄存器的影响取决于使用的是哪种 ARM core.“Base Restored Abort Model”StrongARM,ARM9 and ARM10 系列支持基址寄存器由ARM core 自动恢复.“Base Updated Abort Model”ARM7TDMI 系列支持在异常指令重新执行之前基址寄存器必须由处理程序进行恢复两种模式的例子程序包含在 ADS examples 目录下。,异常返回地址,ARM 状态:在异常产生的时候内核设置 LR_mode=PC-4.处理程序需要调整 LR_mode(取决于是哪一个异常发生了),以便返回到正确的地址Thumb 状态:处理器根据发生的异常自动修改存在 LR_mode 中的地址不论异常产生时的状态如何,处理器确保处理程序的ARM 返回指令能返回到正确的地址(和正确的状态),从SWIs和未定义指令返回,异常是由指令本身引起的,因此内核在计算 LR 时的 PC 值并没有被更新.ARM Thumb SWIpc-8 pc-4;Exception taken here xxx pc-4 pc-2;lr=next instruction yyy pc pc因此返回指令为:MOVS pc,lrNote:表示异常返回后将执行的那条指令,从FIQs和IRQs返回,异常在当前指令执行完成后才被响应.因此内核在计算 LR 时的 PC 值已被更新.ARM Thumb www pc-12 pc 6 Interrupt occurred during execution xxx pc-8 pc-4 yyy pc 4 pc 2 ARM lr=next instruction zzz pc pc Thumb lr=two instructions ahead因此返回指令为:SUBS pc,lr,#4Note:表示异常返回后将执行的那条指令,从预取异常返回,当指令到达执行阶段时异常才产生,因此内核在计算 LR 时的 PC 值已被更新.需要重新执行导致异常的指令 ARM Thumb www pc-8 pc-4 Prefetch Abort occurred here xxx pc-4 pc-2 ARM lr=next instruction yyy pc pc Thumb lr=two instructions ahead因此返回指令为:SUBS pc,lr,#4Note:表示异常返回后将执行的那条指令,从数据异常返回,异常发生(和计算 LR)在 PC 被更新之后.需要重新执行导致异常的指令ARM Thumb www pc-12pc-6 Data abort occurred here xxx pc-8pc-4 yyy pc-4pc-2 ARM lr=two instructions ahead zzz pcpc aaa pc+4pc+2 Thumb lr=four instructions ahead因此返回指令为:SUBS pc,lr,#8Note:表示异常返回后将执行的那条指令,Assemble Language of ARM,47,举例SWI ReadC;从读数据流得到下一个字符SWI WriteI+”k”;输出一个K”到写数据流SWINE 0;条件调用用户模式,注释区域为0上面的例子加顶相应的超级用户代码存在,例0 x08 B Supervisor;SWI 入口EntryTable;超级用户程序入口DCD ZeroRtnDCD ReadCRtnDCD WriteIRtn.Zero EQU 0ReadC EQU 256WriteI EQU 512超级用户SWI has routine required in bits 8-23 and data(if any)in bits 0-7.假设R13_svc指向一个相应的堆栈STMFD R13,R0-R2,R14;保存工作寄存器和返回地址LDR R0,R14,#-4;得到SWI指令BIC R0,R0,#0 xFF000000;清除高8位MOV R1,R0,LSR#8;得到程序偏移量ADR R2,EntryTable;得到入口列表的起始地址LDR R15,R2,R1,LSL#2;分支到适当的程序WriteIRtn;enter with character in R0 bits 0-7.LDMFD R13,R0-R2,R15;恢复工作环境并返回恢复处理器模式和标志位,Assemble Language of ARM,48,小结,掌握处理器对各种异常中断响应的过程以及从中断处理程序的返回掌握异常中断类型及其含义掌握中断优先级和中断向量,

    注意事项

    本文(《异常中断处理》PPT课件.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开