任务挂起函数:
参数:xTaskToSuspend:待挂起任务的任务句柄,为NULL表示挂起任务自身
需将宏INCLUDE_vTaskSuspend配置为 1
void vTaskSuspend( TaskHandle_t xTaskToSuspend )
任务恢复函数:
参数: INCLUDE_vTaskSuspend必须定义为1
不论任务被使用 vTaskSuspend() 挂起多少次,只需调用 vTaskResume() 一次,即可使其继续执行。被恢复的任务会重新进入就绪状态。
void vTaskResume( TaskHandle_t xTaskToResume )
任务恢复函数(中断中恢复)
返回值如下:
pdTRUE:任务恢复后需要进行任务切换
pdFALSE:任务恢复后不需要进行任务切换
BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume )
挂起与恢复调度器:
vTaskSuspendAll():挂起任务调度器,调度器不会进行任务切换,当前任务一直运行。
xTaskResumeAll():恢复任务调度器,调度器继续任务切换。
我们刚开始就是把相关的宏定义打开,只有把前两个宏定义为1(打开)才可以使用挂起和恢复函数
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_xResumeFromISR 1
/* 开启跟踪task信息 */
#define configUSE_TRACE_FACILITY 1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
只需要修改Task3里面的逻辑就行:
/* 任务3:按键1按下就删除任务1 */
/* Key1按下,挂起任务1;Key2按下,恢复任务1
Key3按下,挂起调度器;Key4按下,恢复调度器 */
char Task_info[500]; //定义一个字符数组,用于接收任务信息字符串
void Task3(void *pvParameters)
{
uint8_t key = 0;
while(1)
{
printf("任务3执行...\r\n");
key = Key_Detect();
if(key == KEY1_PRESS)
{
/* 挂起任务1 */
printf(">>>>>挂起Task1...\r\n");
vTaskSuspend(Task1_Handle);
}
else if(key == KEY2_PRESS)
{
/* 恢复任务1 */
printf("<<<<<恢复Task1...\r\n");
vTaskResume(Task1_Handle);
}
else if(key == KEY3_PRESS)
{
/* 挂起调度器 */
printf(">>>>>挂起调度器...\r\n");
vTaskSuspendAll();
}
else if(key == KEY4_PRESS)
{
/* 恢复调度器 */
printf("<<<<<恢复调度器...\r\n");
xTaskResumeAll();
}
/* 打印任务的状态 */
vTaskList(Task_info);
printf("%s\r\n", Task_info);
vTaskDelay(500);
/* 因为任务3的优先级最高,所以需要延时500ms,让他让出CPU资源给任务1和任务2 */
}
}