[ZLG-ARM] 异常返回时PC的值及中断返回延迟时间

[复制链接]
3711|10
 楼主| ahyjj 发表于 2007-1-19 11:54 | 显示全部楼层 |阅读模式
<br />1...&nbsp;&nbsp;SUB&nbsp;LR,LR,#4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;计算返回地址<br />2...&nbsp;&nbsp;STMFD&nbsp;SP!,{R0-R3,LR}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;保存使用到的寄存器<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;.....<br /><br />3...&nbsp;&nbsp;&nbsp;LDMFD&nbsp;SP!,{R0-R3,PC}~&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;中断返回<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />请问老鸟,<br />1、当执行完第3条指令后PC的值为异常发生时的下一条指令,那么此时总线上的地址是多少?&nbsp;<br />2、第3条指令完成到开始执行异常发生时的下一条指令需要延迟多长时间?<br />3、在用户模式下,PC的值是&nbsp;当前执行指令+8/4,那么当<font color=#000000>异常返回</font>时,是否可以理解为,PC的值就是当前执行的指令?&nbsp;&nbsp;
 楼主| ahyjj 发表于 2007-1-23 14:28 | 显示全部楼层

没人回答,自己顶一下

  
zlgARM 发表于 2007-1-24 16:00 | 显示全部楼层

RE

ARM7的流水线机制,说明了,PC总是指向“正在取指的指令”。但是实际上是有例外的,如果把这个例外搞清楚就理解了。<br />这个例外是,如果执行了一条写R15的指令,则写入R15的数据被当成一个指令地址,程序立即会从该处执行。实际上就是一次无条件跳转。<br />所以,楼主第三个问题的答案是,异常返回是直接将返回处的地址写入了PC,于是程序直接跳转了过去。这个时候,PC的值确实就是该返回处的指令地址。<br />楼主的第二个问题,问题本身有前提性的错误。<br />异常返回时,未必是执行异常发生时的下一条指令,也有可能是被异常打断而没有执行的指令。<br />但是无论如何返回,ARM7TDMI内核会让被异常打断的指令重新执行,让没有被异常打断的指令比如BL,SWI的下一条指令执行。<br /><br />所以,从这个意义上来说,第3条指令完成的时刻,就是开始执行“异常发生时的下一条指令”的时刻,所以,延迟时间为0。<br /><br />楼主的第一个问题,也有前提性的错误,请翻阅《ARM嵌入式系统基础教程》P48看一下,并不是所有异常返回都是处理“异常发生时的下一条指令”。IRQ和FIQ就不是。
 楼主| ahyjj 发表于 2007-1-25 09:35 | 显示全部楼层

RE

能得到传说中的大师指点真是很激动,想就第3个问题继续请教.......<br /><br />&nbsp;&nbsp;&nbsp;如果R15被写入值以后(执行一次无条件跳转),此时PC的值确实就是该返回处的指令地址,那么ARM7&nbsp;将如何重新步入流水机制?
zlgARM 发表于 2007-1-25 10:21 | 显示全部楼层

流水线被清空了

所以需要再次填满它,填满它是需要一定时间的。<br /><br />为了方便叙述,把异常返回后恢复执行的指令称呼为初始指令,意思是异常返回后第一个执行的指令。<br /><br />ARM7的流水线机制描述了这样几点事实。<br />1:一条指令的执行要依次经过三个阶段:取指、译码、生效,这三个阶段可以形象地理解为三条加工流水线。(教科书上说的是执行,但这样容易和指令的整个执行混淆。其实这两个“执行”概念是不一样的)。<br /><br />2:异常返回后,三条流水线里的译码、生效流水线是空的,只有取指流水线获得了加工对象---初始指令。<br />那么,接下来。初始指令位于译码流水线的时候,取指流水线已经获得了初始指令下面的一条指令,生效流水线仍然为空;<br />再接下来,初始指令已经到了生效流水线,这个时候流水线就被填满了:因为取指流水线已经取到了初始指令的下下一条指令,而译码流水线已经取到了初始指令的下一条指令。<br /><br />
 楼主| ahyjj 发表于 2007-1-25 11:02 | 显示全部楼层

RE

如此从宏观的角度来说,初始指令的执行时间较长(为3个周期,下面的指令执行时为1条指令一个周期)。这是否可以理解为异常返回时所造成的延时呢?&nbsp;
zlgARM 发表于 2007-1-25 11:26 | 显示全部楼层

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

指令在一个周期内执行完,就是说它在一个周期内将这三个阶段执行完了。<br />建议你仔细看一下LPC2200的数据/用户手册,里面有很多翔实的数据图表供你深究。
 楼主| ahyjj 发表于 2007-1-25 12:22 | 显示全部楼层

多谢周工指点

  
zlgARM 发表于 2007-1-25 17:08 | 显示全部楼层

RE

不客气!<br />我不是周工,只是ZLG公司的员工而已。zlg315才是周工本人。呵呵。
 楼主| ahyjj 发表于 2007-1-29 14:05 | 显示全部楼层

RE

呵呵,周家班的都可以称之为“周工”
 楼主| ahyjj 发表于 2007-11-11 00:54 | 显示全部楼层

老问题,新认识

<br />曾经版主做过如下指点:<br /><br /><font color=#FFFFFF><font color=#FF0040>“楼主的第一个问题,也有前提性的错误,请翻阅《ARM嵌入式系统基础教程》P48看一下,并不是所有异常返回</font><font color=#FF0040>都是处理“异常发生时的下一条指令”。IRQ和FIQ就不是。”</font>都</font><br /><font color=#000000>但是最近翻阅《ARM体系结构与编程》杜春雷&nbsp;著&nbsp;第一版&nbsp;P268页&nbsp;却发现作者很清楚地表明“返回到发生异常中断的指令的下一条指令处执行”&nbsp;&nbsp;至此对于这样的老问题有变的迷惑起来,请版主再指点一二!&nbsp;&nbsp;</font><br />&nbsp;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

44

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部