历史上的今天
今天是:2025年04月02日(星期三)
2020年04月02日 | ARM中断异常处理的返回的问题
2020-04-02 来源:eefocus
因为ARM指令是三级流水线就是说取指,译指,执行时同时执行的 ,这样说吧,现在PC指向的是正在取指的地址,那么cpu正在译指的指令地址是PC-4(假设在ARM状态下,一个指令占4个字节),cpu正在执行的指令地址是PC-8.也就是说PC所指向的地址和现在所执行的指令地址相差8,尽管以后版本的指令流水线扩展为5级和8级,但是这一特性一直被兼容处理,也即pc(excute)=pc(fetch) - 8,其中:pc(excute)是当前正在执行的指令,就是之前取该指令时候的PC的值;pc(execute):当前指令执行的,计算中如果用到pc,是指此时pc的值。当突然发生中断的时候,保存的是PC的地址。
(1)对于子程序的调用
如下面是一段S3C2440 ARM汇编代码:

AREA Reset,CODE,READONLY
ENTRY
Start
MOV r0,#08
MOV r1,#08
BL zFun
MOV r0,#04
MOV r1,#08
zFun
MOV r0,#02
END
当0x30000008处的BL指令执行时,会把PC(=0x30000010)保存到LR寄存器里面,也就是LR=0x30000010。接下来处理器会立即对LR进行一个自动的更新动作:LR=LR-0x4,这样,LR里面的地址为0x30000010 – 0x4 = 0x3000000C,它是指令”MOV r0,#04”的地址,所以当从子程序zFun返回时,LR里面正好是正确的返回地址。既是下一条要执行的指令的地址。
(2)中断异常处理函数调用
异常就是正在执行的指令,由于各种软件或硬件故障被打断,比如,在读数据或指令时,访问存储器失败、产生了一个外部硬件中断等。当这些情况发生时,在ARM系统里,由异常和中断处理程序做出相应的处理,当处理完成后,要返回到被中止的指令,使被中止的指令能够继续正常执行下去。因此,确定异常和中断处理程序的返回地址是一个非常重要的问题。
1、中断处理
当外部中断IRQ和FIQ(Fast Interrpt Request,快速中断请求)发生时,ARM核完成一部分工作。当然,这些工作是任何异常发生时都必须要做的,所以ARM处理器就会自动带我们完成。 其它重要的工作,必须由程序员来完成。ARM处理器处理的事包括从用户模式切换到IRQ模式、状态寄存器值的变化及跳转。比如说,处理器自动跳转到从0x0地址开始的异常中断向量表的0x18处,在向量表的0x18处,最简单的指令为”B HandlerIRQ”。
那程序员所要关心的就是实现具体的异常处理程序(HandlerIRQ)。当用ARM汇编语言实现HandlerIRQ函数的时候,如何确定HandlerIRQ函数正确地返回地址,使被中止的指令能够继续正常执行下去。
比较常用的中断处理程序结构如下:
HandlerIRQ ;中断响应,从向量表直接跳来
SUB r14,r14,#4 ;计算返回地址
STMFD r13,{r0-r3,r14} ;保护现场,一般只需要保护{r0-r3,lr}
BL irqHandler ;跳到具体的异常处理函数
LDMFD r13,{r0-r3,pc}^ ;恢复现场
通过”SUB R14,R14,#4”计算中断函数的返回地址。为什么计算返回地址的时候要减去4呢?

我们看上个表,比如在执行地址为0x30000004的move指令时,突然来了一个IRQ中断,这个中断打断了move指令的执行,这个时候就要去跳转到异常处理函数,之后还要返回0x30000004地址重新执行move指令。当中断发生时,LR里面保存了用户模式下PC的值,那么当执行地址为0x30000004的move指令时,PC的值应该是0x3000000C,前面介绍过,当发生跳转时,处理器会对LR进行一个自动的更新动作:LR=LR-0x4,这样LR里面的地址是0x3000000C-0x04=0x30000008。但是0x30000008并不是我们要的地址,因为中断发生在地址为0x30000004的move指令执行的时候,所以中断处理完后应该返回这个地址。 这就是在计算返回地址的时候LR减去4的原因。对于FIQ中断和预取指中止异常,计算返回地址方法和IRQ相同。
上一篇:ARM各种异常返回地址的计算
下一篇:ARM 软中断指令SWI
史海拾趣
|
急问:MP3电路原理图!请教高手,帮我分析下这个MP3原理图中各个组成部分的原理、处理器的功能。 http://blog.ednchina.com/Upload/Blog/2007/3/30/826adf84-7829-4de7-8065-2149d80d0c85.jpg 请高手帮我分析下这个MP3原理图中各个组成部分的原理、处理器的功能。 谢谢!… 查看全部问答> |
|
弱弱的问一个问题,Windows中的WinInet API在Window Mobile中能用吗? 例如HttpSendRequest、InternetReadFile之类的函数。 如果不可以,是否手机就不能通过http协议请求某个服务器的数据?… 查看全部问答> |
|
陶瓷材料因本身具有优良的绝缘、耐热及稳定等先天特性,所以被大量运用在电气设备的绝缘上,又因陶瓷金属化技术的成熟,近几年更被应用于led陶瓷散热基板与载板的线路铺设。陶瓷材料金属化技术主要分为「DBC(Direct Bonded Copper) 」及「DPC(Di ...… 查看全部问答> |
|
我的2812芯片flash写入了一次之后,就没办法写了怎么回事的?CCS连接之后点on-chip flash programmer,对话框全是灰色的,只有一个onlock按钮可以点,但是点了之后弹出unlock failed,CCS提示解锁失败,设备锁定。 但是上次烧写的时候我并没有改动 ...… 查看全部问答> |
|
记录学习LM3S的点点滴滴 (声明:该学习心得是本人通过学习周立功的相关资料后的个人理解后的笔记,由于本人水平有限,也许会有错误或是偏差,若想要保证准确无误,建议自己去下相关资料学习,本心得只供参考,若有错误之处,敬请指出,万分感谢 ...… 查看全部问答> |
|
本人刚开始学uCOS系统,现在有一块S3C44B0X的板子,想把uCOS移植进去,于是在网上找了一些基于S3C44B0X的uCOS源码,但是不知道如何运用编译器把源码处理,自然也就不知道怎么把内核系统烧进板子,现在不知道如何下手,而且在网上找的资料都没有运用 ...… 查看全部问答> |
|
我用Verilog HDL编写了一个rs232串口驱动程序。在用串口调试助手进行调试时,当我发送2,4,6,8,A,C,E时,接受没有出现一个乱码,但当我发送1,3,5,7,9,B,D,F时出现乱码,在每300中出现4——5个乱码,有时只出现一个。请问这是什么原因,还是 ...… 查看全部问答> |




