目录
一. 任务的挂起
1.1 任务挂起函数介绍
void vTaskSuspend(TaskHandle_t xTaskToSuspend)
参数介绍
xTaskToSuspend:待挂起任务的任务句柄(想挂起哪个任务,就传入哪个任务的任务句柄)
1.2 任务挂起流程
使用时需将宏 INCLUDE_vTaskSuspend 配置为 1 即可。
注意:
① 当传入的参数为NULL,则代表挂起任务自身(当前正在运行的任务)。
② 无论优先级如何,被挂起的任务都将不再被执行,直到任务被恢复 。
1.3 任务挂起函数内部实现流程(概括)
二. 任务的恢复
2.1“任务中的恢复”
2.1.1任务恢复函数介绍
void vTaskResume(TaskHandle_t xTaskToResume)
参数介绍
xTaskToResume:待恢复任务的任务句柄。
2.1.2 任务恢复流程
使用时需将宏 INCLUDE_vTaskSuspend 配置为 1 即可,和挂起任务需要配置的宏是同一个。
注意:
任务无论被vTaskSuspend()挂起多少次,只需在任务中调用vTaskResume()恢复一次,就可以继续运行,且被恢复的任务会进入就绪态。
2.1.3任务恢复函数内部实现流程(概括)
2.2 “中断中的恢复”
2.2.1任务恢复函数介绍
BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume)
参数介绍
xTaskToResume:待恢复任务的任务句柄。
函数返回值 描述 pdTrue 任务恢复后需要进行任务切换(恢复的任务优先级,大于当前正在执行的任务优先级) pdFALSE 任务恢复后不需要进行任务切换
2.2.2 任务恢复流程
使用时,将宏INCLUDE_vTaskSuspend 和 INCLUDE_xTaskResumeFromISR,配置为1。
注意:
① 该函数专用于中断服务函数中,用于解挂(恢复)被挂起的任务。
② 中断服务函数中要调用FreeRTOS中的API函数,则中断优先级不能高于FreeRTOS所管理的最高优先级。(FreeRTOS所管理的中断优先级是5~15,中断优先级必须在此范围内,如果中断优先级在0~4(FreeRTOS任务优先级是越大越高,而中断优先级是越小越高。),0~4数值比5~15小,优先级高,不属于FreeRTOS所管理的范围)。
③ 函数带有“FromISR”后缀的,为中断服务函数中专用API函数
2.2.3 任务恢复函数内部实现流程(概括)
2.2.4 示例代码
void EXTI4_IRQHandler(void)
{
delay_xms(10);//消抖
BaseType_t YieldRequired;
if(KEY0==1) //按键KEY0
{
YieldRequired = xTaskResumeFromISR(task1_handler); //在中断中恢复被挂起的任务
printf("中断恢复任务1的运行!\r\n");
if(YieldRequired == pdTRUE)
{
portYIELD_FROM_ISR(YieldRequired); //任务切换
}
}
EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE4上的中断标志位
}