FreeRTOS——优先级翻转

发布时间:2024年01月04日

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();
    //创建任务1
      xTaskCreate((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);
    }
   
}
文章来源:https://blog.csdn.net/m0_73502349/article/details/135378126
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。