好吧,虽然不想承认,但是还是觉得老外说的对,大家说呢?
时间:2011-05-22
来源:互联网
下定决心学好arm,在最近几天看了中断,对于其原理大概有一些了解.今天查阅资料时看了两本书,第一本是<<ARM嵌入式系统开发---软件设计与优化>>(老外的书),第二本是<<ARM系列处理器应用技术完全手册>>(华清远见的李佳的书).让我疑惑的是当讲解FIQ中断时,在第一本书里说的是当有中断请求时,ARM执行完当前指令后响应中断,将当前的PC值加8后放入LR中,然后进入FIQ异常处理程序,返回时将LR减去4之后赋给PC,即跳转到中断发生时的下一条指令执行比如以下几条指令(以第一条的指令地址PC1为基址)
Assembly code
在执行第一条语句时产生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)再执行?
个人觉得应该是老外胜了,问了几个ARM群里的人,几个ARM的群围绕着这个问题吵得天翻地覆,可还是没弄个结果,在此帖出自己的疑问,希望和大家再进行一下探讨,来刨根问底,谢谢
Assembly code
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)再执行?
个人觉得应该是老外胜了,问了几个ARM群里的人,几个ARM的群围绕着这个问题吵得天翻地覆,可还是没弄个结果,在此帖出自己的疑问,希望和大家再进行一下探讨,来刨根问底,谢谢
作者: longfei_1989 发布时间: 2011-05-22
不懂,帮定。
没分了,楼主帅哥,给点把。
谢谢了。
没分了,楼主帅哥,给点把。
谢谢了。
作者: haidejintou 发布时间: 2011-05-22
…………
作者: silent1000 发布时间: 2011-05-22
1.发生异常时候,异常的指令肯定已经执行完成了。
2.进入异常处理流程时,R14_irq是指向异常指令后的下一个指令再+4。因为ARM的指令集合通常是4 bytes的,所以其实就是指向8bytes。虽然thumb 16-bits的指令集和32-bit的正常指令集合是兼容的,但它终归是16-bits的指令们,而当是thumb模式时,这儿的下一个指令+4,其实就是指向6byte之后的指令,为了正常执行thumb指令,就需要在正常返回前,先来一个SUBS R14, R14, #2;。
3.这儿具体那条指令先执行,当然是看你怎么返回了,返回地址就保存在 R14中,不修改R14直接返回,就是到PC+4+4的地方执行。但通常的,也是推荐的,不要越过指令的执行,把多+的4先减掉,返回的格式为, SUBS PC, R14, #4;
另外,为什么你叫人家老外呢?都是同道中人。
2.进入异常处理流程时,R14_irq是指向异常指令后的下一个指令再+4。因为ARM的指令集合通常是4 bytes的,所以其实就是指向8bytes。虽然thumb 16-bits的指令集和32-bit的正常指令集合是兼容的,但它终归是16-bits的指令们,而当是thumb模式时,这儿的下一个指令+4,其实就是指向6byte之后的指令,为了正常执行thumb指令,就需要在正常返回前,先来一个SUBS R14, R14, #2;。
3.这儿具体那条指令先执行,当然是看你怎么返回了,返回地址就保存在 R14中,不修改R14直接返回,就是到PC+4+4的地方执行。但通常的,也是推荐的,不要越过指令的执行,把多+的4先减掉,返回的格式为, SUBS PC, R14, #4;
另外,为什么你叫人家老外呢?都是同道中人。
作者: xiaopoy 发布时间: 2011-05-22
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28