最近几天看了中断,对于其原理大概有一些了解.今天查阅资料时看了两本书<<ARM嵌入式系统开发---软件设计与优化>>和<<ARM系列处理器应用技术完全手册>>.让我疑惑的是当讲解FIQ中断时,在第一本书里说的是当有中断请求时,ARM执行完当前指令后响应中断,将当前的PC值加8后放入LR中,然后进入FIQ异常处理程序,返回时将LR减去4之后赋给PC,即跳转到中断发生时的下一条指令执行比如
PC1 MOV R1,R0
PC1+4 MOV R2,R3
PC1+8 .....
在执行第一条语句时产生FIQ中断请求,在执行完此条指令后跳转到异常处理程序执行,并将当前指令地址加8后(PC1+8)传给LR.执行完异常处理程序将LR减4然后传给PC(SUBS PC,R14,#4)来进行返回,返回后继续执行的是第二条指令(MOV R2,R3).
这一个倒是好理解,因为取PC的值时,PC里存储的是当前指令地址+8(因为是流水线机制且字对齐).
但是在第二本书里这种说法变了,还是以上面的两个MOV指令为例,第二本书上说的是当执行第一条指令时产生FIQ中断,ARM立即响应中断(第一条指令未执行完毕),然后将当前地址加8(PC1+8)并存到LR中,进入响应时处理器自动对LR进行调整,使LR=LR-4(即LR中存的地址是PC1+4),执行完异常处理程序将LR减4(LR中存的是PC1)然后传给PC(SUBS PC,R14,#4)来进行返回,返回后继续执行的就是第一条指令(MOV R1,R0),也就是中断产生时正在执行的那条指令.继续以上面两个MOV指令为例,对于这种操作第二本说给出的解释是:当发生FIQ异常时,因为外部中断请求中断了正在执行的指令(中断了第一条指令),当中断返回后,需要重新回到第一条指令执行,也就是说,返回地址应该是PC1,所以需要把LR减4后送回PC(SUBS PC.R14,#4).
好了,以上就是我总结的这两本书关于FIQ中断的处理及返回过程,我有几个疑问
1-产生FIQ中断请求时,正在执行的指令是否立刻停止去响应中断,还是等执行完此条程序后再进行中断的响应.
2-跳转到异常处理程序中时LR中保存的是PC+4还是PC+8
3-FIQ异常处理程序结束后,是返回产生中断时执行的那条指令(PC1)重新执行,还是返回到中断产生的下一条指令(PC1+4)再执行. |