ARM的异常处理过程分析

上传人:ni****g 文档编号:486810661 上传时间:2022-08-09 格式:DOCX 页数:17 大小:319.42KB
返回 下载 相关 举报
ARM的异常处理过程分析_第1页
第1页 / 共17页
ARM的异常处理过程分析_第2页
第2页 / 共17页
ARM的异常处理过程分析_第3页
第3页 / 共17页
ARM的异常处理过程分析_第4页
第4页 / 共17页
ARM的异常处理过程分析_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《ARM的异常处理过程分析》由会员分享,可在线阅读,更多相关《ARM的异常处理过程分析(17页珍藏版)》请在金锄头文库上搜索。

1、uC/OS-II官网给出来的ARM7-ARM9移植手册(AN-104),分析了在ARM中移植的 问题,想想从来没有认真的学习过ARM的汇编,趁着这个机会复习复习吧。其实底层的东 西才是创造力的心脏。其中的移植代码中存在的很多问题比如中断的关闭和开启,任务级别的情景切换,中断 到任务的情景切换都是我们在平时移植中讲到,我也不在此强调了。在官网中提供的移植过 程中存在异常处理机制,这个本不是在移植过程中考虑的,但是文档中确实提供了一个比较 好的处理方式。我在此对这一段时间的学习做一个总结。首先需要了解ARM的异常处理机制,异常是每一种处理器都必须考虑的问题之一,关 键在于如何让处理,返回地址在什么

2、位置都是需要考虑的,ARM中支持7种异常,其中包括复位、未定义指令异常、软中断异常、预取指令中止、 数据中止、IRQ、IFQ。每一种异常运行在特定的处理器模式下。我在此逐一的分析。一般异常发生后,CPU都会进行一系列的操作,这些操作有一部分是CPU自动完成, 有一部分是需要我们程序员完成。首先说明CPU会自动完成的部分,用ARM结构手册中的代码描述如下:R14_ = return link/这个可以参看寄存器的说明,两个作用SPSR_ = CPSRCPSR4:0 = exception mode numberCPSR5 = 0 ;/AEM 指令If =Reset or Fiq then /只有

3、在复位和FIQ模式下才会关闭FIQ中断CPSR6 = 1;CPSR7 = 1 ;任何异常模式下都会关闭IRQ中断PC = exception vector address从上面的代码中我们可以发现CPU自动处理的过程包括如下:1、拷贝 CPSR 到 SPSR_2、设置适当的CPSR位:改变处理器状态进入ARM状态;改变处理器模式进入相应 的异常模式;设置中断禁止位禁止相应中断。3、更新LR_vmode,这个寄存器中保存的是异常返回时的链接地址4、设置PC到相应的异常向量以上的操作都是CPU自动完成,异常的向量表如下:Table 2-3 Exception pracessing modesExc

4、eption typeModeNormal addressHigh vector addressRjeseiSupervisor0X00000000DxFFFFOOOOUndefinedUnde-fmed0x00000004DXFFPF00D4SofmTare inteimpt (SWI)Supervisor0X00000008OXFFFFOCOSPre fetch Abortfetch memory abort)AbortOxOOOOOOOCDxFPPPOOOCData Abort (data access memory abort)Abort0x00000010DxFFFFOOLOIRQ

5、(intermpt)IRQ0x00000013 DxFFPFOOLSI IQ (fast mtemipt)FIQOxOOOOOOlCDxFFFFQOLC返回地址问题异常的返回地址也是需要我们注意的地方,不同的异常模式返回地址也是存在差异的, 这主要是因为各种异常产生的机理存在差别所导致的。这样我们的需要在异常进入处理函数 之前或者在返回时调整返回地址,一般采用进入异常处理函数前进行手动调整。下面每一种 异常R14保存的值都给了出来,其中也包含了 CPU自动处理的部分,根据保存的R14就可 以知道怎样实现地址的返回。复位异常:0EsecucePC0x00000000CPP.ObLQOll0PCO

6、xOOOOOOOSmodestateEnter UndefinedExecute in. ARM可以看出该模式下的先对来说返回地址也比较简单,不需要做太多的描述。未定义的指令异常:返回的方式也比较简单:MOVS PC, R14软中断异常:返回的方式也比较简单:R14_und = address of next instruction after the undefined instructionPC = 0x00000004CPR 7J= 1if high vectors conEiguzsd thenPC = OxEFPFOOOOelseDisaLleDisablefast interrup

7、ts */ noma L interrupts/ChinaUnix 谭客t(og chinsunix n&tR14 svgPR_avc0CPR5Enter Supervisor niQde +/ Execute in ARM state */R.14_sv: SPSR_svc CPSR 4 : 0CPSR 5CPR E|?PR_und 二 CPSRCPSR 4 : 0二 ObllOllCPSR 5= 0/* CPR6 is unchanged */CPSR 7= 1it higii vectors configured thenPC = DXFFFF0004else=a_ddrsss af n

8、ezt in8tru.Gtion aitrthe SWT instruatian/+ CPSR5 is unchanged */CPSR.7 = 11 IiLgti vectors configured thenPG = OxFFFFOOOSelseChlnaUnucWblog chinanix.n&t=UNPREDICTABLE valu=UNPREDICTABLE value=OblOOlL/* Disable normalinterrupts +/ChinaUntx 般btoq chinaunix netDisalDle normal interrupt 3 * f/*ExecuteMO

9、VS PC, R14PC, R14, #4数据中止PC, R14, #4IRQ中断的处理过程:SUBSPC, R14, #8预取指令中止异常:返回需要做下面的调整:返回地址需要做下面的调整:如果需要重新访问数据则:如果不需要重新访问数据则:RL4_irq =of nsinstruction, to be exscuted. + 4,5PR_irq = CPSR.CPSR4 : 0二 ObLOOlOCPSR5 = 0/* CPR.6 is unchanged. * /CPSR7 二 1if High vectors configured thenPC = OxFFFFOOiaelsePC/* E

10、nter IRQ mode /+ Execute in ARW/1 Disable normalsta_t s * /interruptsChinaUnix 痔客bioQ0x00000018返回地址需要做下面的调整:SUBS PC, R14,#4IFQ中断:R14_fiq = address of next ins匕匚口匚七匚口!! to be-+ 4SPSR_flq = CPREstcute in ARM 日七ate 1 /Disable fast Lnterrupts */Disable normal interrupts */ChinaUnix 舞客blog chmaunx netCPS

11、R 4:a= oioaoi/* Entsr FIQ mods*/CPSR 5=0严CPSR 6=1/*CPGR 7=1严if high vectors configured thenPC= OxFFFFOOlCelsepc二 oxooaoooic返回地址需要做下面的调整:SUBS PC, R14 ,#4从上面的代码可以知道,对于每一种异常,保存的返回地址都是不一样的,一般都需要 我们手动的跳转,当然调整的时机也需要我们选择,是在进入处理前跳转还是返回时调整都 是需要我们程序员控制的。在ARM Developer Suite Developer Guide中对ARM处理器的异常处理操作提供能更加

12、 详细的解释,每一种异常下的处理方式如下文描述:异常返回时另一个非常重要的问题是返回地址的确定,在前面曾提到进入异常时处理器会 有一个保存LR的动作,但是该保存值并不一定是正确的返回地址,下面以一个简单的指令执行 流水状态图来对此加以说明。OkSOOOAUXM004BUxSOOSCtaSdOCDFDEFDEFDEFDEARM狀态下3级指令流水线执行示刪心“我们知道在ARM架构里,PC值指向当前执行指令的地址加8处,也就是说,当执行指令 A (地址0x8000)时,PC等于指令C的地址(0x8008)。假如指令A是“BL”指令,则当执行该 指令时,会把PC(=0x8008)保存到LR寄存器里面,

13、但是接下去处理器会马上对LR进行一个 自动的调整动作:LR=LR-0x4。这样,最终保存在LR里面的是B指令的地址,所以当从BL返 回时,LR里面正好是正确的返回地址。同样的调整机制在所有LR自动保存操作中都存在,比 如进入中断响应时,处理器所做的LR保存中,也进行了一次自动调整,并且调整动作都是 LR=LR-0x4。下面,我们对不同类型的异常的返回地址依次进行说明:假设在指令A处(地址0x8000)发生了异常,进入异常响应后,LR上经过调整保存的地 址值应该是B的地址0x8004。1、如果发生的是软件中断,即A是“SWI”指令异常是由指令本身引起的,从SWI中断返回后下一条执行指令就是B,正

14、好是LR寄存器 保存的地址,所以只要直接把LR恢复给PC。MOVS pc, lr2、发生的是 Undefined instruction 异常异常是由指令本身引起的,从异常返回后下一条执行指令就是B,正好是LR寄存器保存的 地址,所以只要直接把LR恢复给PC。MOVS pc, lr 3、发生的是IRQ或FIQ中断因为指令不可能被中断打断,所以A指令执行完以后才能响应中断,此时PC已更新,指 向指令D的地址(地址Ox8OOC), LR上经过调整保存的地址值是C的地址0x8008。中断返回 后应该执行B指令,所以返回操作是:SUBS pc, lr, #44、发生的是Prefetch Abort异常该异常并不是处理器试图从一个非法地址取指令时触发,取出的指令只是被标

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号