- UID
- 824598
|
中断时PC指针问题-arm
根据《ARM微控制器基础与实践》第2页对指令流水线的说明ARM指令集中:
当前"取指PC"=当前PC
当前"译码PC"=当前PC-4
当前"执行PC"=当前PC-8
很容易理解ARM指令集中:
例程(1)
BL delay ;LR=当前PC-4(即当前指令"执行PC"+8-4)
mov r0,#0 ;
delay mov PC,LR ;子函数返回;即返回到调用时"当前PC"-4位置(即当前指令("执行PC"+8)-4);即返回到函数调用指令的下一条指令(mov r0,#0;)处
例程(2)
mov r0,#1 ;当EINT1在此处发生中断,LR=当前PC(即当前指令"执行PC"+8)
mov r0,#0 ;
EINT1_Handler
subs PC,LR,#4 ;LR=LR-4中断返回;即返回到中断时"当前PC"-4位置(即当前指令("执行PC"+8)-4);即返回到子函数调用指令的下一条指令(mov r0,#0;)处
在三级流水线下上面的描述及其容易理解,流水线增多后似乎不太合适讲,但在ARM架构下记住这点就行了,也是最重要的:当前"执行PC"=当前PC-8
ARM体系结构与编程 清华大学出版社 杜春雷 第九章异常中断处理
我的理解如下:
1.SWI和和未定义指令异常中断的返回:
指令地址
A PC-8 当前指令为SWI或未定义指令 此时发生中断.PC的值还没有更新.(不需要执行完此 指 令,就跳到中断了)
A+4 PC-4 中断时处理器将PC-4保存到LR
A+8 PC
返回时,从发生中断的指令A(PC-8)的下一条指令A+4(PC-4)处开始执行,所以直接
把LR的值赋给PC就行了,具体指令为MOV PC,LR (PC=A+4=LR)
2,IRQ和FIQ异常中断处理的返回:
指令地址 对应于PC
A PC-8 执行此指令完成后(!)查询IRQ及FIQ,如果有中断请求
则产生中断. .(需要执行完此指 令,再跳到中断)
A+4 PC-4
A+8 PC
( 此时PC的值已经更新,指向A+12.将当前PC-4(即A+8)
保存到LR.返回时,要接着执行A+4(LR-4)处的指令,所以返回指令为
SUBS PC, LR,#4(PC=A+4=LR-4)
3,指令预取中止异常中断处理的返回:
指令地址
A PC-8 执行本指令时发生中断,
A+4 PC-4 处理器将A+4(PC-4)保存到LR.
A+8 PC
返回时,发生指令预取中止的指令A(PC-8)处重新执行(A处的指令要重新执行),所以返回指令为
SUBS PC, LR,#4(PC=A=LR-4)
4,数据访问中止异常中断处理的返回:
指令地址
A PC-8 本指令访问有问题的数据,产生中断时,PC的值已经更新
A+4 PC-4 中断发生时PC=A+12,处理器将A+8(PC-4)保存到LR.
A+8 PC
返回时,要返回到A处继续执行,所以指令为SUBS PC, LR,#8.(PC=A=LR-8)
(A处的指令要重新执行), |
|