中断:由硬件引起的事件,会引起程序流偏离正常的流程
所有Cortex-M处理器的都会提供一个用于处理中断的嵌套向量中断控制器NVIC
除了中断请求外,还有其他需要服务的事件,在这里称他们为异常
在ARM的术语里,==中断也是一种异常==
ARM中的异常包括三类
- 中断:由处理器核外硬件引起的异常
- 错误异常:由处理器核内部执行程序代码或硬件执行引起的异常
- 系统异常:由于支持了操作系统,操作系统软件在执行中需要强制跳转到某个函数处而引起的异常
注意:这里的异常并不是通常意义上的“错误”,它是中性的词,用于形容程序转向异常处理程序的情况
异常处理程序即适用于处理异常的程序代码,它们应当被写在已编译的程序映像中
ARM内核与SoC片上的所有异常都会交由NVIC进行处理。Cortex-M3和M4的NVIC支持最多240个中断请求IRQ、1个不可屏蔽中断NMI、1个SysTick定时器中断和多个系统异常。
- 中断请求IRQ由片上一般外设产生
- 不可屏蔽中断NMI由看门狗定时器或掉电检测器等外设产生
- SysTick定时器中断由SysTick开启中断信号后产生
- 其他系统异常由处理器内核或软件产生
对于ARM Cortex内核,当异常被接受后,寄存器组会被自动保存到栈中,并在返回流程中自动恢复,这和一般的C语言函数分支跳转行为一致,因此可以将异常处理程序写为普通的C函数,这种操作不会带来额外的软件开销
下面介绍ARM Cortex-M4内核的异常管理
NVIC中划分出了255个异常,所有这些异常都会被输入NVIC,经过处理后统一传输给处理器内核
异常1-15为系统异常,16及以上则为外部输入的异常信号
异常编号 | 异常类型 | 优先级 | 描述 |
---|---|---|---|
1 | 全局复位 | -3(最高) | 复位信号,拥有最高优先级(不最高也不行,毕竟复位信号是纯硬件的) |
2 | NMI | -2 | 由外部NMI输入的不可屏蔽中断 |
3 | 硬件错误 | -1 | 当错误处理未使能时发生了硬件问题(比如RCC炸了),就会强制触发该错误 |
4 | MemManage错误 | 可编程 | 存储器管理错误,当存储器管理单元MPU冲突或访问非法地址时会发生 |
5 | 总线错误 | 可编程 | 当AHB接口收到从总线的错误响应时会产生该错误(如果在取址时发生则称呼为预取中止,数据访问时发生则称为数据中止) |
6 | 使用错误 | 可编程 | 程序错误或试图访问协处理器导致的错误(M3、M4均不支持协处理器,所以引入了这个) |
7-10 | 保留位 | NA | — |
11 | SVC | 可编程 | 请求管理调用。一般用于OS环境且允许应用任务访问系统服务 |
12 | 调试监控 | 可编程 | 调试监控。使用基于软件的调试方案时可以使用该异常进行断点和监视点控制 |
13 | 保留位 | NA | — |
14 | PenSV | 可编程 | 可挂起的服务调用。一般OS使用该异常进行上下文切换 |
15 | SYSTICK | 可编程 | SysTick定时器的终端一次。可用于操作系统的系统时钟或作为普通的定时器中断使用 |
16 | 外部中断0 | 可编程 | 由片上外设产生的异常 |
17 | 外部中断1 | 可编程 | ....... |
...... | ....... | 可编程 | ....... |
255 | 外部中断239 | 可编程 | ....... |