52Hz——FreeRTOS学习笔记——调度器的挂起与恢复
主要api
vTaskSuspendAll
xTaskResumeAll
总结
挂起调度器,上下文切换就不在执行,这样一来也能保证当前任务的原子性,也就是不被其他任务打断
案例
#include "MyTask.h"typedef enum
{TASK_PRIORITY_0,TASK_PRIORITY_1,TASK_PRIORITY_2,TASK_PRIORITY_3,TASK_PRIORITY_4
} Task_Priority_t;void Increament_Task(void *pvParameters);
TaskHandle_t Increament_task_handle;
#define Increament_TASK_NAME "Increament_Task"
#define Increament_TASK_STACK_DEPTH 128void Decreament_Task(void *pvParameters);
TaskHandle_t Decreament_task_handle;
#define Decreament_TASK_NAME "Decreament_Task"
#define Decreament_TASK_STACK_DEPTH 128void Print_Task(void *pvParameters);
TaskHandle_t Print_task_handle;
#define Print_TASK_NAME "Print_Task"
#define Print_TASK_STACK_DEPTH 128int16_t count = 0;void MyTask_Start_Work(void)
{// 1. 创建任务xTaskCreate(Increament_Task, Increament_TASK_NAME, Increament_TASK_STACK_DEPTH, NULL, TASK_PRIORITY_4, &Increament_task_handle);xTaskCreate(Decreament_Task, Decreament_TASK_NAME, Decreament_TASK_STACK_DEPTH, NULL, TASK_PRIORITY_4, &Decreament_task_handle);xTaskCreate(Print_Task, Print_TASK_NAME, Print_TASK_STACK_DEPTH, NULL, TASK_PRIORITY_4, &Print_task_handle);// 2. 开启调度vTaskStartScheduler();
}void Increament_Task(void *pvParameters)
{taskENTER_CRITICAL();for (uint16_t i = 0; i < 10000; i++){count++; // count = count + 1}taskEXIT_CRITICAL();vTaskDelete(NULL);
}void Decreament_Task(void *pvParameters)
{for (uint16_t i = 0; i < 10000; i++){vTaskSuspendAll();count--; // count = count - 1xTaskResumeAll();}vTaskDelete(NULL);
}void Print_Task(void *pvParameters)
{while (1){printf("count = %d \n", count);vTaskDelay(100);}
}