异常和中断
异常就是在程序运行过程中(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 之六 Cortex-M 内核中断/异常系统、中断优先级/嵌套 详解
下一篇:windowsCE异常和中断服务程序初探
推荐阅读最新更新时间:2024-11-08 10:52
设计资源 培训 开发板 精华推荐
- #第七届立创电赛#USB功率计
- 16 位、线性、超稳定、低噪声、双极 ±10 V DC 电压源
- L7824A 稳压器的典型应用@ (Vo(min) = Vxx + VBE)
- NCP4545 生态开关的典型应用具有低 RON 的高级负载管理控制负载开关,用于外部泄放电阻器,具有开启延迟和压摆率的单电容器调整
- STM32H743XI MCU的评估板
- MB39C022G降压DC/DC转换器+低噪声LDO的典型应用
- LTC2637-HMI10 四通道、10 位数模转换器的典型应用
- 使用 ON Semiconductor 的 LV5103LP 的参考设计
- AM1DR-0509SZ 9V 1 瓦 DC-DC 转换器的典型应用
- LT1934ES6 独立式 350mA 锂离子电池充电器的典型应用电路