FreeRTOS ~(七)互斥量 ~ (1/3)互斥量解决互斥缺陷

前情提要
FreeRTOS ~(四)同步互斥与通信 ~ (2/3)互斥的缺陷
FreeRTOS ~(五)队列的常规使用 ~ (2/5)队列解决互斥缺陷
FreeRTOS ~(六)信号量 ~ (2/3)信号量解决互斥缺陷
举例子说明:利用互斥量解决前述的"互斥的缺陷"问题

/*-----------------------------------------------------------*/
static SemaphoreHandle_t xSemUART;	/* 二值信号量的句柄/互斥量的句柄 */void TaskGenericFunction(void * param)
{while (1){/* 将二值信号量/互斥量置0,关闭串口使用权,防止被Tick中断的时候,任务切换后,其他任务使用串口 */xSemaphoreTake(xSemUART, portMAX_DELAY);printf("%s\r\n", (char *)param);/* 将二值信号量置1/互斥量,激活串口使用权 */xSemaphoreGive(xSemUART);/* 每个Task使用完就将自己阻塞掉,否则自己就将一直独占串口使用权详细的解释在 "FreeRTOS ~(五)队列的常规使用 ~ (2/5)队列解决互斥缺陷"中有写. */vTaskDelay(1);}
}
/*-----------------------------------------------------------*/
int main( void )
{prvSetupHardware();#if  0/* 创建二值信号量 */xSemUART = xSemaphoreCreateBinary();/* 将二值信号量置1,激活串口使用权 */xSemaphoreGive(xSemUART);#else/* 创建互斥量 */xSemUART = xSemaphoreCreateMutex();#endifxTaskCreate(TaskGenericFunction, "Task3", 100, "Task 3 is running", 1, NULL);xTaskCreate(TaskGenericFunction, "Task4", 100, "Task 4 is running", 1, NULL);vTaskStartScheduler();return 0;
}

在这里插入图片描述

从上述代码就可以明确的知道:
互斥量就是特殊的二值信号量,除了创建时调用的API不同之外,take和give使用的都是信号量的函数;
对于这种常规使用,互斥量简化了一步,创建二值信号量之后,要先give一次;
而对于互斥量而言,这个give是在创建互斥量 xSemaphoreCreateMutex 这个函数内部就操作了的.
互斥量还有其他的用法,详见后续.

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

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

相关文章

文字磨练课程:提高编辑和校对效率的方法

提高编辑和校对效率,可以使你更有效地完成写作任务,提升文章质量。以下是一些方法,可以帮助你在编辑和校对过程中提高效率。 1.设定目标和计划 在开始编辑和校对前,设定明确的目标和计划。这可以帮助你集中注意力,提…

瑞芯微:基于RKNN3568得ufldv2部署

Lane检测是自动驾驶和高级驾驶员辅助系统(ADAS)的基本组成部分,用于区分和定位道路上的车道线。尽管深度学习模型已经取得了巨大成功,但仍有一些重要且具有挑战性的问题需要解决。 第一个问题是效率问题。在实践中,车…

从JDK源码级别剖析JVM类加载机制

1 什么是Java虚拟机 一个可执行java字节码的虚拟机进程;跨平台的是java程序,而不是java虚拟机,java虚拟机在各个操作系统是不兼容的,例如windows、linux、mac都需要安装各自版本的虚拟机,java虚拟机通过jdk实现功能。…

docker-compose实现微服务jar+mysql的容器服务发布(经典版)

一 安装mysql服务 1.1 拉取镜像 1.拉取: docker pull mysql:5.7.29 2.查看镜像: docker images 1.2 在宿主机创建文件存储mysql 1.创建映射目录:mysql-c5 在/root/export/dockertest 目录下,mkdir -p mysql-c5 &#…

Elasticsearch介绍和安装

ELK简介 Elastic Stack核心产品包括Elasticsearch、Logstash、Kibana(也称为ELK)和Beats等等。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化 Kibana是一个免费且开放的用户界面,能…

LVS +Keepalived高可用群集

文章目录 一、Keepalived概述二、Keepalived服务重要功能1.管理 LVS 负载均衡软件2.支持故障自动切换(Failover)3.实现 LVS 集群中节点的健康检查(Health Checking)4.VRRP通信原理 三、keepalived体系主要模块及作用四、keepalive…

LogicFlow 在HTML中的引入与使用

LogicFlow 在HTML中的引入与使用 LogicFlow的引入与使用,相较于BPMNJS相对容易一些,更加灵活一些,但是扩展代码可能写得更多一些。 示例展示 示例代码 github: https://github.com/iotzzh/origin-examples/blob/main/%E6%B5%81%E7%A8%8B%E5%9…

ADB 命令结合 monkey 的简单使用,超详细

一:ADB简介 1,什么是adb: ADB 全称为 Android Debug Bridge,起到调试桥的作用,是一个客户端-服务器端程序。其中客户端是用来操作的电脑,服务端是 Android 设备。ADB 也是 Android SDK 中的一个工具&#…

C++中的继承/虚继承原理

C中的继承 文章目录 C中的继承1.继承的概念和定义1.1 继承定义1.12 继承关系和访问限定符2.基类和派生类对象的复制转换3.继承中的作用域4.派生类的默认成员函数继承与友元 6.**继承与静态成员****复杂的菱形继承及菱形虚拟继承**7.虚继承解决数据冗余和二义性的原理 1.继承的概…

亚马逊云科技Zero ETL数据库,助力企业走向数据驱动的业务增长之路

据Forrester研究,相对于数据应用不够成熟的公司,那些有效获取业务洞察的公司,有高达8.5倍的可能性实现至少20%的收入增长。然而,要实现这一增长,需要简化一项流程——在数据分析前管理和准备好数据。这就是为什么亚马逊…

Java动态规划LeetCode1137. 第 N 个泰波那契数

方法1:通过动态规划解题,这道题也是动态规划的一道很好的入门题,因为比较简单和容易理解。 代码如下: public int tribonacci(int n) {//处理特殊情况if(n0){return 0;}if(n1||n2){return 1;}//定义数组int[]dpnew int[n1];//初…

随机数检测(三)

随机数检测(三)- 块内最大游程检测、二元推导检测、自相关检测、矩阵秩检测 3.8 块内最大游程检测方法3.9 二元推导检测方法3.10 自相关检测3.11 矩阵秩检测 如果商用密码产品认证中遇到问题,欢迎加微信symmrz或13720098215沟通。 3.8 块内最…