CPU在运行的过程中,也会被各种“异常”打断,这些“异常”有:
·指令未定义;
·指令、数据访问有问题;
·SWI(软中断);
·快中断;
·中断;
中断也属于一种“异常”,导致中断发生的情况有很多,比如:
·按键;
·定时器;
·ADC转换完成;
·UART发送完数据、收到数据;
这些众多的“中断源”,汇集到“中断控制器”,由“中断控制器”选择优先级最高的中断并通知CPU。
arm对异常(中断)处理过程:
1. 初始化:
a. 设置中断源,让它可以产生中断;
b. 设置中断控制器(可以屏蔽某个中断,优先级);
c. 设置CPU总开关(使能中断);
2. 执行其他程序:正常程序;
3. 产生中断:比如按下按键->中断控制器->CPU;
4. CPU每执行完一条指令都会检查有无中断/异常产生;
5. CPU发现有中断/异常产生,开始处理;
对于不同的异常,跳去不同的地址执行程序。地址上,只是一条跳转指令,跳去执行某个函数(地址),这个就是异常向量。
3,4,5都是硬件做的;软件做的做了如下工作:保存现场(各种寄存器),处理异常(中断): 分辨中断源,再调用不同的处理函数,恢复现场。CPU通过栈来保存恢复现场。
ARM处理模式和寄存器
ARM体系结构是一种基于模式的体系结构,它具有7种处理器模式,有六个特权模式和一个非特权用户模式。特权是执行用户(非特权)模式无法完成的某些任务的能力。在用户模式下,对影响整个系统配置的操作存在一些限制,例如MMU的配置和缓存操作。
模式与异常事件相关,可以这样简单理解:
1. 板子上电时,CPU处于SVC模式,它用的是SVC模式下的寄存器;
2. 程序运行时发生了中断,CPU进入IRQ模式,它用的IRQ模式下的寄存器;
3. CPU处理完中断,它切换回SVC模式,继续使用SVC模式下的寄存器;
4. CPU发生某种异常时,比如读取内存出错,它会进入ABT模式,使用ABT模式下的寄存器来处理错误。
在某种模式下,CPU执行时