《异常中断处理》PPT课件.ppt
《《异常中断处理》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《异常中断处理》PPT课件.ppt(48页珍藏版)》请在三一办公上搜索。
1、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,
2、中断向量表指定了各异常中断及其处理程序的对应关系,通常放在内存的低地址端。在ARM体系中,异常中断向量表的大小为32字节,其中每个异常中断占据4个字节,保留4个字节。每个异常中断对应的中断向量表中的4个字节空间中存放一条跳转指令或者一条向PC寄存器中赋值的数据访问指令。,9.1.2 异常中断向量表及异常中断优先级,Assemble Language of ARM,5,各异常中断的中断向量地址及其异常中断处理优先级表,*注:1最高;6最低,Assemble Language of ARM,6,9.1.3 异常中断使用的寄存器各异常中断对应着一定的处理器模式。应用程序通常运行在用户模式下。各种不同
3、的处理器模式对应于该处理器模式的物理寄存器组。,Assemble Language of ARM,7,异常处理中的寄存器使用,与异常发生相关的模式改变意味着所调用的异常处理程序至少要访问:私有的 SP_(stack pointer).私有的 LR_(link register).私有的 SPSR_(saved program status register).在 FIQ异常处理中,另有5个私有的通用寄存器(r8_fiq to r12_fiq).其它的寄存器是所有模式公用的.异常处理程序必须确保其他的寄存器在退出前恢复到原来的状态这可以通过将任何正在使用的寄存器的内容保存在堆栈中,并在返回前恢复
4、来实现任何所需寄存器的初始化要由应用程序的起始代码来完成,参阅:“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_恢复CPS
5、R从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,各种中
6、断响应的伪代码参见教材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,异常返回
7、指令,从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?,Asse
8、mble 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开始处的存储空间中。,
9、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须将原始的寄存器SP
10、SP_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 Exampl
11、e,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;A
12、RM 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指令中的常数域为此
13、,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
14、,软中断(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;
15、根据中断号跳转到相应的功能程序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_Handle
16、r(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异常
17、中断被屏蔽。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 v
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 异常中断处理 异常 中断 处理 PPT 课件
链接地址:https://www.31ppt.com/p-5507167.html