FreeRtos入门-3 信号量(计数值、二进制、互斥量、递归锁)

信号量

计数量

二进制

互斥量

递归锁

创建

xSemCalc =

xSemaphoreCreateCounting(10, 0);//计数最大值10,初始值0

xSemUart = xSemaphoreCreateBinary();

xSemUART = xSemaphoreCreateMutex();

xSemUART = xSemaphoreCreateRecursiveMutex();

释放

xSemaphoreGive(xSemCalc) ;//让信号量+1

xSemaphoreGive(xSemUart)

xSemaphoreGive(xSemUart)

xSemaphoreGiveRecursive(xSemUART);

获取

xSemaphoreTake(xSemCalc,portMAX_DELAY) ;//让信号量-1

xSemaphoreTake(xSemUart,portMAX_DELAY);

xSemaphoreTake(xSemUart,portMAX_DELAY);

(xSemaphoreTakeRecursive(xSemUART,portMAX_DELAY)

总结

1,在main函数中创建信号量,并释放

2,使用时先take ,如果take不成功,处于阻塞状态,直到其他任务释放give了。

3,区别,新建信号量的函数不一样。

4,相同,获取和释放的函数一样。

二进制信号量,也称为二值信号量,

具有两种状态:可用和不可用。

任务可以尝试获取二进制信号量,如果信号量可用,则任务获取成功并继续执行;

如果信号量不可用,则任务会被阻塞,直到信号量变为可用。

二进制信号量主要用于控制任务之间的访问,但其并没有优先级继承机制。

因此,可以说二进制信号量是实现同步的更好选择,

而互斥锁则是实现简单互斥的更好选择。

在实际应用中,应根据具体的需求和场景来选择合适的同步机制

互斥量(也称为互斥锁)是一种特殊的二值信号量,

其主要特殊之处在于具有优先级继承机制。

这种机制能够暂 时地将互斥量持有者的优先级提升至所有等待此互斥量的任务所具有的最高优先级,有助于避免优先级翻转问题。

互斥量以锁的形式存在,用于确保在同一时间内只有一个任务可以访问共享资源,防止竞态条件等并发问题。

当一个任务需要访问共享资源时,它首先会尝试获取互斥量。

如果互斥量没有被其他任务占用,任务就能获取互斥量并继续执行;

否则,任务会被阻塞,直到互斥量可用。

此外,互斥量还支持嵌套,即一个任务在持有互斥量时,可以再次尝试获取互斥量。

谁持有,就由谁释放

递归上锁/解锁

递归锁是一种可重入的锁,这意味着同一个线程可以多次获取同一个递归锁而不会导致死锁。

示例代码

15_freertos_example_Semaphore

15_freertos_example_Semaphore

16_freertos_example_mutex

19_freertos_example_mutex_recursive

1,信号量与队列的区别,

队列可以在不同任务中传递信息,既可以把生产者的数据和生产者的状态告知给其他的任务。

而信号量只能传递不同任务的完成状态,无法传递数据。

2,涉及信号量(semaphore)的类型有:计数值(counting)、二进制(Binary)、互斥量(mutex)、递归锁(recursive)

二进制是特殊的计数值,计数最大值为1

二进制的缺陷1,存在优先级反转

二进制的缺陷2,存在别被人解锁风险

针对二进制的缺陷1,使用互斥量,通过优先级继承解决优先级反转问题。

针对二进制的缺陷2,使用递归锁,谁上锁,谁解锁,实现被别人解锁的风险。

3、互斥量是特殊的二进制,以锁的形式存在,具有优先级继承的特点,即低优先级的任务可以被锁后,高优先级的任务也被锁的情况下,低优先级任务可以解锁,并获得高优先级的优先级权,执行完成后,释放锁即优先级。这样保证了解锁后高优先级任务也能被运行。防止高优先级任务被锁后中优先级任务优先级反转执行。

4,在以上二进制上锁的过程中,存在解锁,当相同函数被任务A,B使用,当任务A上锁后,任务B也上锁会导致死锁。不能继续运行,引出了递归锁的概念。递归锁还具有谁上锁,谁解锁的特点,防止A上锁后被B解锁。

5,队列可以传递数据,信号量只能指示状态,数据传递可以用一个全局变量传递数据。

例子1:任务之间不带锁,导致的打印重叠

例子2:任务之间使用信号量-计数值,打印不重叠

例子3:任务之间使用信号量-二进值,打印不重叠

例子4:任务之间使用信号量-二进值,缺陷1,出现被别的任务释放锁情况

例子5:任务之间使用信号量-二进值,缺陷2,出现优先级反转问题

两次上锁,出现了死锁

解决方法使用互斥量

例子7:任务之间使用信号量-互斥值,使用优先级继承解决优先级反转问题

例子8:使用递归锁解决多次上锁,多次解锁,防止死锁

例子9:任务之间使用信号量-递归锁,使用递归锁决二进制锁被别人接掉的情况

二进制被别人解锁

互斥量被别人解锁

递归锁,谁上锁谁解锁

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

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

相关文章

Linux集群(一)Nginx搭建

目录 一、Nginx介绍 1.什么是Nginx 2.Nginx的特点 二、Nginx配置 1.jdk的安装 1.1检查jdk版本 1.2上传并安装jdk 2.安装Tomcat 3.下载Nginx 3.1安装依赖包 ​编辑 3.2安装Nginx 3.3运行 三、Nginx中的常用命令​编辑 一、Nginx介绍 1.什么是Nginx Nginx(…

Coursera上Learning Linux for LFCA Certification专项课程01:Linux Fundamentals 学习笔记

Linux Fundamentals Course Certificate 本文是 Linux Fundamentals 这门课的学习笔记,如有侵权,请联系删除。 文章目录 Linux FundamentalsWeek 01: Linux Operating SystemLearning Objectives Specialization OverviewHistory of LinuxQuiz: Hist…

软件设计师27--规范化理论

软件设计师27--规范化理论 考点1:规范化理论基本概念函数依赖规范化理论--Amstrong公理体系候选键主属性与非主属性例题: 考点2:范式判断规范化理论规范化理论 - 范式例题: 考点3:范式分解保持函数依赖分解无损分解模式…

第14章 数据结构与集合源码

一 数据结构剖析 我们举一个形象的例子来理解数据结构的作用: 战场:程序运行所需的软件、硬件环境 战术和策略:数据结构 敌人:项目或模块的功能需求 指挥官:编写程序的程序员 士兵和装备:一行一行的代码 …

基于opencv的猫脸识别模型

opencv介绍 OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及…

【前端面试3+1】11 http和https有何不同及https的加密过程、数组有哪些方法及作用、tcp三次握手四次挥手、【分发饼干】

一、http和https有何不同?https的加密过程 1、不同: HTTP和HTTPS的主要区别在于安全性。HTTP是超文本传输协议,是一种用于传输数据的协议,但是传输的数据是明文的,容易被窃听和篡改。而HTTPS是在HTTP基础上加入了SSL/T…

【ORB-SLAM3】Ubuntu20.04 使用 RealSense D435i 运行 ORB-SLAM3 时遇到的一些 Bug

【ORB-SLAM3】使用 RealSense D435i 跑 ORB-SLAM3 时遇到的一些 Bug 1 hwmon command 0x80( 5 0 0 0 ) failed (response -7 HW not ready)2 No rule to make target /opt/ros/noetic/lib/x86_64-linux-gnu/librealsense2.so, needed by ../lib/libORB_SLAM3.so 1 hwmon comman…

力扣108. 将有序数组转换为二叉搜索树

Problem: 108. 将有序数组转换为二叉搜索树 文章目录 题目描述思路复杂度Code 题目描述 思路 根据二叉搜索树中序遍历为一个有序序列的特点得到: 1.定义左右下标left,right分别指向有序序列的头尾; 2.每次取出left和right的中间节点mid&…

电脑上怎么压缩图片?三个处理方法介绍

随着我们现在使用图片的地方越来越多,我们处理图片的情况也比较多了,通过压缩图片大小可以使图片文件更小,从而减少存储空间和带宽的使用,同时也可以提高加载速度和性能。良好的图片压缩可以有效地减少文件大小,同时保…

深入浅出 -- 系统架构之单体架构

单体架构(Monolithic Architecture) 单体架构的定义 单体架构(Monolithic Architecture)是一种传统的软件架构模式,将整个应用程序作为一个单一的、统一的单元进行开发、部署和扩展。在单体架构中,所有的功…

JSP

概念:Java Server Pages,Java服务端页面 一种动态的网页技术,其中既可以定义HTML、JS、CSS等静态内容,还可以定义Java代码的动态内容 JSP HTML Java 快速入门 注:Tomcat中已经有了JSP的jar包,因此我们…

【yy讲解PostCSS是如何安装和使用】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

Coursera上托福专项课程01:TOEFL Reading and Listening Sections Skills Mastery 学习笔记

TOEFL Reading and Listening Sections Skills Mastery Course Certificate 本文是学习 https://www.coursera.org/learn/toefl-reading-listening-sections-skills-mastery 这门课的笔记,如有侵权,请联系删除。 文章目录 TOEFL Reading and Listening …

AI绘图:Stable Diffusion ComfyUI局部重绘与智能扩图全面教程

前言 在数字艺术创作中,局部重绘和智能扩图是两个非常重要的功能。局部重绘允许我们在保留原有图像的基础上,对特定区域进行修改或创新。而智能扩图则能够帮助我们在图像的边缘添加新的元素,从而扩展图像的内容。本文将详细介绍如何在Stable…

卷积篇 | YOLOv8改进之引入全维度动态卷积ODConv | 即插即用

前言:Hello大家好,我是小哥谈。ODConv是一种关注了空域、输入通道、输出通道等维度上的动态性的卷积方法,一定程度上讲,ODConv可以视作CondConv的延续,将CondConv中一个维度上的动态特性进行了扩展,同时了考虑了空域、输入通道、输出通道等维度上的动态性,故称之为全维度…

深入理解C/C++的内存管理

在C和C中,高效的内存管理是编写性能优化和资源高效利用程序的关键。本文将深入探讨C/C内存管理的各个方面,包括内存的分布、C语言和C中的动态内存管理方式,以及new和delete操作符的使用 C/C内存分布 C和C程序的内存可以分为以下几个区域&…

Transformer学习: Transformer小模块学习--位置编码,多头自注意力,掩码矩阵

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Transformer学习 1 位置编码模块1.1 PE代码1.2 测试PE1.3 原文代码 2 多头自注意力模块2.1 多头自注意力代码2.2 测试多头注意力 3 未来序列掩码矩阵3.1 代码3.2 测试掩码 1 …

简约轻量-失信录系统源码

失信录系统-最新骗子收录查询系统源码 首页查询: 举报收录页: 后台管理页: 失信录系统 V1.0.0 更新内容: 1.用户查询,举报功能 2.界面独立开发 3.拥有后台管理功能 4.xss,sql安全过滤 5.平台用户查询 6.用户中心(待完…

Flume进阶学习!

本文图片来自于8.flume实时监控文件hdfs sink使用演示_哔哩哔哩_bilibili Apache Flume 的启动过程及其配置文件和脚本 在官网下载的Flume的压缩包中,.lib文件有大量的jar包,按道理说只有.lib文件就可以运行Flume程序了。只不过需要java -jar命令还要加…

第16章 网络编程

一 网络编程概述 Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。 Java提供的网络类库,可以实现无痛的网络连接,联网的底层细节被隐藏在 Java 的本机安装系统里&am…