1.优先级翻转概念
优先级翻转:高优先级的任务反而慢执行,低优先级的任务反而优先执行
注意:在实时操作系统中不允许出现,在二值信号量中经常出现
2.优先级翻转实战
2.1freertos_demo.c
#include "freertos_demo.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"//FreeRTOS配置
//1.任务配置
//1.1 START_TASK 任务 配置
#define START_TASK_PRIO 1 /* 任务优先级 */
#define START_STK_SIZE 128 /* 任务堆栈大小 */
TaskHandle_t StartTask_Handler; /* 任务句柄 */
void start_task(void *pvParameters); /* 任务函数 *///1.2 TASK1 任务 配置
#define TASK1_PRIO 2 /* 任务优先级 */
#define TASK1_STK_SIZE 128 /* 任务堆栈大小 */
TaskHandle_t lowTask_Handler; /* 任务句柄 */
void task1(void *pvParameters); /* 任务函数 *///1.3 TASK2 任务 配置
#define TASK2_PRIO 3 /* 任务优先级 */
#define TASK2_STK_SIZE 128 /* 任务堆栈大小 */
TaskHandle_t middleTask_Handler; /* 任务句柄 */
void task2(void *pvParameters); /* 任务函数 *///1.4 TASK3 任务 配置#define TASK3_PRIO 4 /* 任务优先级 */
#define TASK3_STK_SIZE 128 /* 任务堆栈大小 */
TaskHandle_t highTask_Handler; /* 任务句柄 */
void task3(void *pvParameters); /* 任务函数 *///1.5 二值信号量句柄定义
SemaphoreHandle_t binarySemaphore; //2.在freertos_demo函数中创建start_task任务
void freertos_demo(void)
{//创建二值信号量binarySemaphore = xSemaphoreCreateBinary(); if(binarySemaphore != NULL){printf("二值信号量创建成功!!!\r\n");}xSemaphoreGive(binarySemaphore); //释放一次信号量xTaskCreate((TaskFunction_t )start_task, /* 任务函数 */(const char* )"start_task", /* 任务名称 */(uint16_t )START_STK_SIZE, /* 任务堆栈大小 */(void* )NULL, /* 传入给任务函数的参数 */(UBaseType_t )START_TASK_PRIO, /* 任务优先级 */(TaskHandle_t* )&StartTask_Handler); /* 任务句柄 */vTaskStartScheduler();
}//3.在start_task函数中创建task1、task2任务
void start_task(void *pvParameters)
{//进入临界区taskENTER_CRITICAL();//创建任务1xTaskCreate((TaskFunction_t )task1, /* 任务函数 */(const char* )"task1", /* 任务名称 */(uint16_t )TASK1_STK_SIZE, /* 任务堆栈大小 */(void* )NULL, /* 传入给任务函数的参数 */(UBaseType_t )TASK1_PRIO, /* 任务优先级 */(TaskHandle_t* )&lowTask_Handler); /* 任务句柄 *///创建任务2 xTaskCreate((TaskFunction_t )task2, /* 任务函数 */(const char* )"task2", /* 任务名称 */(uint16_t )TASK2_STK_SIZE, /* 任务堆栈大小 */(void* )NULL, /* 传入给任务函数的参数 */(UBaseType_t )TASK2_PRIO, /* 任务优先级 */(TaskHandle_t* )&middleTask_Handler); /* 任务句柄*///创建任务3 xTaskCreate((TaskFunction_t )task3, /* 任务函数 */(const char* )"task3", /* 任务名称 */(uint16_t )TASK3_STK_SIZE, /* 任务堆栈大小 */(void* )NULL, /* 传入给任务函数的参数 */(UBaseType_t )TASK3_PRIO, /* 任务优先级 */(TaskHandle_t* )&highTask_Handler); /* 任务句柄*/ //删除开始任务 vTaskDelete(StartTask_Handler); //退出临界区taskEXIT_CRITICAL();
}//4.任务一 低优先级任务
void task1(void *pvParameters)
{while (1){printf("low Task获取信号量\r\n");xSemaphoreTake(binarySemaphore, portMAX_DELAY);printf("low Task正在运行\r\n");delay_ms(3000);printf("low Task正在释放信号量\r\n");xSemaphoreGive(binarySemaphore);vTaskDelay(1000);}
}//5.任务二 中优先级任务
void task2(void *pvParameters)
{while(1){printf("middle Task正在释放信号量\r\n");vTaskDelay(1000); }}//6.任务三 高优先级任务
void task3(void *pvParameters)
{while(1){printf("high Task获取信号量\r\n");xSemaphoreTake(binarySemaphore, portMAX_DELAY);printf("high Task正在运行\r\n");delay_ms(1000);printf("high Task正在释放信号量\r\n");xSemaphoreGive(binarySemaphore);vTaskDelay(1000);}}