主题 : 关于FIQ中断的问题,剪不断,理还乱 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 42827
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2011-04-11
最后登录: 2011-05-23
楼主  发表于: 2011-05-21 21:44

 关于FIQ中断的问题,剪不断,理还乱


    最近几天看了中断,对于其原理大概有一些了解.今天查阅资料时看了两本书<<ARM嵌入式系统开发---软件设计与优化>>和<<ARM系列处理器应用技术完全手册>>.让我疑惑的是当讲解FIQ中断时,在第一本书里说的是当有中断请求时,ARM执行完当前指令后响应中断,将当前的PC值加8后放入LR中,然后进入FIQ异常处理程序,返回时将LR减去4之后赋给PC,即跳转到中断发生时的下一条指令执行比如

复制代码
  1. PC1             MOV R1,R0      
  2. PC1+4         MOV R2,R3
  3. 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)再执行.
不断学习,不断进步!!