打印
[ZLG-ARM]

异常返回时PC的值及中断返回延迟时间

[复制链接]
2555|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ahyjj|  楼主 | 2007-1-19 11:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

1...  SUB LR,LR,#4                ;计算返回地址
2...  STMFD SP!,{R0-R3,LR}       ;保存使用到的寄存器
  
  .....

3...   LDMFD SP!,{R0-R3,PC}~      ;中断返回


    

请问老鸟,
1、当执行完第3条指令后PC的值为异常发生时的下一条指令,那么此时总线上的地址是多少? 
2、第3条指令完成到开始执行异常发生时的下一条指令需要延迟多长时间?
3、在用户模式下,PC的值是 当前执行指令+8/4,那么当异常返回时,是否可以理解为,PC的值就是当前执行的指令?  

相关帖子

沙发
ahyjj|  楼主 | 2007-1-23 14:28 | 只看该作者

没人回答,自己顶一下

使用特权

评论回复
板凳
zlgARM| | 2007-1-24 16:00 | 只看该作者

RE

ARM7的流水线机制,说明了,PC总是指向“正在取指的指令”。但是实际上是有例外的,如果把这个例外搞清楚就理解了。
这个例外是,如果执行了一条写R15的指令,则写入R15的数据被当成一个指令地址,程序立即会从该处执行。实际上就是一次无条件跳转。
所以,楼主第三个问题的答案是,异常返回是直接将返回处的地址写入了PC,于是程序直接跳转了过去。这个时候,PC的值确实就是该返回处的指令地址。
楼主的第二个问题,问题本身有前提性的错误。
异常返回时,未必是执行异常发生时的下一条指令,也有可能是被异常打断而没有执行的指令。
但是无论如何返回,ARM7TDMI内核会让被异常打断的指令重新执行,让没有被异常打断的指令比如BL,SWI的下一条指令执行。

所以,从这个意义上来说,第3条指令完成的时刻,就是开始执行“异常发生时的下一条指令”的时刻,所以,延迟时间为0。

楼主的第一个问题,也有前提性的错误,请翻阅《ARM嵌入式系统基础教程》P48看一下,并不是所有异常返回都是处理“异常发生时的下一条指令”。IRQ和FIQ就不是。

使用特权

评论回复
地板
ahyjj|  楼主 | 2007-1-25 09:35 | 只看该作者

RE

能得到传说中的大师指点真是很激动,想就第3个问题继续请教.......

   如果R15被写入值以后(执行一次无条件跳转),此时PC的值确实就是该返回处的指令地址,那么ARM7 将如何重新步入流水机制?

使用特权

评论回复
5
zlgARM| | 2007-1-25 10:21 | 只看该作者

流水线被清空了

所以需要再次填满它,填满它是需要一定时间的。

为了方便叙述,把异常返回后恢复执行的指令称呼为初始指令,意思是异常返回后第一个执行的指令。

ARM7的流水线机制描述了这样几点事实。
1:一条指令的执行要依次经过三个阶段:取指、译码、生效,这三个阶段可以形象地理解为三条加工流水线。(教科书上说的是执行,但这样容易和指令的整个执行混淆。其实这两个“执行”概念是不一样的)。

2:异常返回后,三条流水线里的译码、生效流水线是空的,只有取指流水线获得了加工对象---初始指令。
那么,接下来。初始指令位于译码流水线的时候,取指流水线已经获得了初始指令下面的一条指令,生效流水线仍然为空;
再接下来,初始指令已经到了生效流水线,这个时候流水线就被填满了:因为取指流水线已经取到了初始指令的下下一条指令,而译码流水线已经取到了初始指令的下一条指令。

使用特权

评论回复
6
ahyjj|  楼主 | 2007-1-25 11:02 | 只看该作者

RE

如此从宏观的角度来说,初始指令的执行时间较长(为3个周期,下面的指令执行时为1条指令一个周期)。这是否可以理解为异常返回时所造成的延时呢? 

使用特权

评论回复
7
zlgARM| | 2007-1-25 11:26 | 只看该作者

任何一条指令的执行都必须分为三个阶段

指令在一个周期内执行完,就是说它在一个周期内将这三个阶段执行完了。
建议你仔细看一下LPC2200的数据/用户手册,里面有很多翔实的数据图表供你深究。

使用特权

评论回复
8
ahyjj|  楼主 | 2007-1-25 12:22 | 只看该作者

多谢周工指点

使用特权

评论回复
9
zlgARM| | 2007-1-25 17:08 | 只看该作者

RE

不客气!
我不是周工,只是ZLG公司的员工而已。zlg315才是周工本人。呵呵。

使用特权

评论回复
10
ahyjj|  楼主 | 2007-1-29 14:05 | 只看该作者

RE

呵呵,周家班的都可以称之为“周工”

使用特权

评论回复
11
ahyjj|  楼主 | 2007-11-11 00:54 | 只看该作者

老问题,新认识


曾经版主做过如下指点:

“楼主的第一个问题,也有前提性的错误,请翻阅《ARM嵌入式系统基础教程》P48看一下,并不是所有异常返回都是处理“异常发生时的下一条指令”。IRQ和FIQ就不是。”
但是最近翻阅《ARM体系结构与编程》杜春雷 著 第一版 P268页 却发现作者很清楚地表明“返回到发生异常中断的指令的下一条指令处执行”  至此对于这样的老问题有变的迷惑起来,请版主再指点一二!  
 

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

44

帖子

0

粉丝