您的位置:首页 > 其它

ARM异常和中断

2016-08-01 14:43 218 查看
异常和中断
模式和异常的对应关系

异常处理
异常向量表

异常优先级

异常处理流程
CPU进入异常

程序员退出异常恢复

note

中断处理

异常和中断

异常就是在程序运行过程中(USER mode),出现了一些异常情况,而中断是异常的一种情况.

模式和异常的对应关系

如图:

上图需要特别注意的就是,如果在程序执行过程中需要进行系统调用(程序正常运行在USER模式,而内核运行在SVC模式,user模式无法直接运行SVC模式的指令,因此需要通过异常的方式进入到特权模式. 故这里就通过SWI实现.),即 SWI软中断–>SVC.

异常处理

异常向量表

存储在内存固定区域,表中每一个表项都对应一个异常类型,存了一个跳转指令:LDR PC, handle(将需要调用的函数地址放到PC中,即可跳转到指定的地址执行)

异常优先级

RESET

Data Abort(数据异常)

FIQ

IRQ

Prefetch Abort(指令预取异常)

SWI(软件中断)

Undefined Instruction(未定义指令)

异常处理流程

CPU(进入异常)

拷贝 进入异常前的模式的CPSR —-> SPSR_< mode>(对应的异常模式的SPSR,用以退出异常时恢复到当前现场);

在异常处理中,再重新设置异常模式的CPSR:

改变处理器状态进入ARM状态;

改变处理器模式进入相应的异常模式;

设置中断禁止,禁止相应中断;

(以上操作后,进入到SVC模式)

保存当前模式(user)的返回地址到异常模式中的LR_< mode>(LR_SWI);

返回地址: 这个返回地址指的是,异常到达时,正在执行的指令的下一条指令的地址;

这里cpu进入异常处理时,默认操作为:
lr= pc-4
(结合三级流水线)

因此,针对不同的异常在恢复pc时操作是不一样的:

SWI/Undef: 直接取回lr中的指令地址即可, 即
mov pc,lr


IRQ/FIQ/Prefetch Abort: 在取回时,还需手动-4, 即
subs pc, lr,#4


Data Abort: 重新执行当前指令,因此手动-8, 即
subs pc, lr ,#8


设置PC为相应的异常向量;

程序员(退出异常,恢复)

从SPSR_< mode> 恢复 CPSR;(切换会原来的状态)

从LR_< mode> 恢复 PC;(让PC指向LR_SWI)

note:

这些操作只能在arm态下才能执行.

中断处理

ARM有两级中断FIQ,IRQ.

FIQ之所以快的原因:

优先级非常高

FIQ禁止产生IRQ

设计时,将FIQ放在异常向量表的末尾,因此可以直接将FIQ的异常处理函数紧跟放在其后,无需跳转;

独有的私有寄存器,因此无需在中断前保护其他寄存器状态.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  arm 异常