原创 ARM7中的中断返回地址和3级流水线问题 [原创 2007-05-01 16:20:35 ] 发表者

2007-6-1 09:01 1964 7 10 分类: MCU/ 嵌入式

http://cbqcgq.blog.hexun.com/9178600_d.html


应该是这样的:
“将下一条指令的地址存入相应的连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。”这里的“将下一条指令的地址存入相应的连接寄存器LR”,说的把是寄存器pc当前值存入LR,也就是当前指令地址A+8存入了LR,那么如果处理完中断后照此返回的话,显然会跳过A+4这条指令而造成错误,因此需要人为将LR减4,也就是你在问题2中的这条语句:
SUB LR,LR,#4 ;计算返回地址
注意sub是减法不是加法……

另一方面,正如狗狗所说,某些异常是特殊的,对于这些特殊的异常而言,存入LR的值不是A+8而是A+4,那么这些异常处理函数就不需要再重新计算返回地址了。


 


原先我的理解是这样的:
1,假设当前是PC,PC-4,PC-8
2,发生中断,PC被取消,代之一中断服务程序的首地址指令,但是PC-4还在流水线中(就象排队的三个人,第一个找别人代替了,但是后面的反正不受影响)
3,由硬件将当前被中断的预取指令的下一条指令放进LR(所以资料上说是PC+4)
4,中断服务程序的首指令进入译码阶段
5,原来的那个PC-4进入执行阶段(三级流水线的缘故)
6,中断程序预取最后一条返回指令
7,预取程序空间中中断程序之后的非中断程序指令,仍然使用IRQ模式下寄存器
8,预取的中断程序指令进入执行阶段
9,中断程序结束,返回,当前PC=LR-4(LR为原来被中止取指的那条指令的下面一条指令),相减后,PC又指向了被中断的那条预取指令,再次预取,原来预取的中断程序下面的非中断程序指令因为处于IRQ状态,而程序已经中断返回之前模式,所以无效
10,如果在IRQ中断中预取的非中断程序是操作PC的指令怎么办?不会出现这样的情况,程序空间是连续的,中断处理程序之后紧接着的两条非中断处理程序指令不会莫名其妙地为操作PC的指令,即使它们是另外的中断服务程序的头两条指令,也没有影响。因为中断程序的头两条指令是保护PC指令(即计算返回地址)和堆栈操作指令,当预取堆栈操作指令时,正确的那个IRQ中断返回指令已经被执行,并且被执行的保护PC指令(MOV LR,LR,#4)没有执行对PC的操作,对程序无影响。


 


现在我的理解是这样的:
1,假设当前是PC,PC-4,PC-8
2,发生IRQ异常,执行保护操作,LR中保存将要执行指令的下一条指令
3,清空流水线
4,进入中断服务程序
5,待流水线填满,执行操作才被重新挂起(解释了ARM7为什么是0.9MIPS)
6,中断返回前,对LR处理,LR=LR-4,指向之前被清空的已译码指令
7,返回
8,重新对丢弃的前一次已译码指令取指
9,待流水线满,开始执行


 


我操他LP,很多书还没我翻译的好,下面这个才是完全正确的:
1,假设当前是PC,PC-4,PC-8
2,发生IRQ异常,执行保护操作,LR中保存由于FIQ或IRQ占先而没有被执行的指令的地址(即有些资料上把这个地址写成PC或者当前地址,很费解甚至误解)的下一条地址
3,清空流水线
4,进入中断服务程序
5,待流水线填满,执行操作才被重新挂起(解释了ARM7为什么是0.9MIPS)
6,中断返回前,对LR处理,LR=LR-4,指向之前被清空的已译码但没被执行的指令的地址
7,清空流水线,返回
8,重新对丢弃的前一次已译码指令取指
9,待流水线满,开始继续执行

文章评论3条评论)

登录后参与讨论

用户1565581 2009-8-28 16:57

保存的是PC-4,当异常返回时执行 SUBS PC,R14_FIQ,#4,使得程序重新执行被异常打断而未必执行的指令即PC-8;

用户1565581 2009-8-28 16:53

我和你有相同的经历,初学时对arm7的流水线和异常返回很是头痛。我在网上搜了很久,发现很多同道之人对这个问题自以为弄懂了其实却是理解错了。我对博主最终弄清这个问题深感同乐,也为博主孜孜的探索精神所钦佩! 这是我的一点对arm7异常及流水线的理解: 1、arm7不同的异常模式下对当前指令(即PC-8)的处理是不同的,有的是立即放弃当前指令转去响应异常处理。 有的则是执行完当前指令后才去响应异常。由此产生了返回地址偏移量的不同。 2、非常提醒(很多书中都没有提到):arm7在异常发生时内核已经自动的对LR进行了一次减4操作即: SUBS LR ,PC,#4; 假设当前是PC,PC-4,PC-8 ,异常发生时其实在LR中

用户111650 2007-12-18 17:40

请教:

⒈挂起,是把进程从内存转移到外存,你在第5点--待流水线填满,执行操作才被重新挂起.这里用"挂起"代表什么意思?

⒉还有第2点--发生IRQ异常,执行保护操作,LR中保存由于FIQ或IRQ占先而没有被执行的指令的地址(即有些资料上把这个地址写成PC或者当前地址,很费解甚至误解)的下一条地址.这里的"执行保护操作"能具体讲解一下吗?

⒊未定义指令异常和SWI异常的返回不需要进行LR的调整,这是为什么?

 

相关推荐阅读
用户41648 2008-11-13 09:16
步进电机。。(转载)
虽然步进电机已被广泛地应用,但步进电机并不能象普通的直流电机,交流电机在常规下使用。它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。因此用好步进电机却非易事,它涉及到机械、电机、电子及计算...
用户41648 2008-07-22 14:17
转载 3V与5V混合系统中逻辑器接口问题
3V与5V混合系统中逻辑器接口问题  3V与5V混合系统中逻辑器接口问题1 引言近年来,随着便携式数字电子产品棗笔记本计算机、数字式移动电话、寻呼机、手持式测试仪表等的迅速发展,要求使用体积小、功耗低...
用户41648 2008-07-03 15:16
GB ma
GB码 GB 即"国标"的汉语拼音缩写,为中华人民共和国国家标准的意思. 国标编码就是中华人民共和国信息交换汉字编码标准(GB2312-80), 在此标准中制定了每一个汉字及非汉字符号的编码。规定将汉...
用户41648 2008-06-30 14:21
俄文866编码及其与ANSI编码的转换
АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщыьэюяёъ(俄文866编码,用一个字节表示,在WORD中用西里尔文(DOS))80...
用户41648 2008-05-07 16:15
液晶扫描一帧的行数N的倒数叫占空比,半选择点和选择点的电压比叫偏压。
液晶扫描一帧的行数N的倒数叫占空比,半选择点和选择点的电压比叫偏压。很抽象?具体的说液晶是n行的(com端的数目),占空比就是1/n,在电压一定的情况下,行数的增加意味着占空比下降,使液晶的显示质量下...
用户41648 2008-03-21 09:30
区位码和国标码转换
国标与机内码的转换   国标码并不等于区位码,它是由区位码稍作转换得到,其转换方法为:先将十进制区码和位码转换为十六进制的区码和位码,;这样就得了一个与国标码有一个相对位置差的代码,;再将这个代码的第...
我要评论
3
7
关闭 站长推荐上一条 /2 下一条