NVIC 的全称是 Nested vectored interrupt controller,即嵌套向量中断控制器。对于 M3 和 M4 内核的 MCU,每个中断的优先级都是用寄存器中的 8 位来设置的。 8 位的话就可以
设置 2^8 = 256 级中断,实际中用不了这么多,所以芯片厂商根据自己生产的芯片做出了调整。比如 ST的 STM32F1xx 和 F4xx 只使用了这个 8 位中的高四位[7:4],低四位取零,这样 2^4=16,只能表示16级中断嵌套。NXP的SAMV71(Cotex-M7)只是用了高三位,那么可用的优先级8个,即0~7。
抢占式优先级支持嵌套,子优先级不支持嵌套。
对于SAME70(Cotex-M7)只使用高3位,可用优先级就是8个,分别是0~7。
FreeRTOS操作系统使用了4~7的优先级,对于0~3的中断,不受FreeRTOS中断管理,即FreeRTOS的中断屏蔽只对4~7优先级的中断有作用,相应也就有中断延迟,因为操作系统会有开关中断进行临界保护。而0~3优先级的中断就没有中断延迟,可正常使用但是中断里不可以调用FreeRTOS的API接口。4~7的可以调用但是需要是带fromISR的API。对于中断优先级是4的实际对处理器来说就是128(即4<<(8-3))。
中断延迟时间是衡量 RTOS 实时操作系统的一项重要指标,那什么又是中断延迟呢?从中断触发到执行中断服务程序的第一条指令这段时间就是中断延迟时间。FreeRTOS 内核源码中有多处开关全局中断的地方,这些开关全局中断会加大中断延迟时间。比如在源码的某个地方关闭了全局中断,但是此时有外部中断触发,这个中断的服务程序就需要等到再次开启全局中断后才可以得到执行。开关中断之间的时间越长,中断延迟时间就越大,这样极其影响系统的实时性。如果这是一个紧急的中断事件,得不到及时执行的话,后果是可想而知的。针对这种情况,FreeRTOS 就专门做了一种新的开关中断实现机制。关闭中断时仅关闭受FreeRTOS管理的中断,不受 FreeRTOS 管理的中断不关闭,这些不受管理的中断都是高优先级的中断,用户可以在这些中断里面加入需要实时响应的程序。 FreeRTOS 能够实现这种功能的奥秘就在于 FreeRTOS 开关中断使用的是寄存器 basepri,而像 uCOS 这种使用的是 primask,详情请看下面整理的表格:
参考文章: