FreeRTOS——优先级翻转

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);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/319622.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速学习SpringBoot

SpringBoot springboot传统方式构建spring应用程序使用springboot子项目构建起步依赖自动配置其它特性 SpringBoot项目部署Spring项目部署属性配置方式命令行参数方式配置环境变量方式外部配置文件方式 多环境开发-Pofiles多环境开发分组 springboot 传统方式构建spring应用程…

Kubeadmin实现k8s集群:

Kubeadmin来快速搭建一个k8s集群: 二进制搭建适合大集群,50台以上的主机, 但是kubeadm更适合中小企业的业务集群 环境: Master:20.0.0.71 2核4G 或者4核8G docker kubelet kubectl flannel Node1:20.…

案例072:基于微信小程序的会议发布与预约系统的设计与开发

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

Unity中URP下的线性雾

文章目录 前言一、线性雾 雾效因子二、MixFog1、ComputeFogIntensity 雾效强度计算2、雾效颜色混合 lerp(fogColor, fragColor, fogIntensity); 前言 在之前的文章中,我们实现了URP下的雾效支持。 Unity中URP下的添加雾效支持 在上一篇文章中,我们解析了 URP 下统…

OSPF被动接口配置-新版(14)

目录 整体拓扑 操作步骤 1.基本配置 1.1 配置R1的IP 1.2 配置R2的IP 1.4 配置R4的IP 1.5 配置R5的IP 1.6 配置PC-1的IP地址 1.7 配置PC-2的IP地址 1.8 配置PC-3的IP地址 1.9 配置PC-4的IP地址 1.10 检测R1与PC3连通性 1.11 检测R2与PC4连通性 1.12 检测R4与PC1连…

[雷池WAF]长亭雷池WAF配置基于健康监测的负载均衡,实现故障自动切换上游服务器

为了进一步加强内网安全,在原有硬WAF的基础上,又在内网使用的社区版的雷池WAF,作为应用上层的软WAF。从而实现多WAF防护的架构。 经过进一步了解,发现雷池WAF的上游转发代理是基于Tengine的,所以萌生出了一个想法&…

实战环境搭建-安装xshell和xftp

安装xshell和xftp的原因是想远程虚拟机,很多时候,直接去操作虚拟机明显不太方便。 所以,我们需要一个能够搭载虚拟机和本地电脑之间的桥梁,哪怕是你们去了企业,也和这个类似,唯一的区别是企业里面更多连接…

希亦、觉飞、小吉三款婴儿洗衣机大比拼!全方位对比测评

由于年龄幼小的婴儿的皮肤都非常的幼嫩,因此婴儿衣物材质的类型大部分都是采用为纯棉,并且婴儿的衣物不能够与大人的衣物一起进行混洗,容易把细菌感染到宝宝的衣物上,因此很多家庭为了保证宝宝衣服的有效清洁,避免交叉…

JMeter分布式压测及常见问题

JMeter分布式压测及常见问题 1. 应用背景2. 目的3. 介绍3.1 分布式压测原理3.2 操作步骤3.2.1 设置配置文件 4. 操作建议5. 常见问题5.1 不能识别地址5.2 不能识别地址 1. 应用背景 在性能测试过程中,并发数过大,如果还想用JMeter这个测试工具&#xff0…

【PTA-C语言】编程练习5 - 函数与指针

如果代码存在问题,麻烦大家指正 ~ ~有帮助麻烦点个赞 ~ ~ 编程练习5 - 函数与指针 6-1 求实数和的函数(分数 10)6-2 求解一元二次方程实根的函数(分数 10)6-3 求集合数据的均方差(分数 10)6-4 计…

从vue小白到高手,从一个内容管理网站开始实战开发第三天,使用Element UI构建页面-登录(一)

上次我们介绍了如何安装Element UI库,这次我们使用Element UI中的组件开始开发我们的页面。 开发之前要先在项目中建立好几个目录,方便我们下面的开发。 一、在项目中创建页面管理目录 1、pages目录(文件夹) 首先在src文件夹下创建一个名为pages的文件夹,该文件夹用来统…

uniCloud 云数据库(新建表、增、删、改、查)

新建表结构描述文件 todo 为自定义的表名 表结构描述文件的默认后缀为 .schema.json 设置表的操作权限 uniCloud-aliyun/database/todo.schema.json 默认的操作权限都是 false "permission": {"read": false,"create": false,"update&quo…