52Hz——FreeRTOS学习笔记——任务的挂起和恢复
主要API
vTaskSuspend
vTaskResume
总结
一个任务可以多次挂起,但只用恢复一次。
案例
#include "MyTask.h"typedef enum
{TASK_PRIORITY_0,TASK_PRIORITY_1,TASK_PRIORITY_2,TASK_PRIORITY_3,TASK_PRIORITY_4
} Task_Priority_t;void LED1_Task(void *pvParameters);
TaskHandle_t led1_task_handle;
#define LED1_TASK_NAME "LED1_Task"
#define LED1_TASK_STACK_DEPTH 128void LED2_Task(void *pvParameters);
TaskHandle_t led2_task_handle;
#define LED2_TASK_NAME "LED2_Task"
#define LED2_TASK_STACK_DEPTH 128void LED3_Task(void *pvParameters);
TaskHandle_t led3_task_handle;
#define LED3_TASK_NAME "LED3_Task"
#define LED3_TASK_STACK_DEPTH 128void KEY_Task(void *pvParameters);
TaskHandle_t KEY_task_handle;
#define KEY_TASK_NAME "KEY_Task"
#define KEY_TASK_STACK_DEPTH 128void MyTask_Start_Work(void)
{// 1. 创建任务xTaskCreate(LED1_Task, LED1_TASK_NAME, LED1_TASK_STACK_DEPTH, NULL, TASK_PRIORITY_4, &led1_task_handle);xTaskCreate(LED2_Task, LED2_TASK_NAME, LED2_TASK_STACK_DEPTH, NULL, TASK_PRIORITY_4, &led2_task_handle);// xTaskCreate(LED3_Task, LED3_TASK_NAME, LED3_TASK_STACK_DEPTH, NULL, TASK_PRIORITY_4, &led3_task_handle);xTaskCreate(KEY_Task, KEY_TASK_NAME, KEY_TASK_STACK_DEPTH, NULL, TASK_PRIORITY_4, &KEY_task_handle);// 2. 开启调度4vTaskStartScheduler();
}void LED1_Task(void *pvParameters)
{while (1){Int_LED_Toggle(LED1_GPIO_Port, LED1_Pin);vTaskDelay(1000);}
}void LED2_Task(void *pvParameters)
{while (1){Int_LED_Toggle(LED2_GPIO_Port, LED2_Pin);vTaskDelay(1000);}
}void LED3_Task(void *pvParameters)
{while (1){Int_LED_Toggle(LED3_GPIO_Port, LED3_Pin);vTaskDelay(1000);}
}void KEY_Task(void *pvParameters)
{while (1){Key_Type KEY = Int_Key_Scan();switch (KEY){case KEY1:vTaskSuspend(led1_task_handle);vTaskSuspend(led1_task_handle);break;case KEY2:vTaskResume(led1_task_handle);break;case KEY3:vTaskSuspend(led2_task_handle);break;case KEY4:vTaskResume(led2_task_handle);break;default:break;}}
}