FreeRTOS——互斥信号量知识总结及其实战

1互斥信号量的概念

1)互斥信号量:是一个拥有优先级继承的二值信号量,在同步的应用中二值信号量最适合。互斥信号量适合用于那些需要互斥访问的应用中!

2)优先级继承:当一个互斥信号量正在被一个低优先级的任务持有时, 如果此时有个高优先级的任务也尝试获取这个互斥信号量,那么这个高优先级的任务就会被阻塞。不过这个高优先级的任务会将低优先级任务的优先级提升到与自己相同的优先级。
在这里插入图片描述
3)互斥信号量有任务优先级继承的机制, 但是中断不是任务,没有任务优先级, 所以互斥信号量只能用与任务中,不能用于中断服务函数。
4)中断服务函数中不能因为要等待互斥信号量而设置阻塞时间进入阻塞态。

2 互斥信号量的使用流程

1)使用互斥信号量:首先将宏configUSE_MUTEXES置一
2)使用流程:创建互斥信号量 ->(task)获取信号量 ->(give)释放信号量

3 互斥信号量API函数

#define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX )
返回值: NULL 创建失败
其他 返回信号量失败

互斥信号量的释放和获取函数与二值信号量相同 !只不过互斥信号量不支持中断中调用
注意:创建互斥信号量时,会主动释放一次信号量

4 互斥信号量实战

实验设计:将优先级翻转所用到的信号量函数,修改成互斥信号量即可,通过串口打印提示信息

4.1 freertos_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.2 TASK2 任务 配置#define TASK2_PRIO      3                   /* 任务优先级 */
#define TASK2_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            middleTask_Handler;  /* 任务句柄 */
void task2(void *pvParameters);             /* 任务函数 *///1.3 TASK3 任务 配置#define TASK3_PRIO      4                   /* 任务优先级 */
#define TASK3_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            highTask_Handler;  /* 任务句柄 */
void task3(void *pvParameters);             /* 任务函数 *///1.4 二值信号量句柄定义
SemaphoreHandle_t        mutexSemaphore;  //2.在freertos_demo函数中创建start_task任务
void freertos_demo(void)
{//创建互斥信号量mutexSemaphore = xSemaphoreCreateMutex();         //互斥型信号量创建成功后会释放一次信号量if(mutexSemaphore != NULL){printf("二值信号量创建成功!!!\r\n");}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(mutexSemaphore, portMAX_DELAY);printf("low Task正在运行\r\n");delay_ms(3000);printf("low Task正在释放信号量\r\n");xSemaphoreGive(mutexSemaphore);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(mutexSemaphore, portMAX_DELAY);printf("high Task正在运行\r\n");delay_ms(1000);printf("high Task正在释放信号量\r\n");xSemaphoreGive(mutexSemaphore);vTaskDelay(1000);}
}

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

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

相关文章

【史上最细教程】CentOS7 下载安装 RabbitMQ(两种方式:手动安装 / Docker安装)

文章目录 【史上最细教程】CentOS7 下载安装 RabbitMQ方式一:手动安装1.下载安装Erlang、RabbitMQ2.防火墙、安全组端口放行3.启动RabbitMQ服务4.浏览器用户登录5.配置文件查看(可略) 方式二:Docker安装1.安装Docker2.获取RabbitMQ镜像、创建容器3.浏览器…

【动态规划】C++算法:44 通配符匹配

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 动态规划 LeetCode44 通配符匹配 给你一个输入字符串 (s) 和一个字符模式 ,请你实现一个支持 ‘?’ 和 ‘’ 匹配规则的通配符匹配: ‘?’ 可以匹配任何单个字符。 ’ 可以匹配…

c语言:打印随机3球颜色小程序|练习题

一、题目 给出5种颜色&#xff0c;取出3种颜色进行组合&#xff0c;计算组合的个数。 如图&#xff1a; 二、思路分析 1、3层循环&#xff0c;每一层循环5次(有5个球) 2、排除掉三个球具有同种颜色的情况 三、代码截图【带注释】 四、源代码【带注释】 #include <stdio.h&…

宝贝的成长之锌:新生儿补充锌的温馨指南

引言&#xff1a; 新生儿的健康发育离不开全面的营养供给&#xff0c;而锌作为一种微量元素&#xff0c;在新生儿的生长过程中扮演着重要的角色。本文将深入探讨锌在新生儿成长中的功能、补充时机&#xff0c;以及在给新生儿补充锌时应该注意的事项&#xff0c;为小天使们提供…

OFFICE插件-大珩助手卸载方法

卸载方法 大珩助手安装后&#xff0c;可在应用与功能处看到&#xff0c;PPT大珩助手或Word大珩助手&#xff0c;可按安装时间排序&#xff0c;直接右键卸载&#xff1b; 使用方法 1、更新时&#xff0c;需要在系统应用与功能处&#xff0c;卸载PPT大珩助手&#xff0c;然后再…

Golang-strconv库学习笔记

前言&#xff1a; strconv库是go官方提供的一个标准包&#xff0c;主要用于字符串相关的处理。通过参考官方文档、中文文档和其他工具&#xff0c;进行学习记录。学习重点是其中的内置方法。 本文分为Atoi&#xff0c;Format系列&#xff0c;Parse系列&#xff0c;Append系列,…

【计算机毕业设计】SSM二手交易网站

项目介绍 该项目分为前后台&#xff0c;前台普通用户角色&#xff0c;后台管理员角色。 管理员主要功能如下&#xff1a; 登陆,商品分类管理,商品管理,商品订单管理,用户管理等功能。 用户角色主要功能如下&#xff1a; 包含以下功能&#xff1a;查看所有商品,用户登陆注册…

Git(2):Git环境的安装

本教程里的git命令例子都是在Git Bash中演示的&#xff0c;会用到一些基本的linux命令&#xff0c;在此为大家提前列举&#xff1a; ls/ll 查看当前目录cat 查看文件内容touch 创建文件vi vi编辑器&#xff08;使用vi编辑器是为了方便展示效果&#xff0c;学员可以记事本、edi…

Python内置类属性__module__属性的使用教程

概要 在Python中&#xff0c;每个对象都有一些内置的属性&#xff0c;这些属性提供了有关对象的一些信息。其中一个内置属性是__module__属性。__module__属性是一个字符串&#xff0c;它表示定义了类或函数的模块的名称。在本篇文章中&#xff0c;我们将详细介绍__module__属…

IDEA 控制台中文乱码问题解决方法(UTF-8 编码)

设置 IDEA 编码格式 1&#xff1a;打开 IntelliJ IDEA>File>Setting>Editor>File Encodings&#xff0c;将 Global Encoding、Project Encoding、Default encodeing for properties files 这三项都设置成 UTF-8 2&#xff1a;将 vm option 参数改为&#xff1a; -…

element中Table表格控件实现单选功能、多选功能、两种分页方式

目录 1、Table表格控件实现单选功能2、Table控件和Pagination控件实现多选和两种分页方式方法一&#xff1a;使用slice方法方法二&#xff1a;多次调用接口 1、Table表格控件实现单选功能 <template><div><!-- highlight-current-row 是否要高亮当前行 -->…

洁净室洁净度如何快速计算?附详细计算公式

关于洁净室洁净度概念 按空气中悬浮粒子浓度来划分洁净室及相关受控环境中空气洁净度等级&#xff0c;就是以每立方米空气中的最大允许粒子数来确定其空气洁净度等级。 几级洁净车间&#xff1a;指洁净级别&#xff0c;可以理解为无尘室&#xff0c;但是无尘室也是需要换气的…