ARM体系的各种异常分析

Tag

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://kellycan.blogbus.com/logs/10669519.html

1.复位异常

1)当内核的nRESET信号被拉低时,ARM处理器放弃正在执行的指令,当nRESET信号再次变高时,ARM处理器进行复位操作;

2)系统复位后,进入管理模式对系统进行初始化,复位后,只有PC0x00000000)和CPSRnzcvqIFt_SVC)的值是固定的,另外寄存器的值是随机的。

2.IRQ异常

1)当CPSR中的相应的中断屏蔽被清除时,内核的nIRQ信号被拉低时可产生IRQ异常;

2)由于ARM处理器的三级流水线结构,当异常发生时,PC的值等于当前执行指令的地址+8(即正确的中断返回地址+4),因此R14保存的值是 中断返回地址+4 ,所以当异常要返回时须执行以下指令:

SUBS   PCR14_irq,#4             PC=R14 - 4

注意:在SUB指令尾部有个S,并且PC是目标寄存器,所以程序返回时CPSR将自动从SPSR寄存器中恢复;

3)将用户模式下的CPSR保存到SPSR_irq中;

4)设置PCIRQ异常处理程序的中断入口向量地址,在IRQ模式下该向量地址为0x00000018

3.FIR异常

1)当CPSR中的相应F位被清零时,内核的nFIR信号被拉低时可产生FIR异常,FIQ异常是优先级最高的中断;

2FIQ异常的进入和退出与IRQ异常类似;

3)快速中断模式有8个专用的寄存器,可用来满足寄存器保护的需要,因此从其他模式进入FIQ模式时这些寄存器不用压栈了,提高程序运行的速度,且在中断入口地址的安排上,FIQ处于所有异常入口的最后,这是为了让用户可以从FIQ异常入口处(0x1c)就开始安排中断服务程序,而不需要再次跳转。

4.未定义指令异常

1)当ARM在对一条未定义指令进行译码时,发现这是一条自己和系统内任何协处理器都无法执行的指令时,就会发生未定义指令异常;

2)由于是在对未定义指令译码时发生异常,所以PC的值等于未定义指令的地址+4(即刚好为中断返回地址),因此R14保存的值是 中断返回地址 ,所以当异常要返回时可执行以下指令:

MOVS   PCR14_und            

5.中止异常

中止表示当前存储器的访问不能完成,是由外部的ABOUT输入信号引起的异常,分为两类:

1) 预取指中止:由程序存储器引起的中止异常;

2) 数据中止:由数据存储器引起的中止异常;

5.1预取指中止异常

当程序发生预取指中止时,ARM内核将预取的指令标记为无效,但在指令到达流水线的执行阶段时才进入异常,因此当前PC的值为当前执行指令的地址+8(即正确的中断返回地址+4),因此R14保存的值是 中断返回地址+4 ,所以当修复了产生中止的原因后,不管在什么操作状态,处理器都会执行以下指令:

SUBS   PCR14_abt,#4             PC=R14 - 4

5.2数据中止异常

当发生数据中止异常时,异常会在导致异常的指令执行后的下一条指令时才发生,因此当前PC的值为导致异常的指令执行后的下一条指令的地址+8(即正确的中断返回地址+8),因此R14保存的值是 中断返回地址+8,所以当修复了产生中止的原因后,不管在什么操作状态,处理器都会执行以下指令:

SUBS   PCR14_abt,#8             PC=R14 - 8

注意:LPC2000系列ARM是基于ARM7TDMI内核的,不具有MMU,所以不应该发生中止异常,初学者时常会发生中止异常,大多数是因为编写的程序的问题。

6.SWI软件中断异常

1)所有的任务都是运行在用户模式下的,因此任务只能读CPSR而不能写SPSR。任务切换到特权模式下唯一的途径就是使用一个SWI指令调用,SWI指令强迫处理器从用户模式切换到SVC管理模式,并且IRQ自动关闭,所以软件中断方式常被用于系统调用。

2)系统调用的具体过程还是看有关uc/os-II等操作系统书,那里比较详细。

3SWI处理程序通过执行下面的指令返回:

MOVS   PCR14_svc

具体为什么偏移量为0,我现在也还没有搞懂,请看到的大虾多多指点,留个言,谢谢了!!!

      经高手指点后明白了原来这么多异常的返回地址问题只要一句话:除了数据中止以外,所有异常发生时R14保存的值都是跳转时的PC-4,只是软件原因引起的异常时执行时(PC为该指令地址+8)就发生异常跳转了,而硬件引起的异常为了保证程序安全必须等到当前指令完成后(执行目标已经指向下一个指令,即PC为该指令地址+12)才会发生跳转。

评论

· swi软件中断异常时MOVS PCR14_svc,偏移量为0的原因在你紫体字里已经说明很清楚了啊,因为只是软件原因(swi属于这种情况)引起的异常,执行时(PC=此时为该指令地址+8)就发生异常跳转了,而R14保存的值都是跳转时的PC-4,即在swi软件中断的情况下
R14=PC-4=此时该指令地址+8-4=此时改指令地址+4
也就是说R14保存的就是中断返回后所要接着执行的指令的地址,所以
MOVS PCR14_svc时偏移量为0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值