arm中断返回地址详细分析_第1页
arm中断返回地址详细分析_第2页
arm中断返回地址详细分析_第3页
arm中断返回地址详细分析_第4页
arm中断返回地址详细分析_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

1、在arm体系中,通常有以下3种方式控制程序的执行流程:1、在正常执行过程屮,每执行一条arm指令,程序计数器pc的值加4个字节;每执行一条thumb 指令,程序计数器pc加2个字节。整个过程是顺序执行的;2、跳转b指令执行跳转操作;bl指令在执行跳转的同时,保存子程序返冋地址;bx指令, 执行跳转的同时,根据目标地址的最低位,可以将程序状态切换到thumb状态;blx指令执 行上述3个操作;3、当异常中断发生吋,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。在 进入异常屮断处理程序吋,要保存被中断的程序的执行现场,在从异常中断处理程序退出吋, 耍恢复被中断的程序的执行现场。当异常

2、中断处理程序执行完成后,程序返回到发牛中断的指 令的下一条指令处执行。异常中断种类、异常中断向量地址和异常中断优先级别见下表:arm运行的几种处理器模式如上表所示。其中,应用程序通常运行在用八模式下!为了说明异常屮断执行过程,先了解各处理器模式下的寄存器组,如下表:重点:arm处理器对异常中断的响应过程:、保存当询程序状态寄存器cpsr到对应异常中断的处理器模式下的spsr中;、设置当前程序状态寄存器cpsr的处理器模式位m(4:0)为对应的处理器模式,并禁止irq 屮断(设置i位=1);当进入的是fiq模式时,禁止fiq屮断(设置f位=1);、将对应异常中断的处理器模式下的lr设置成返回地址

3、;、将程序计数器pc值,设置成该异常中断向量地址,从而跳转到相应的界常中断处理程序处 执行。上述处理器对异常中断的响应过程可以用伪代码描述如下:r14< exception_mode> = return linkspsr<exception mode> = cpsrcpsr4:0 = exception mde numbercpsr5 = 0所有异常均在arm状态下处理(本句出自基于arm的嵌入式系统开发与实例p32)if (< except io n_mode> = = reset or fl q ) thencpsr6 = 1 禁止 fiq 屮断cpsr

4、7 =1 禁il: irq 中断pc= exception vetor address程序将自动跳转到对应异常屮断的处理程序屮。上述过程,完全由处理器自动完成,所以,当发生一种异常屮断时,寄存器r14、cpsr、spsr 和pc的值将是上述的结杲!结果如下图所示:下面是引用别人的文章:arm处理器中主要有7个异常(2个中断异常九1、复位异常;在以arm为核的单片机中,常把下列事件作为引起复位的原因。?上电复位:在上电后,复位使内部达到预定的状态,特别是程序跳到初始入口;?复位引脚上的复位脉冲:这是由外部其他控制信号引起的;?对系统电源检测发现过压或欠压;?时钟异常复位。arm处理器复位后,处理

5、器硬件将进行以下操作:?强制进入管理模式;0b10011?强制进入arm状态;t=0?跳转到绝对地址pc= 0x00000000处执行;?禁止irq中断和fiq中断。1 = 1,f=1;复位后,程序状态寄存器如下:i ftm4 m3 m2 m1 m01101 0 0 1 1上电复位后,进入管理模式,执行操作系统程序,一般用做对系统初始化,例如开中 断等;然后切换到用户模式,开始执行正常的用户程序。切换到用户模式可使用下列程序:mrs r0,cpsr ;读状态寄存器bicr0,r0,#03;把末两位清0msrcprs_c,r0 ;把修改后的值加载给状态寄存器,切换结束;用户程序2、未定义指令异常

6、;山于arm使用32位代码,包含的信息量很大,可达2的31方(4g)。 arm指令集不能川尽所令代码。当arm处理器遇到无法译码的指令时就会发生未定义指令异 常。进入中断处理程序。arm的未定义指令异常有以下两种情况:(1) 遇到-条无法执行的指令,此指令没有定义;(2) 执行一条对协处理器的操作指令,在正常情况下,协处理器应该应答,但协处理器没 有应答。未定义异常中断时,处理器硬件将进行以下操作:?把下一条指令的地址拷贝给lr;?把程序状态寄存器cpsr拷贝给spsr_und;?强制进入未定义模式;0b11011?强制进入到arm模式;t=0?跳转到绝对地址pc= 0x00000004处执行

7、;?禁止irq中断。1 = 0?状态寄存器中的f位不变。进入屮断后,程序状态寄存器如下:i ft m4 m3 m2 m1 m01x011011使用下列指令退出异常中断,返冋原程序。m0vspc,r14.3、软件中断异常;是由指令swi引起的。程序在执行这一指令后,进入异常中断。下面是arm体系结构与编程书中的一段摘录* swi和未定义指令异常中断是由当前执行的指令自身产生的。当swi和未定义指令异 常中断产生时,程序计数器pc的值还未更新,它指向当前指令后面第2条指令(对于arm指令來说 + 8字节;对于thumb指令來说+4字节的位置)。当swi和未定义指令异常屮断产生时,处理器将 值(po

8、4)保存到异常模式下的寄存器lr_mode中。这时(po4)即指向当前指令的下一条指令地址。 因此返回操作可以通过下而的指令來实现:mov pc,lr该指令将寄存器lr中的值复制到程序计数器pc小实现程序返回,同时将spsr_mode寄 存器内容复制到当前程序状态寄存器cpsr屮。m h 摘录结束处理器响应中断,硬件执行如下的操作。?把下一条指令的地址拷贝给lr:?把程序状态寄存器cpsr拷贝给spsr_svc;?强制进入管理模式;0b10011?强制进入到arm状态;t=0?跳转到绝对地址pc= 0x00000008处执行;?禁止irq屮断。1=1; f保持不变;进入中断后的程序状态寄存器如

9、下:i ftm4m3 m2 m1 m01x0 10011软件中断处理程序完成后,使川下列指令返回到原中断处:movspc,r14.4、预取指中止异常;由程序存储器引起的中止异常叫做预取指小止异常;山数据存储器 引起的中止异常叫做数据中止异常。由于arm的指令是3级流水线结构,读取指令周期是提前 进行的,因此把读取指令的过程一燉称预取指。如果在取得指令的同时程序存储器发出中止信 号,则arm处理器把这一条指令标记位无效,然后等待执行。下面是arm体系结构与编程书中的一段摘录*在指令预取时,如果冃标地址是非法的,该指令将被标记成有问题的指令。这时, 流水线上该指令之询的指令继续执行。当执行到该被标

10、记成有问题的指令时,处理器产生指令预取 中止异常中断。当发生指令预取屮止异常中断时,程序耍返回到该有问题的指令处,重新读取并执行该指令。因此 指令预取中止开常屮断程序应该返回到产生该指令预取屮止界常屮断的指令处,而不是像前面两种 情况下返回到发生中断的指令的下一条指令。指令预取中止异常中断是由当前执行的指令自身产生的,当指令预取中止异常中断产生时, 程序计数器pc的值还未更新,它指向当前指令后面第2条指令(对于arm指令來说,它指向当前指 令地址加8个字节的w位置;对于thumb指令來说,它指向当前指令地址加4个字节的位置)。当指 令预取中止异常中断产牛时,处理器将(po4)值保存到异常模式下

11、的寄存器lr_mode中。这时(po4) 即指向当前指令的下一条指令。因此返冋操作可以通过卜而的指令來实现:subs pc,lr,#4该指令将寄存器lr'p的值减4后,复制到程序计数器pc中,实现程序返回,同时将spsr_mode 寄存器内容复制到当前程序状态寄存器cpsr屮。* m m 摘录结束 有两种可能如下:?当执行这条指令前程序发生跳转,则这条无效指令不引起异常屮断;?当执行到这条指令时,处理器会发生预取指小止异常,引起小断。当进入预取指异常中断时,处理器硬件响应中断,执行以下的操作:?把中断时pc的地址拷贝给lr;?把程序状态寄存器cpsr拷贝给spsr_abt;?强制进入中

12、止异常模式;0b10111?强制进入到arm状态;t=0;?跳转到绝对地址pcoxoooooooc处执行;?禁止irq中断。1 = 1;进入中断后,程序状态寄存器如下:i ftm4m3 m2 m1 m01x010111预取指中止异常中断返回时,应该执行下列指令:subs pc,r14,#4.5、数据中止异常;arm处理器访问数据存储器时,在读取数据的同时数据存储器发出了中 止信号,引起数据中止异常。当进入预取数据异常中断时,处理器硬件响应中断,执行以下的操作:?把中断时的pc的地址拷贝给lr;?把程序状态寄存器cpsr拷贝给spsr_abt;?强制进入中止异常模式;?强制进入到arm状态;?跳

13、转到绝对地址po 0x00000010处执行;?禁止irq中断。进入中断后,程序状态寄存器如下:i ftm4m3m2m1 m01x010111数据中止异常中断服务程序返回时,使用下列指令:subs pc,r14,#8上述指令是返回到中断时所执行的指令,忖的是再一次从数据存储髀中读取数据。如果不再一 次读取数据,则执行下一条指令,此时使用下列指令返冋:subs pc,r14,#46、中断请求(irq)异常;例如:定吋器中断、串行口通讯中断、外部信号中断和a/d 处理中断等。irq中断是可屏蔽的。下面是arm体系结构与编程书中的一段摘录 p269*通常当处理器执行完当前指令后,查询irq中断引脚及

14、fiq中断引脚,并且查看 系统是否允许irq及fiq中断。如果冇中断引脚有效,并且系统允许该中断产生,处理器将产牛irq 或fiq异常屮断。这时,程序计数器pc的值已经更新,它指向当前指令后面的第3条指令(对于arm 指令来说,它指向当前指令地址+12字节位置;对于thumb指令来说,它指向当前指令地址+6字节 的位置)。处理器这时将值(24)保存到异常模式下的寄存器lr_mode中。这时(pg4)即指向当前指 令后面的第2条指令。因此返回操作可以通过下面的指令实现:subs pc, lr, # 4该指令将寄存器lr屮的值减4示,复制到程序计数器pc屮,实现程序返冋,同时将spsr_mode

15、寄存器内容复制到当前程序状态寄存器cpsr中。*摘录结束在状态寄存器中的i位就是irq的屏蔽位o当1 = 1时。则屏蔽irq中断,当1 = 0时,则允许中断。处理器复位后置i为1,关闭中 断。当发生irq中断时,处理器硬件响应中断,执行下列操作:?把中断时的pc的地址值拷贝给lr;?把程序状态寄存器cpsr拷贝给spsrjrq;?强制进入irq异常模式;?强制进入到arm状态;?跳转到绝对地址pc= 0x00000018处执行;?禁止irq屮断。进入屮断后,程序状态寄存器如下:i ftm4m3m2m1 m01x010010完成中断处理后,程序执行下列返回原中断处:subs pc.r14,#4.

16、7、快速中断(fiq)请求异常;fiq快速中断是可屏蔽的。在状态寄存器中的f位就是fiq 的屏蔽位。当吋。则屏蔽fiq中断,当f=0吋,则允许中断。处理器复 位后置f为1,关闭中断。当发生fiq中断时,处理器硬件响应中断,执行下列操作:?把中断时的pc的地址值拷贝给lr;?把程序状态寄存器cpsr拷贝给spsr_fiq;?强制进入fiq异常模式;?强制进入到arm状态;?跳转到绝对地址pc= 0x0000001 c处执行;?禁止fiq中断。进入中断后,程序状态寄存器如下:,i ftm4m3m2m1 m01x010001完成屮断处理后,程序执行下列返冋原屮断处:subs pc.r14,#4一般中

17、断问题分析arm cpu在上电启动之后会自动进入svc模式,也是arm上电后的默认工作模式,如 果发生了屮断,arm会自动切换到外部中断模式(irq为例),如果是fiq那么就切换到fiq 模式下面进行处理。在每一个模式下面都有一组可以访问的寄存器,svc和irq模式下的r0-r12是共川的,这就涉及到寄存器rx内容的保存:压栈,恢复:出栈操作。在irq处理中用到了哪些rx就要进行相应的保护与恢复,否则当处理退出irq时就会出错误。发牛中断时候,arm是要首先完成当前正在执行的指令,然后再进行为irq的必要处理。 具体的内容如下: 将当前cpsr,保存到irq模式下的的spsrjrq,进行备份。

18、 把pc4所指向的地址放到lr。lr = pc-40为中断返回是有个退出点。 强制pc= 0x0000*0018,指向irq的中断向量的地址,通常地址0xoooo0o18放 置一条跳命令,跳转到irq的中断服务函数的入口地址。b handlerirq.补充一点:arm的正在执行的指令地址x,和取指令的地址pc,地址y,之间是差x=y-8.难点:中断服务函数退出地址的计算pc-8>1正在执行的指令的地址10x120如果此时发生中断了pc-4>1真正的中断返回点地址iox 124pc>1取指令的地址10x128通过上述分析可以得牡 真正的中断返回点地址是0x124,真正应该存入l

19、r的地址是0x124. 但是实际情况是:0x128 ? ? ? ? ?分析:arm总是执行完当前的指令才会处理其他事情,问题就出在这里,当arm执行完 当前的指令的时候pc已经更新了,如下pc = pc+4; pc = 0x128+4 = 0x12c,存放到 lr=pc-4; lr = 0x12c-4=0x12&这个 0x128 不 是真止的中断函数的返冋点。真止的函数返冋点是0x124.怎么办? ? ? ?在给pc恢复数值是进行这样的处理下:lr = lr-4,pc=lr. =>subs pc,lr,#4.并且口动恢复 cpsr=spsr_irqswi软中断问题分析 软中断和一般的中断处理流程有不同的地方:cpu在执行指令时候,遇见一般的中断,先 要执行完当前的指令,更新pc,然后把lr=pc-4.spsr_irq=cpsr.cpsr=xxx.进入irq屮断 处理过程。真正的断点返回地址是:lr4。在返回时需要进行地址的调整。=>subs pc,lr,#4.并且自动恢复 cpsr=spsr_irqoswi软中断还是很特别的玩意,软中断发生的时候,cpu切换到svct作模式,pc的数值 不进行更新,即:不是等到把当前的指令执行完毕z后在执行其他的处理。而是立刻处理。cpu立即把软中断的返回地址写入lr中。lr二pc-4,这是真止的返

温馨提示

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

评论

0/150

提交评论