这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 流水线和Data abort的问题

共5条 1/1 1 跳转至

流水线和Data abort的问题

菜鸟
2004-11-09 22:57:23     打赏

问一个有关流水线和Expection的问题:为什么Data abort的handler需要将lr减8再送回pc。虽然看了一些书和pdf,但还是有些疑问,我先说说我的理解,如果有误请高手指正,谢谢。

我用的是44b0x的芯片,应该是ARM7TDMI的核。我查了一下ARM7的流水线是3级:取指、译码和执行。其中,译码分为:寄存器译码和寄存器选择两步,执行分为:寄存器读取、移位、运算和寄存器写入四步。这就是为什么在ARM(32bit)模式下,PC指向正处于执行阶段的指令(PC-8)之后两条指令的地方(PC指向的地方在取指,PC-4的地方在译码)。

软件中断和指令未定义是在指令的执行阶段引起例外的,所以该语句的位置是PC-8,送入LR的值是PC-4(下一条指令即正处于译码阶段的指令),因此返回时只需将LR直接送给PC(此时流水线上应该只有这一个有效的指令,但似乎这条指令会重新经历取指过程,不知道是不是这样)。

中断和快速中断的检测是在每执行完一条指令之后(即流水线移动一格之后)进行的,所以PC-8已经指向原本下一条要执行的语句了,因此要将LR中的原PC-4再减去4,这样中断返回之后PC的值就是原来中断前的PC-8,不过这样又要重新取指和译码了。

预取指中止(就是Prefetch abort,不知道翻成什么)是在取指阶段识别的,但是在执行阶段才引发的(PC-8,流水线仍正常执行,该干嘛还干嘛)。由于已经作了出错标记,所以应直接转入Exception,但由于该指令需要再次执行所以返回后PC的值应该是原来的PC-8,所以在调用Exception时,将LR中的原PC-4再减去4。

下面就是问题了,数据中止(Data abort)也应该是在执行时才引发的,似乎也应该是PC-8,但是有关资料上称,此时PC已经更新也就是说当前中止的指令应该是PC-12,这似乎解释了为了重新执行该指令(原PC-12)需要将LR中的原PC-4再减去8的原因。

其中有个疑问:PC究竟是什么时候更新的呢?如果按照上边的理解,应该是在引发Exception之前,是不是因为在指令执行时都是操作寄存器,而Data abort是在操作memory时引起的,晚于“指令”的执行?那对内存的操作又是什么时候呢?流水线之外吗?

在下刚碰ARM不到两个星期,还不太懂,望各路高手指点指点,谢谢。

[em04]



关键词: 流水线     abort     问题     执行     指令    

菜鸟
2004-11-10 02:22:00     打赏
2楼

没有人,顶一下

[em08]

菜鸟
2004-11-10 05:04:00     打赏
3楼

这个问题太深啦,估计很少有人看书这么认真吧[em05]

我也没有注意过,胡说两句,帮你顶一下。

假定Pabort和Dabort都是在执行阶段引发,即都是PC-8。

进Pabort Exception时,R14=address of the aborted instruction + 4,也就是PC-4。从Exception Return时,PC=R14 - 4,即重新执行PC-8处引发异常的指令。

进Dabort Exception时,R14=address of the aborted instruction + 8,也就是PC。从Exception Return时,PC=R14 - 8,也是重新执行PC-8处引发异常的指令。


菜鸟
2004-11-10 18:01:00     打赏
4楼

我又找了一篇有关ARM7和ARM9比较的文章("Performance of the ARM9TDMI™ and ARM9E-S™ cores compared to the ARM7TDMI™ core"),上边有一些关于ARM7TDMI内核所使用的流水线的介绍。三级流水线(取指、译码和执行)的功能基本上和我在楼顶帖中说的一致,而且它还补充了有关内存存取的介绍:

内存的存取的功能也是在“执行”这一级上完成的,也可以分几步(读取3步,存入2步):第一步都是计算存取地址以及从内存中取出下一条指令;读(LDx)的第二步是读取内存中的数据,写(STx)的第二步是将寄存器中数据写入内存(如果是STM,则重复第二步直至完成);读的第三步是将数据写入相应寄存器(如果是LDM,则重复第三步直至完成)。

此说明似乎也有些模糊,就是对于LDM的第二步来说,读取内存的数据时到底读了几个?如果数据不止一个(为了满足反复执行第三步的需要),那么这些数据又放到哪里去了?

不过,这个说明似乎解释了为什么在Data abort时PC已经更新了:因为在内存存取的第一步是ARM会从内存中取出一条指令(可能是放在寄存器中,等“取指”时再把这条指令取入解码器),而当根据第一步算出的内存地址读取时才发生了Data abort。这样的话PC更新是先于Data abort发生的,所以才有了PC-12。

不知道我的理解是不是正确,因为这方面的资料比较少,有的也比较深奥不是很容易理解(我在这方面还是菜鸟)。希望高手们来指点指点,谢谢。

[em06] [align=right][color=#000066][此贴子已经被作者于2004-11-10 10:04:11编辑过][/color][/align]

菜鸟
2004-11-11 02:31:00     打赏
5楼
似乎还是有些问题,如果如上所说,Prefetch Abort似乎也应该是在此被发现的,因为根本取不到这条指令,当然这个不影响楼顶帖中关于Prefetch Abort的PC-8的结论(因为这个Exception要到执行阶段才发生),但和文献上的“取指阶段发现Prefetch失败”不太一致。不知道这是怎么回事。[em01]

共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]