一:中断介绍
简介:让CPU打断正常程序的运行,转而紧急处理的事件(程序),就叫中断。比如:外部中断,定时器中断,串口中断等等。
执行过程:
1 中断请求:外设产生中断请求(GPIO外部中断、定时器中断,串口中断等等)。
2 响应中断:CPU停止执行当前程序,转而去执行中断处理程序(ISR)。
3 退出中断:执行完毕,返回被打断的程序处,继续往下执行。二:中断优先级的分组配置:
采用的的是:NVIC_PRIORITYGROUP_4的方式,即4bit用于抢占优先级,0bit用于子优先级。
具有的特点如下:1:低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断里才允许调用FreeRTOS 的API函数;
2:中断优先级数值越小越优先,任务优先级数值越大越优先
三:实际测试中断管理;
目的:配置外部中断优先级为4,从而开启和关闭中断,可以看到LED灯任务是否运行。
3.1 程序代码中修改外部按键的优先级:
HAL_NVIC_SetPriority(EXTI0_IRQn, 4, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); HAL_NVIC_SetPriority(EXTI3_IRQn, 4, 0); HAL_NVIC_EnableIRQ(EXTI3_IRQn); HAL_NVIC_SetPriority(EXTI4_IRQn, 4, 0); HAL_NVIC_EnableIRQ(EXTI4_IRQn);
3.2 在外部中断中,开启或者关闭(5-15)优先级的中断:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
// BaseType_t xYieldRequired;
switch( GPIO_Pin)
{
case GPIO_PIN_0 : // key up
break ;
case GPIO_PIN_3 : // key1
portDISABLE_INTERRUPTS();
break ;
case GPIO_PIN_4 : //key0
portENABLE_INTERRUPTS();
break ;
default :
break ;
}
}3.3 实验现象:
按下key1按键,可以看到LED灯任务不再运行。按下key0按键,LED灯任务正常运行。四、FreeRTOS中SYSTICK和PendSV中断的作用
在FreeRTOS中,SYSTICK和PendSV中断是两个关键的系统中断,它们在任务调度和协作方面发挥着重要的作用。
系统时基中断:SYSTICK中断
作用: SYSTICK中断是由系统定时器触发的中断。在FreeRTOS中,它用于实现任务调度的时基。任务调度器通过SYSTICK中断定期触发,根据任务的优先级和调度策略来决定是否切换当前运行的任务。
配置: SYSTICK中断的配置在FreeRTOS中是由configTICK_RATE_HZ参数控制的,该参数定义了系统定时器的时基。SYSTICK中断的频率通常设置为1kHz,但可以根据具体的应用需求进行调整。
示例: 当SYSTICK中断发生时,FreeRTOS的任务调度器会检查任务的状态,决定是否进行任务切换。这是实现抢占式多任务的基础。PendSV中断作用: PendSV(Pending Supervisor Call)中断是一种特殊的中断,用于在任务切换时执行一些必要的操作。通常,当任务调度器决定切换到另一个任务时,它会生成一个PendSV中断请求,将切换的工作推迟到稍后在PendSV中断服务函数中执行。
配置: PendSV中断的优先级设置为最低,以确保它能够在其他中断完成后执行。PendSV中断不会被任务调度器直接触发,而是通过软件触发。
示例: 当SYSTICK中断触发任务切换时,实际的任务切换操作会被延迟到PendSV中断服务函数中执行。这样的设计有助于减小任务切换的上下文开销,并提高系统的响应速度。
总体而言,SYSTICK中断提供了任务调度的时基,而PendSV中断用于执行实际的任务切换操作。这两者共同协作,实现了FreeRTOS的多任务调度机制。五:视频演示如下所示:

我要赚赏金
