一,NVIC 是什么
NVIC,全称是 Nested Vectored Interrupt Controller,即嵌套向量中断控制器。它是 ARM Cortex-M 系列处理器内核的一个重要组成部分,主要用于管理中断请求,协调中断的优先级,以及控制中断的嵌套执行,使得处理器能够高效、有序地响应和处理多个中断源。这个名称是如何体现的,下面一一说明。
二,"嵌套"体现在哪?
NVIC 的嵌套体现在它能够处理多个中断的嵌套执行。当中断发生时,NVIC 会根据中断的优先级来判断是否允许当前中断去打断正在运行的另一个中断处理程序。如果新发生的中断的优先级高于当前正在执行的中断处理程序的优先级,那么 NVIC 会暂停当前中断处理程序的执行,转而去执行优先级更高的中断处理程序,从而实现了中断的嵌套。这种嵌套机制使得系统能够更及时地响应高优先级的中断事件,提高了系统的实时性和灵活性。
例如,在一个嵌入式系统中,可能同时存在外部设备中断(如按键中断)、定时器中断和通信中断等多种中断源。当中断发生时,NVIC 会根据它们的优先级进行调度,确保高优先级的中断能够优先得到处理,而低优先级的中断则在适当的时候被处理,避免了中断处理的混乱和延误。
三,"向量"体现在哪?
NVIC 的向量体现在它维护着一个中断向量表,该表存储了各个中断服务程序(ISR,Interrupt Service Routine)的入口地址。当中断发生时,NVIC 根据中断的编号在中断向量表中快速找到对应的中断服务程序的入口地址,然后直接跳转到该地址去执行相应的中断处理程序。
这种向量中断的方式大大提高了中断处理的效率和灵活性。与传统的查询式中断处理方式相比,向量中断不需要通过循环查询的方式来确定中断源,而是能够直接根据中断向量表快速定位到对应的中断处理程序,减少了中断响应的时间,使得系统能够更迅速地对中断事件做出响应。
例如,在一个具有多个外设的嵌入式系统中,每个外设的中断请求都有一个对应的中断向量。当中断发生时,NVIC 会根据中断向量表快速找到对应的中断处理程序,从而能够及时地处理各个外设的中断事件,提高了系统的整体性能和响应速度。
四,NVIC 的工作-中断控制器
NVIC 的工作方式主要包括以下几个方面:
中断请求接收
NVIC 接收来自各个中断源的中断请求信号。这些中断源可以是外部设备(如 GPIO、定时器、串口等)产生的中断,也可以是处理器内部的一些异常事件触发的中断。
中断优先级评估
当中断请求发生时,NVIC 会根据预先设置的中断优先级来评估各个中断的优先级高低。中断优先级的设置是通过 NVIC 中的优先级寄存器来实现的,不同的中断源可以被赋予不同的优先级,以满足系统对不同中断响应的实时性和重要性要求。
中断调度与处理
NVIC 根据中断优先级的评估结果,对中断请求进行调度。如果当前没有更高优先级的中断正在处理,NVIC 会允许当前最高优先级的中断去打断正在运行的主程序或者低优先级的中断处理程序,从而进入对应的中断服务程序进行处理。在中断处理过程中,NVIC 还会管理中断的嵌套,当中断处理程序执行完毕后,NVIC 会根据需要恢复被中断的程序的执行状态,继续执行原来被中断的程序。
中断使能与禁止
NVIC 提供了对各个中断源的使能和禁止控制功能。通过设置 NVIC 中的相应寄存器,可以开启或者关闭特定中断源的中断请求,从而在系统运行过程中灵活地控制中断的响应和处理,避免不必要的中断干扰或者在特定情况下有选择性地响应某些中断。
五、优先级分组以及抢占优先级和响应优先级
优先级分组
NVIC 中有 16 个优先级分组,这些优先级分组用于对中断的优先级进行划分和管理。优先级分组的设置决定了中断优先级中的抢占优先级和响应优先级的位数分配,从而影响中断的调度和嵌套行为。
优先级分组的数值范围通常是从 0 到 15,不同的分组值对应着不同的抢占优先级位数和响应优先级位数的分配方式。例如,在某些实现中,当优先级分组设置为 0 时,表示只有抢占优先级,没有响应优先级;而当优先级分组设置为 15 时,则表示只有响应优先级,没有抢占优先级。通过合理设置优先级分组,可以根据系统的实际需求来灵活地调整中断的优先级分配策略,以满足不同中断源的响应特性和嵌套要求。怎么分组下面细说。
抢占优先级
抢占优先级决定了一个中断是否能够打断另一个正在执行的中断处理程序。具有较高抢占优先级的中断可以中断较低抢占优先级的中断处理程序的执行,从而实现中断的嵌套。抢占优先级的数值越小,其优先级越高。例如,如果中断 A 的抢占优先级为 1,中断 B 的抢占优先级为 2,那么当中断 A 和中断 B 同时发生时,中断 A 会优先被处理,并且当中断 A 在处理过程中发生中断 B 的中断请求时,由于中断 B 的抢占优先级低于中断 A,所以 NVIC 不会暂停中断 A 的处理去响应中断 B,直到中断 A 处理完毕或者被更高优先级的中断打断。
响应优先级
在抢占优先级相同的情况下,响应优先级决定了中断被处理的顺序。当中断请求的抢占优先级相同时,NVIC 会根据它们的响应优先级来确定哪个中断先被处理。响应优先级的数值越小,其优先级越高。例如,当中断 C 和中断 D 的抢占优先级相同,但中断 C 的响应优先级为 1,中断 D 的响应优先级为 2,那么当中断 C 和中断 D 同时发生时,NVIC 会先处理中断 C,然后再处理中断 D。
六,怎么分组?优先级寄存器的四位切分

在 STM32 微控制器中,NVIC 使用一个 4 位的中断优先级寄存器来管理中断优先级。这 4 位可以进行切分,分为高 n 位的抢占优先级和低 4-n 位的响应优先级。具体的切分方式由优先级分组设置决定,常见的分组方式如下:
-
分组 0:0 位抢占优先级,4 位响应优先级。这意味着所有中断的优先级完全由响应优先级决定,没有抢占优先级的概念,无法实现中断嵌套。
-
分组 1:1 位抢占优先级,3 位响应优先级。此时,抢占优先级可以取 0 或 1,响应优先级可以取 0 到 7。例如,抢占优先级为 0 的中断可以打断抢占优先级为 1 的中断。
-
分组 2:2 位抢占优先级,2 位响应优先级。抢占优先级可以取 0、1、2、3,响应优先级可以取 0、1、2、3。例如,抢占优先级为 0 的中断可以打断抢占优先级为 1、2、3 的中断。
-
分组 3:3 位抢占优先级,1 位响应优先级。抢占优先级可以取 0 到 7,响应优先级可以取 0 或 1。例如,抢占优先级为 0 的中断可以打断抢占优先级为 1 到 7 的中断。
-
分组 4:4 位抢占优先级,0 位响应优先级。这意味着所有中断的优先级完全由抢占优先级决定,响应优先级不起作用。
七,不同分组下的优先级判断方式
-
分组 0:由于没有抢占优先级,中断的优先级完全由响应优先级决定。响应优先级数值越小,优先级越高。当中断同时发生时,响应优先级高的中断先被处理。
-
分组 1:抢占优先级高的中断可以打断抢占优先级低的中断。如果两个中断的抢占优先级相同,则根据响应优先级来决定处理顺序。例如,中断 A 的抢占优先级为 0,响应优先级为 1;中断 B 的抢占优先级为 0,响应优先级为 2。当中断 A 和中断 B 同时发生时,中断 A 会先被处理。
-
分组 2:抢占优先级高的中断可以打断抢占优先级低的中断。如果抢占优先级相同,则根据响应优先级来决定处理顺序。例如,中断 C 的抢占优先级为 1,响应优先级为 0;中断 D 的抢占优先级为 1,响应优先级为 1。当中断 C 和中断 D 同时发生时,中断 C 会先被处理。
-
分组 3:抢占优先级高的中断可以打断抢占优先级低的中断。如果抢占优先级相同,则根据响应优先级来决定处理顺序。例如,中断 E 的抢占优先级为 2,响应优先级为 0;中断 F 的抢占优先级为 2,响应优先级为 1。当中断 E 和中断 F 同时发生时,中断 E 会先被处理。
-
分组 4:由于没有响应优先级,中断的优先级完全由抢占优先级决定。抢占优先级数值越小,优先级越高。当中断同时发生时,抢占优先级高的中断先被处理。
总的来说,通过合理地设置优先级分组、抢占优先级和响应优先级,可以使嵌入式系统中的中断管理更加灵活、高效,满足不同应用场景下对中断响应速度和处理顺序的要求,从而提高系统的整体性能和稳定性。