ARM异常和中断

异常和中断

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

模式和异常的对应关系

如图:

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

异常处理

异常向量表

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

异常优先级

  1. RESET
  2. Data Abort(数据异常)
  3. FIQ
  4. IRQ
  5. Prefetch Abort(指令预取异常)
  6. SWI(软件中断)
  7. Undefined Instruction(未定义指令)

异常处理流程

CPU(进入异常)

  1. 拷贝 进入异常前的模式的CPSR —-> SPSR_< mode>(对应的异常模式的SPSR,用以退出异常时恢复到当前现场);
  2. 在异常处理中,再重新设置异常模式的CPSR:
    • 改变处理器状态进入ARM状态;
    • 改变处理器模式进入相应的异常模式;
    • 设置中断禁止,禁止相应中断;
      (以上操作后,进入到SVC模式)
  3. 保存当前模式(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
  4. 设置PC为相应的异常向量;

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

  1. 从SPSR_< mode> 恢复 CPSR;(切换会原来的状态)
  2. 从LR_< mode> 恢复 PC;(让PC指向LR_SWI)

note:

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

中断处理

ARM有两级中断FIQ,IRQ.
FIQ之所以快的原因:

  • 优先级非常高
  • FIQ禁止产生IRQ
  • 设计时,将FIQ放在异常向量表的末尾,因此可以直接将FIQ的异常处理函数紧跟放在其后,无需跳转;
  • 独有的私有寄存器,因此无需在中断前保护其他寄存器状态.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MichaelJay2015

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值