很多嵌入式处理器体系结构提供异常和中断机制,允许CPU中断正常的执行路径。这个中断可能由应用软件有意地触发,或者由一个错误的、不寻常的条件或某些非计划的外部事件触发。
中断一般分为 3 类,即外部中断、软件中断和内部中断。
①外部中断:也称为硬件中断,一般由处理器I/O口的电平信号变化而引起。
②软件中断:完全由处理器内部形成中断处理程序的入口地址并转向中断处理程序的入口地址,再转向中断处理程序,不需要外部提供信息。
③内部中断:也称为异常,是处理器产生异常的情况下,处理器自动产生的同步事件,如程序运行执行过程中产生错误等。
Cortex-M4 内核包含了一个嵌套向量中断控制器(Nested Vectored Interrupt Controller,NVIC)用于处理异常和中断配置、优先级以及中断屏蔽,NVIC支持中断嵌套功能。当一个中断触发并且系统进行响应时,处理器硬件会将当前运行位置的上下文寄存器自动压入中断栈中,这部分的寄存器包括PSR、PC、LR、R12、R3-R0 寄存器。Cortex-M4 处理器NVIC与中断、异常关系如图2.7 所示。
图2.7 Cortex-M4 处理器NVIC与中断、异常关系
Cortex-M4 内核支持 256 个中断(16 个内核中断、240 个外部中断),具有 256 级的可编程中断优先级设置,STM32F407ZGT6 实际上只使用了其中部分中断,10 个内核中断、82 个外部中断。
Cortex-M4 处理器中,使用NVIC可以使每一个外部中断都被使能、禁止、挂起、清除,该部分内容将在第 5 章中介绍。
Cortex-M4 的系统异常包括系统复位、NMI(不可屏蔽中断)、硬件故障、存储器管理、总线故障、用法故障、SVCall(软件中断)、调试监视器中断、PendSV(系统服务请求)、SysTick(24 位定时器中断)等,具体描述见表2.7。
表2.7 Cortex-M4 的系统异常
Cortex-M4 的异常功能非常强大,机制非常灵活,异常可以通过占先、末尾连锁和迟来等处理来降低中断的延迟。优先级决定了处理器何时以及怎样处理异常。
Cortex-M4 支持 3 个固定的高优先级和多达 256 级的可编程优先级,包含 16 个可编程优先级、4 个bit位表示,为了对具有大量中断的系统加强优先级控制,Cortex-M4 支持优先级分组,通过NVIC控制,设置为占先优先级和次优先级。可通过对应用程序中断及复位控制寄存器(AIRCR,地址为:0xE000_ED0C)的[10∶8]位进行设置。如果有多个激活异常共用相同的组优先级,则使用次优先级区来决定同组中的异常优先级,这就是同组内的次优先级。应用程序中断及复位控制寄存器见表2.8。
表2.8 应用程序中断及复位控制寄存器(AIRCR,地址:0xE000ED0C)
NVIC的全称是Nested Vectored Interrupt Controller,即嵌套向量中断控制器。在STM32F4xx系列的微处理器中,中断的管理是由NVIC实现的,主要管理的中断功能包括中断的使能,中断优先级选择,中断源的选择。在基于Cortex-M3/M4/M7 内核的MCU中,每个中断的优先级都是用寄存器中的 8 位来设置的。即 2 8 =256 级中断。实际应用中并没有 256 级中断,所以芯片厂商根据自己生产的芯片做出了调整。比如STM32F4xx只使用了 8 位中的高四位[7∶4],低四位取零,这样 2 4 =16,表示有 16 级中断嵌套。
在STM32F4xx系列微控制器中,通过中断分组来实现中断管理,即将现有的表示优先级的 4 位化成两个部分,高位部分用于表示抢占优先级,低位部分用于表示子优先级。高位部分和低位部分的长度由优先级组号表示。优先级组号在寄存器中用了 3 个位表示,总共 8组,但是实际上在低版本Cortex-M4 中,只用了 0~5 个组。这个优先级组号决定了抢占优先级在优先级位数中所占的长度,例如 3 组,即抢占优先级占高三位,子优先级剩下 1 位。如果是组 0,那么不使用抢占优先级,只使用子优先级。表2.9 为抢占优先级和子优先级的分组情况。
表2.9 抢占优先级和子优先级的分组
续表
由表2.10 可知,STM32F4xx支持 5 种优先级分组。系统上电复位后,默认使用的是优先级分组 0,即没有抢占式优先级,只有子优先级。有关抢占式优先级和子优先级的理解,可以总结为以下 4 个方面:
①具有高抢占式优先级的中断可以在具有低抢占式优先级的中断服务程序执行过程中被响应,即中断嵌套。
②在抢占式优先级相同的情况下,有几个子优先级不同的中断同时到来时,则高子优先级的中断优先被响应。
③在抢占式优先级相同的情况下,如果有低子优先级中断正在执行,高子优先级的中断要等待已被响应的低子优先级中断执行结束后才能得到响应,即子优先级不支持中断嵌套。
④Reset,NMI,Hard Fault优先级为负数,高于普通中断优先级,且优先级不可配置。