第9章 异常中断处理_第1页
第9章 异常中断处理_第2页
第9章 异常中断处理_第3页
第9章 异常中断处理_第4页
第9章 异常中断处理_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Assemble Language of ARM1第9章 异常中断处理Assemble Language of ARM2o 9.1 ARM异常中断处理概述o控制程序的执行流程有3种方式:n正常情况下,程序每执行一条指令,程序计数器寄存器pc将增加4或2字节;n通过跳转指令,程序可以跳转到特定的地址标号处执行,或者跳转到特定的子程序处执行;o B指令o BL指令o BLX指令,BX指令n当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。Assemble Language of ARM3异常中断名称含义复位当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常处理程

2、序处执行。未定义指令当ARM处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。可使用该异常机制进行软件仿真。软件中断(SWI)该异常由执行SWI指令产生,可用于用户模式下的程序调用特权操作指令。可使用该异常机制实现系统功能调用。指令预取中止若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常。数据访问中止若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。外部中断请求(IRQ )当处理器的外部中断请求引脚有效,且CPSR中的I位为0时,产生IRQ异常。系统的外设可通过该异常

3、请求中断服务。快速中断请求( FIQ )当处理器的快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常。o 9.1.1 ARM体系中异常中断种类Assemble Language of ARM4o 中断向量表指定了各异常中断及其处理程序的对应关系,通常放在内存的低地址端。o 在ARM体系中,异常中断向量表的大小为32字节,其中每个异常中断占据4个字节,保留4个字节。o 每个异常中断对应的中断向量表中的4个字节空间中存放一条跳转指令或者一条向PC寄存器中赋值的数据访问指令。o 9.1.2 异常中断向量表及异常中断优先级Assemble Language of ARM5o各异常中断的中断

4、向量地址及其异常中断处理优先级表中断向量地址异常中断类型异常中断模式优先级*0 x0复位特权模式(SVC)10 x4未定义的指令未定义指令中止模式(Undef)60 x8软件中断(SWI)特权模式(SVC)60 x0c指令预取中止中止模式50 x10数据访问中止中止模式20 x14保留未使用未使用0 x18外部中断请求(IRQ)外部中断(IRQ)模式40 x1c快速中断请求(FIQ)快速中断(FIQ)模式3*注:1最高;6最低Assemble Language of ARM6o 9.1.3 异常中断使用的寄存器n 各异常中断对应着一定的处理器模式。n 应用程序通常运行在用户模式下。n 各种不同

5、的处理器模式对应于该处理器模式的物理寄存器组。Assemble Language of ARM7异常处理中的寄存器使用o与异常发生相关的模式改变意味着所调用的异常处理程序至少要访问:n私有的 SP_ (stack pointer ).n私有的 LR_ (link register).n私有的 SPSR_ (saved program status register ).n在 FIQ异常处理中, 另有5个私有的通用寄存器 (r8_fiq to r12_fiq).n其它的寄存器是所有模式公用的.o异常处理程序必须确保其他的寄存器在退出前恢复到原来的状态o这可以通过将任何正在使用的寄存器的内容保存在

6、堆栈中,并在返回前恢复来实现o任何所需寄存器的初始化要由应用程序的起始代码来完成,参阅: “Embedded Software Development”Assemble Language of ARM8o Assemble Language of ARM9 处理器模式描述用户模式(usr)正常程序执行的模式快速中断模式(fiq)用于高速数据传输或通道处理外部中断模式(irq)用于通用的中断处理特权模式(svc)供操作系统使用的保护模式(复位或软中断)中止模式(abt)当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。未定义指令中止模式(und)当未定义的指令执行时进入该模式,可用于支

7、持通过软件仿真硬件的协处理器。 系统模式(sys) 用于运行具有特权级的操作系统任务。ARM中的处理器模式Assemble Language of ARM10Vector TableVector table can be at 0 xFFFF0000 on ARM720T and on ARM9/10 family devicesFIQIRQ(Reserved)Data AbortPrefetch AbortSoftware InterruptUndefined InstructionReset0 x1C0 x180 x140 x100 x0C0 x080 x040 x00o当异常产生时, A

8、RM core:n拷贝 CPSR 到 SPSR_n设置适当的 CPSR 位: o改变处理器状态进入 ARM 状态o改变处理器模式进入相应的异常模式o设置中断禁止位禁止相应中断 (如果需要)n保存返回地址到 LR_n设置 PC 位相应的异常向量o返回时, 异常处理需要:n从 SPSR_恢复CPSRn从LR_恢复PC nNote:这些操作只能在 ARM 态执行.o 2.9 进入和退出异常中断的过程 Assemble Language of ARM11oARM微处理器对异常的响应过程用伪码可以描述为:R14_ = Return LinkSPSR_ = CPSRCPSR4:0 = Exception

9、Mode NumberCPSR5 = 0 ;当运行于ARM工作状态时If = Reset or FIQ thenCPSR6 = 1 ;当响应FIQ异常时,禁止新的FIQ异常 CPSR7 = 1 ;禁止新的IRQ异常PC = Exception Vector Address Assemble Language of ARM12o 各种中断响应的伪代码参见教材P.265-268Assemble Language of ARM13o 9.2.2 从异常中断处理程序中返回从异常中断处理程序中返回包括以下两个基本操作: n1、恢复被中断的程序的处理器状态,即将SPSR_mode寄存器内容复制到当前程序状

10、态寄存器CPSR中。n2、返回到发生异常中断的指令的下一条指令执行,即将lr_mode寄存器的内容复制到程序计数器PC中。o 复位异常中断处理程序不需要返回,整个应用系统是从复位异常中断处理程序开始执行的。SUBS PC,R14_fiq ,#4或 MOV PC , R14_svcAssemble Language of ARM14异常返回指令o从SWI 和 Undef异常返回MOVS pc,lro从FIQ, IRQ 和 预取异常(Prefect Abort)返回SUBS pc,lr,#4o从数据异常( Data Abort)返回SUBS pc,lr,#8o如果 LR之前被压栈的话使用LDM “

11、 ” LDMFD sp!,pco异常返回:o使用一数据处理指令:n相应的指令取决于什么样的异常o在特权模式不仅仅更新PC,而且 拷贝SPSR 到 CPSR设置CPSR, “S” bitPC做为目的寄存器Assemble Language of ARM15向量表指令Literal pool containing address of Undef HandlerIRQ handler within 32MBytes Branch instruction rangeSWI Exception handler placed on applicable address boundaryFIQ handl

12、er follows vector table Undef handler outside 32MBytes branch instruction range 32 Mbytes2个的中断源!n 因此需要一个中断控制器(通常是地址映射的)来控制中断是怎样传递给ARM的。n 在许多系统中,一些中断的优先级比其它中断的优先级高,他们要抢先任何正在处理的低优先级中断。oNote: 通常中断处理程序总是应该包含清除中断源的代码。地址映射地址映射中断控制器中断控制器nIRQnFIQARMMultiplePeripheralinterruptsourcesARM读控制器寄存器并找到IRQ/FIQ中断源AR

13、M写外设寄存器清相应中断源Assemble Language of ARM31FIQ vs IRQoFIQ 和 IRQ 提供了非常基本的优先级级别。o在下边两种情况下,FIQs有高于IRQs的优先级:n当多个中断产生时,FIQ高于IRQ.n处理 FIQ时禁止 IRQs.oIRQs 将不会被响应直到 FIQ处理完成.oFIQs 的设计使中断处理尽可能的快.nFIQ 向量位于中断向量表的最末.o为了使中断处理程序可从中断向量处连续执行nFIQ 模式有5个额外的私有寄存器 (r8-r12)o中断处理必须保护其使用的非私有寄存器n可以有多个FIQ中断源,但是考虑到系统性能应避免嵌套。Assemble

14、Language of ARM32C语言简单中断处理程序o在C中可以在函数定义时使用关键词 “_irq”来写一个简单的中断处理程序. o这将导致: n函数所有用到的寄存器被保护 n如果可能, 任何远程调用所使用的其他寄存器也被保护n函数退出使用正确的返回指令(修正 pc = lr-4 并从 spsr恢复cpsr)o_irq 仅仅可在 armcc中使用.n可是被_irq 函数调用的子程序可以用 tcc编译.o确保 IRQ的堆栈指针已经设置 !Assemble Language of ARM33C 中断处理示例_irq void IRQHandler (void) volatile unsigne

15、d 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 interruptoOutput without _irq Output with _irq STMFD sp!,r4,lr STMFD sp!,r0-r4,r12,lrMOV r4,#0 x80

16、000000 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,#4Assemble Language of ARM34C 中断处理示例_irq void IRQHandler (void)volatile unsigned int *source =

17、 (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 interruptn Output without _irq Output with _irqSTMFD sp!,r4,lrMOV r4,#0 x80000000LDR r0,r4,#0CMP r0,#1LEQ int_

18、handler_1MOV r0,#0STR r0,r4,#4LDMFD sp!,r4,pcSTMFD 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,#4Assemble Language of ARM35中断重新使能的问题o当另外一个中断抢先当前中断时,如果程序员使用下边特殊的步骤来防止系统状态丢失 ,中断是可以嵌套:n保存IRQ状态下的LR( LR_irq )n保存IRQ状态下的SPS

19、R(SPSR_IRQ)o当中断可重入时,在中断处理程序中使用“BL”必须特别小心:n如果第二个中断产生,BL调用的返回地址 (LR_irq) 可能被冲掉,子程序将错误的返回 导致无限循环!o解决方法是在使用“BL”之前改变模式来避免 LR_irq 被冲掉n通常使用“System”模式 ( 这时 BL 使用 LR_usr)o在处理程序结束,必须:n切换回 IRQ 模式 n禁止中断 (来避免在恢复SPSR_irq 到一个临时的寄存器中后它被冲掉).o_irq 不能用来写可重入中断处理程序n必须采用采用下页中汇编代码段来代替。Assemble Language of ARM36C 可重入中断示例IR

20、QHandler 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 MSRCPS

21、R_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)oReset 处理程序执行的动作取决

22、于不同的系统. 例如它可以:n设置异常向量n初始化存储器系统 (e.g. MMU/PU)n初始化所有需要的模式的堆栈和寄存器 n初始化所有 C 所需的变量n初始化所有I/O设备n使能中断n改变处理器模式或/和状态n调用主应用程序o详细资料请参考 “Embedded Software Development” 模块.Assemble Language of ARM38未定义指令o下列情况将引起未定义指令异常:nARM 试图执行一真正的未定义指令nARM 遇到一协处理器指令,可是系统中的协处理器硬件并不存在nARM 遇到一协处理器指令,系统中协处理器硬件也存在,可是ARM 不是在超级用户模式(pr

23、ivileged mode)o 例如:操作协处理器15(cp15) - ARM cache 控制器o解决方法:n在处理程序中执行软协处理器仿真n禁止在非超级用户模式下操作n报告错误并退出预取异常o不论异常是发生在 ARM 还是Thumb 状态下,导致预取异常的指令地址在 lr-4 处.o处理方法取决于存储器管理策略n有存储器管理的系统 (e.g. demand paged virtual memory)o 修正问题 (e.g. enable correct memory page)o 返回并重新执行预取异常的指令( SUBS pc,lr,#4 )n没有存储器管理的系统o 通常表示一个致命的错误

24、o 报告错误 (如果可能) 然后退出数据异常o导致异常的指令的地址在 lr-8 处.o处理方法取决于存储器管理策略n有存储器管理的系统(e.g. demand-paged virtual memory)o 如果使用了 MMU ,数据异常的地址在 MMU 的 “Fault Address” 寄存器中o 修正问题(e.g. enable correct page of memory)o 返回并重新执行数据异常的指令SUBS pc,lr,#8n没有存储器管理的系统o 通常表示一个致命的错误o 报告错误 (如果可能) 然后退出The Abort Modelo许多ARM 存储器存取指令将更新基址寄存器

25、:ne.g. LDRr0,r1,#8! ;“!” 将更新将更新 R1o如果异常是数据异常, 对基址寄存器的影响取决于使用的是哪种 ARM core.n“Base Restored Abort Model”o StrongARM, ARM9 and ARM10 系列支持o 基址寄存器由ARM core 自动恢复.n“Base Updated Abort Model”o ARM7TDMI 系列支持o 在异常指令重新执行之前基址寄存器必须由处理程序进行恢复o两种模式的例子程序包含在 ADS examples 目录下。异常返回地址o ARM 状态:n在异常产生的时候内核设置 LR_mode = PC

26、- 4.n处理程序需要调整 LR_mode (取决于是哪一个异常发生了),以便返回到正确的地址o Thumb 状态:n处理器根据发生的异常自动修改存在 LR_mode 中的地址n不论异常产生时的状态如何,处理器确保处理程序的ARM 返回指令能返回到正确的地址(和正确的状态)从SWIs和未定义指令返回o异常是由指令本身引起的,因此内核在计算 LR 时的 PC 值并没有被更新. ARM Thumb SWIpc-8 pc-4 ;Exception taken here xxx pc-4 pc-2 ;lr = next instruction yyy pc pco因此返回指令为:MOVS pc,lro

27、Note : 表示异常返回后将执行的那条指令从FIQs和IRQs返回o异常在当前指令执行完成后才被响应.因此内核在计算 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 aheado因此返回指令为:SUBS pc,lr,#4oNote : 表示异常返回后将执行的那条指令从预取异常返回o当指令到达执行

28、阶段时异常才产生,因此内核在计算 LR 时的 PC 值已被更新.o需要重新执行导致异常的指令 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 aheado因此返回指令为:SUBS pc,lr,#4oNote : 表示异常返回后将执行的那条指令从数据异常返回o异常发生 ( 和计算 LR ) 在 PC 被更新之后.o需要重新执行导致异常的指令ARM Thumb www pc - 1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论