中断(IRQ)只是ARM Cortex-M处理器中的一种异常,异常能够引起程序停止执行当前任务,去执行中断处理函数。
Cortex-M0和Cortex-M0+处理器内置了名为NVIC的中断控制器,并且支持最多32个中断请求(IRQ)输入,以及1个不可屏蔽中断(NMI)输入。根据微控制器产品设计的不同,IRQ和NMI可以由外部产生,也可以由片上外设产生。
Cortex-M0和Cortex-M0+处理器中的异常如下表所示
异常编号 | 异常类型 | 优先级 | 描述 |
---|---|---|---|
1 | 复位 | -3(最高) | 复位 |
2 | NMI | -2 | 不可屏蔽中断 |
3 | 硬件错误 | -1 | 错误处理异常 |
4~10 | 保留 | NA | – |
11 | SVC | 可编程 | 通过SVC指令进行系统调用 |
12~13 | 保留 | NA | – |
14 | PendSV | 可编程 | 系统服务,多用有OS环境,该异常请求可以被挂起 |
15 | SysTick | 可编程 | SysTick定时器 |
16 | 中断 #0 | 可编程 | 外部中断0 |
17 | 中断 #1 | 可编程 | 外部中断1 |
… | … | … | … |
47 | 中断 #31 | 可编程 | 外部中断31 |
1 复位
优先级最高的异常,当系统被复位之后首先被执行。复位向量位于第二个字空间,第一个字为栈顶指针。详细见:Cortex-M软件结构
2 NMI
不可屏蔽中断。
NMI同IRQ类似,只是它不能被禁止,并且优先级仅仅次于复位,它对于工业控制和汽车之类的高可靠性系统非常有用。根据控制器设计的不同,NMI可用于掉电处理,也可连接到看门狗单元,以便在系统停止响应时将系统复位。由于NMI不能被控制寄存器禁止,其响应的及时性得到保证。
3 HaardFault
硬件错误异常多用于处理程序执行时产生的错误,这些错误可以是试图执行未知的操作码、总线接口或存储系统的错误,也可以是试图切换至ARM状态之类的非法操作。
4 SVC
请求管理调用。
SVC指令执行时会产生SVC异常,通常用在具有哦操作系统的系统中,为应用程序提供了访问系统服务的入口。
5 PendSV
可挂起的系统调用。
PendSV是用于带OS的应用程序的另外一个异常,SVC异常字SVC指令执行后会马上开始,PendSV在这点上有所不同,他可以延迟执行,在OS上使用PendSV可以确保高优先级任务完成才执行系统调用。
PendSV通常用在任务调度中。想象一下这么一个情况,比如A任务的时间片到了之后,有IRQ正在运行,那么系统将会执行IRQ,IRQ返回后继续执行任务A,这样一来A任务就获得了额外的时间片。在A任务的时间片到了之后,马上执行PendSV指令,由于PendSV异常的优先级较低,等到执行完IRQ之后再来执行PendSV异常进行上下文切换。
6 SysTick
NVIC中的SysTick定时器为OS应用可以利用的另外一个持性。几平所有操作系的运行都需要上下文切换,而这一过程通常需要依靠定时器产生定时中断来完成。Cortex-M处理器内集成了一个简单的定时器,这样就使得设备间移植操作系统更加容易。对干Cortex-M0和Cortex-M0+处理器,SysTick定时器及其异常是可以选的,但是在多数微控制器设计中是存在的。
7 中断
一个中断是由外围信号或者通过软件请求生成异常。SWI实际上是一个IRQ。
基于Cortex-M0或Cortex-M0+的微控制器可以支持1到32个中断,中断信号可以连接到片上外设,也可以通过I/O端口连接到外部中断源上。根据微控制器设计的不同,外部中断的数量可能与Cortex-M处理器的中断数量不同。
外部中断只有在使能后才能使用,如果中断被禁止了,或者处理器正在运行另外一个相同或更高优先级的异常处理,则该中断请求会被存储在挂起状态寄存器中。当高优先级的中断处理完成或返回后,挂起的中断请求才可以执行。NVIC能够接受的中断请求信号可以是高逻辑电平,也可以是中断脉冲(最小为1个时钟周期)。需要注意的是,在微控制器的外部接口中,外部中断信号可以是高电平也可以是低电平,或者可以通过编程配置。