声明及感谢: 跟随正点原子资料学习, 在此作为学习的记录和总结
环境 keil , stm32f103
1. 任务挂起
vTaskSuspend(Task1Task_Handler) // 参数传入任务句柄
2. 任务恢复
任务恢复有两种情况,
第一种: 在非中断中恢复
vTaskResume(Task1Task_Handler); // 参数为任务句柄 即可恢复任务
注意: 只有通过函数vTaskSuspend()设置为挂起态的任务才可以用vTaskResume()恢复
第二种: 在中断服务函数中恢复任务
xTaskResumeFromISR(Task2Task_Handler); // 参数为任务句柄,即可恢复任务
注意: 返回值
返回 pdTRUE 表示恢复运行的任务的优先级等于或高于正在运行的任务(被中断打断的任务)
这意味着在退出中断服务函数以后必须进行一次上下文切换.
上下文切换使用 portYIELD_FROM_ISR(pdTRUE);
返回 pdFALSE 恢复运行的任务的优先级的任务优先级低于当前正在运行的任务(被中断打断的任务), 这意味
在退出中断函数以后不需要进行上下文切换.
实例:
// 外部中断4服务程序
void EXTI4_IRQHandler(void)
{
BaseType_t YieldRequired;
delay_xms(20); // 消抖 注意中断中延时函数不能使用引起任务调度的延时
if(KEY0==0)
{
YieldRequired=xTaskResumeFromISR(Task2Task_Handler);// 恢复任务2
if(YieldRequired == pdTRUE)
{
/*
函数xTaskResumeFromISR()返回值为pdTRUE,那么说明要恢复的这个任务的优先级
等于或者高于正在运行的任务(被中断打断的任务)所以在退出中断的时候一定要进行上下文切换
*/
portYIELD_FROM_ISR(YieldRequired);
}
}
EXTI_ClearITPendingBit(EXTI_Line4);// 清除LINE4上的中断标志位
}