概述
异常是指会改变程序流的事件,当异常产生时,处理器会暂停当前正在执行的任务,转而执行一段被称作是异常处理的程序,在处理完成后会继续之前程序。(中断是异常的一种)
Cortex-M处理器具有多个异常源:
- NVIC处理异常。NVIC可以处理IRQ和NMI(不可屏蔽中断),IRQ一般是片上外设或外部中断I/O输入,NMI可用于看门狗定时器或掉电检测。SysTick定时器也可以产生定时中断请求;
- 处理器自身也是一个异常事件源,包括表示系统错误状态的错误事件及软件产生、支持嵌入式OS的异常,异常类型如下图所示:
1~15被称为系统异常,16以上的用于中断。Cortex-M处理器支持最多240个中断输入。
上述表格的编号体现在异常入口流程中,处理器会读取这个表格以确定异常处理的起始地址。注意CMSIS驱动库和表格编号的区别。
复位是一种特殊的异常,当处理器从复位中退出时会在线程模式下执行复位处理(其他的异常是在处理模式)。
嵌套向量中断控制器NVIC
NVIC是Cortex-M处理器的一部分,是可编程的,寄存器位于存储器映射的系统控制空间。
NVIC具有以下特性:
1.每个中断都可以被使能或禁止,可以由软件设置或清除的挂起状态。NVIC可以处理多种类型中断源——脉冲(保持至少一个时钟周期)、电平触发;
2.嵌套支持,每个异常都有一个优先级,中断等一些异常具有可编程的优先级,其他的可能有固定的优先级。高优先级的异常发生,当前任务会保存在栈空间,处理器执行新异常。
3.向量化的异常入口,异常发生时,处理器需要确定相应的入口位置,Cortex-M会从向量表中自动定位处理入口。
4.中断屏蔽,Cortex-M3和M4处理器中的NVIC提供了多个中断屏蔽寄存器,如PRIMASK。可以禁止HardFault和NMI外的所有异常。
向量表
异常事件的处理要确定起始地址,处理器利用了一种向量表机制。向量表为系统存储器内的字数据数组,每个元素都代表一个异常类型的起始地址。向量表是可以重定位的,重定位由VTOR(向量表偏移寄存器)控制。复位默认为0;
每个异常向量的最低位表示异常是否在Thumb状态下执行,由于Cortex-M值支持Thumb指令,因此,所有异常向量的最低位都应该为1。
错误处理
Cortex-M处理器中有几个异常为错误处理异常。处理器检测到错误时就会触发错误异常,包括执行未定义的指令、总线错误等。
所有的错误事件都会默认触发HardFault异常,这个异常总是使能的。总线错误、使用错误及存储器管理错误默认是禁止的,但是可以单独使能。
错误处理在调试中可以自动收集信息和通知用户或其他系统错误的产生。