中断的概念
中断是 CPU 响应外部事件的机制,当外设(如定时器、UART、GPIO)触发事件时,CPU 暂停当前任务,执行中断服务程序(ISR),完成后恢复原任务。类似下图的描述方式
中断机制可以让我们快速灵活的响应突发事件高效的处理各个事件的发生。
回顾以前的实验
闪灯实验
之前我们做过闪灯实验,就是利用GPIO循环输出有节奏的高低电平,代码实现如下
void main(void)
{
while(1){
HAL_GPIO_WritePin(...,...,RESET);
HAL_Delay(200);
HAL_GPIO_WritePin(...,...,SET);
HAL_Delay(200);
}
}
串口接受数据实验
void main(void)
{
while(1){
if(HAL_UART_Receive(...,1,0))==SUCCESS){
//对数据进行了处理
}else{}
}
}
我们思考一下能不能把两个程序的功能结合起来,程序如下
void main(void)
{
while(1){
HAL_GPIO_WritePin(...,..., RESET);
HAL_Delay(200);
HAL_GPIO_WritePin(...,...,SET);
HAL_Delay(200);
HAL_UART_Receive(...,1,0)
}
}
显然这样是不行的,如果引入中断这个机制,问题就迎刃而解。
中断优先级
我们思考一下,如果同时发生了两个中断我们应该如何处理,两个中断排队或者中断其中一个中断执行另一个中断?中断优先级可以解决这个问题。
中断优先级是嵌入式系统中管理多个中断源的核心机制,决定了不同中断事件的响应顺序和处理方式。决定响应顺序,当多个中断同时触发时,优先级高的中断优先被 CPU 处理。支持中断嵌套,高优先级中断可以打断正在执行的低优先级中断(抢占式处理)。资源冲突管理,通过合理分配优先级,避免关键任务被低优先级事件阻塞。
中断优先级的分类
-
抢占优先级(Preemption Priority)
-
高抢占优先级的中断可以打断低抢占优先级的正在执行的中断。
-
类比:急诊病人(高优先级)可以打断普通病人(低优先级)的治疗。
-
-
子优先级(Subpriority)
-
当多个中断的抢占优先级相同时,子优先级高的先执行。
-
子优先级不抢占:即使子优先级更高,同抢占级的中断不会互相打断。
-
中断优先级分组
中断优先级作为中断排队的有效依据
中断排队
中断排队是嵌入式系统中处理多个中断请求的核心机制,决定了当多个中断同时触发或未及时处理时,系统如何安排它们的执行顺序
-
中断排队场景
-
同时触发:多个中断在同一时刻触发(如多个外设同时发出请求)。
-
未及时响应:高优先级中断正在执行时,低优先级中断被挂起,形成队列等待处理。
-
-
排队目的
-
确保关键中断优先处理,避免数据丢失或系统崩溃。
-
管理中断请求的公平性和实时性。
-
(数字越小优先级越高)
中断嵌套
中断嵌套是指高优先级中断打断当前正在执行的较低优先级任务或中断的过程,其核心规则由**抢占优先级(Preemption Priority)和子优先级(Subpriority)共同决定。
- 抢占优先级高的中断可随时终止当前执行的中断或任务;
- 子优先级用于同一抢占级中断间的响应顺序;
- 嵌套深度取决于系统中断优先级的层级关系。
上图描述,当抢占优先级为0、1的中断发生,系统会中断抢断优先级为2的中断,当执行完1级别的中断后再执行2级别的中断。
例子
我们来举个例子