一、任务的挂起与恢复的API函数(熟悉)
挂起:挂起任务类似暂停,可恢复; 删除任务,无法恢复,类似“人死两清”
恢复:恢复被挂起的任务
“FromISR”:带FromISR后缀是在中断函数中专用的API函数
任务挂起函数介绍
void vTaskSuspend(TaskHandle_t xTaskToSuspend)
此函数用于挂起任务,使用时需将宏 INCLUDE_vTaskSuspend 配置为 1。
无论优先级如何,被挂起的任务都将不再被执行,直到任务被恢复 。
注意:当传入的参数为NULL,则代表挂起任务自身(当前正在运行的任务)
任务恢复函数介绍(任务中恢复)
void vTaskResume(TaskHandle_t xTaskToResume)
使用该函数注意宏:INCLUDE_vTaskSuspend必须定义为 1
注意:任务无论被 vTaskSuspend() 挂起多少次,只需在任务中调用 vTakResume() 恢复一次,就可以继续运行。且被恢复的任务会进入就绪态!
任务恢复函数介绍(中断中恢复)
BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume)
函数:xTaskResumeFromISR返回值描述如下:
使用该函数注意宏:INCLUDE_vTaskSuspend 和 INCLUDE_xTaskResumeFromISR 必须定义为 1
该函数专用于中断服务函数中,用于解挂被挂起任务
注意:中断服务程序中要调用freeRTOS的API函数则中断优先级不能高于FreeRTOS所管理的最高优先级
二、任务挂起与恢复实验(掌握)
1、实验目的:学会 使用FreeRTOS中的任务挂起与恢复相关API函数:vTaskSuspend( )、
vTaskResume( )、xTaskResumeFromISR( )
2、实验设计:将设计四个任务:start_task、task1、task2、task3
四个任务的功能如下:
创建任务过程与上一节动态任务创建方法一样,只有任务三有一点变化
/**
* @brief task3
* @param pvParameters : 传入参数(未用到)
* @retval 无
*/
void task3(void *pvParameters)
{
uint8_t key = 0;
while (1)
{
key = key_scan(0);
switch (key)
{
case KEY0_PRES: /* 挂起任务1 */
{
vTaskSuspend(Task1Task_Handler);
break;
}
case KEY1_PRES: /* 恢复任务1 */
{
vTaskResume(Task1Task_Handler);
break;
}
default:
{
break;
}
}
vTaskDelay(10);
}
}
三、任务挂起和恢复API函数解析(熟悉)
任务挂起函数内部实现
1、获取所要挂起任务的控制块
通过传入的任务句柄,判断所需要挂起哪个任务,NULL代表挂起自身
2、移除所在列表
将要挂起的任务从相应的状态列表和事件列表中移除(就绪或阻塞列表)
3、插入挂起任务列表
将待挂起任务的任务状态列表项插入到挂起态任务列表末尾
4、判断任务调度器是否运行
在运行,更新下一次阻塞时间,防止被挂起任务为下一次阻塞超时任务;
调度器没有运行,判断挂起任务数是否等于任务总数,是:当前控制块赋值为NULL,否:寻找下一个最高优先级任务
5、判断待挂起任务是否为当前任务
如果挂起的是任务自身,且调度器正在运行,需要进行一次任务切换
任务恢复函数内部实现
1、恢复任务不能是正在运行任务
2、判断任务是否在挂起列表中
是:就会将该任务在挂起列表中移除, 将该任务添加到就绪列表中
3、判断恢复任务优先级
判断恢复的任务优先级是否大于当前正在运行的 是的话执行任务切换