mcu_interrupt
MCU架构——中断
何为中断,就是指处理器接收到来自硬件或者软件的信号,提示发生了某个事件,应该被注意并作出处理。
通常,在接收到来自外围硬件(相对于中央处理器和内存)的异步信号,或来自软件的同步信号之后,处理器将会进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器通过上下文切换切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的一个指令,以可编程的方式直接指示这种运行信息切换,并将处理导向一段中断处理代码。中断在计算机多任务处理,尤其是即时系统中尤为有用。这样的系统,包括运行于其上的操作系统,也被称为“中断驱动的”(interrupt-driven)。
能够发出中断请求信号的来源统称为中断源,CPU跳转执行中断事件处理的逻辑代码程序称为中断服务程序。
中断系统不单单是响应外部IO的中断,还响应内部的中断请求如定时器、看门狗等。
中断触发类型
电平状态触发
以等待特定的电平以触发中断。当请求中断时,驱动中断请求线路至特定电平,中断将在在CPU发出强制停止命令或更高优先级中断事件之前始终保持。电平状态触发允许多个设备共享一个中断线路,如低电平触发,在中断线路添加上拉电阻以保证中断请求撤销后及时复位。其缺点是当没有撤销中断电平,则系统一直响应中断则影响其正常运行。
边沿触发
设备通过向中断线路发送一个脉冲来表示其中断请求。脉冲可以为上升沿或下降沿或者双边沿。在发送完脉冲后设备立即释放中断线路。如果这个脉冲太短,以至于I/O轮询不足以确保知悉其存在,则有必要使用专门的硬件设备来辅助对边沿触发的探查。边沿触发中断容易丢失,特别是当中断被有意屏蔽时。在不引入锁存器的情况下,在屏蔽时段发送的中断信号不可能被恢复。在早期的计算机系统中因为中断丢失而导致处理不能继续的情况时有发生。现代中断硬件多包含有一个或一组中断状态锁存器,用以暂存一逝而过的中断请求。在对边沿触发中断硬件进行编程时,应检查这些中断状态寄存器以确保请求事件不会丢失。
混合模式
使用状态触发与边沿触发兼顾的混合中断模式。其硬件不但探测脉冲,也验证中断信号是否保持一段时间。
消息信号
中断消息的识别基于特定的比特码序列而不是物理线路上的单个信号,可以有效地通过设定不同的中断比特码来划分和处理不同类型的中断。另外,使用串行或并行总线都可以传递中断消息。
中断类型
可屏蔽中断 (maskable interrupt)
硬件中断的一类,可通过在中断屏蔽寄存器中设定位掩码来关闭
不可屏蔽中断 (NMI)
硬件中断的一类,无法通过在中断屏蔽寄存器中设定位掩码来关闭
处理器中断
一种特殊的硬件中断。由处理器发出,被其它处理器接收。仅见于多处理器系统,以便于处理器间通信或同步
软件中断
一条CPU指令,用以自陷一个中断。由于软中断指令通常要运行一个切换CPU至内核态(Kernel Mode/Ring 0)的子例程,它常被用作实现系统调用(System call)
中断处理
系统响应中断必须通过硬件自动方式或者软件方式保存进入中断前的状态,如保存内核寄存器状态保存。MCU 系统响应中断一般自动保存上下文信息并跳转到该中断对应的地址上运行代码。所有中断跳转地址空间一般是线性分布的,称之为中断向量表 ,中断向量表每个中断只有极小的地址空间,不足以存放用户的中断处理程序,一般通过跳转到对应的中断事件函数执行,返回后由硬件自动恢复上下文信息以继续按照原有正常程序执行。注意,在中断处理事件中是否影响程序正常需根据实际情况断定。
中断事件处理程序应该精简以尽快返回
中断优先级
中断系统中,CPU一般根据各中断请求的轻重缓急分别处理,即给每个中断源确定一个中断优先级别,系统自动对它们进行排队判优,保证首先处理优先级别高的中断请求,待级别高的中断请求处理完毕后,再响应级别较低的中断请求。对多个中断源进行识别和优先级排队的日的就是要确定出最高级别的中断源,并形成该中断源的中断服务程序入口地址,以便CPU将控制转移到该中断服务程序去。一般数字越小,优先级越高。
当系统在处理中断的同时,有更高优先级的中断触发,系统则保存当前中断上下位而转向处理更高优先级中断然后回来继续处理低优先级中断。这种逻辑叫中断嵌套。有些 MCU 不支持中断嵌套或者不允许中断当前中断处理,则可以通过禁用全局中断方式处理。
中断响应原则:
- 优先响应高优先级中断
- 优先级相同,则根据次序响应
- 正在进行的中断过程不能被新的同级或低优先级的中断请求所中断;
- 正在进行的低优先级中断过程,能被高优先级中断请求所中断
Cortex-M NVIC介绍
向量中断控制器 NVIC,是与Cortex-M内核紧密耦合的中断控制系统,在 Coretx-M架构中,中断是属于异常中的一种。NVIC支持多达240个中断信号输入,芯片制造商根据具体芯片设计将不同的外设中断信号(IRQ)连接到特定的中断输入, 另外还提供了不可屏蔽中断信号(NMI)输入,此信号映射也由芯片制造商决定。
NVIC中断控制器提供的中断控制功能:
- 特定中断信号的使能与禁能
- 中断向量表偏移量设置
- 中断悬起以及解悬控制
- 中断状态指示
- 中断屏蔽,用于屏蔽优先级大于某数值的中断
- 全局中断控制
- 优先级组与优先级
注意NVIC的IRQ不等同于芯片外设的IRQ,需要区别且分别设置
NVIC 中断优先级
NVIC中断主要分为IRQ以及NMI两种,其中NMI总是为负数,其优先级是不能修改的,
支持高达256个优先级,但实际中将256个优先级按位段分为抢占优先级和亚优先级,两个位段划分是十分灵活的,抢占优先级越多,则所属的亚优先级越少。
实际上芯片制造商会精简设计,如8位的优先级位段实际只采用高3位位域以划分8个优先级,视具体芯片而定以决定允许修改的优先级,如