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,一经查实,立即删除!

相关文章

【c语言】自定义类型:枚举类型【详解】

枚举类型 枚举类型的声明 枚举顾名思义就是⼀⼀列举。 把可能的取值⼀⼀列举。 ⽐如我们现实⽣活中 ⼀周的星期⼀到星期⽇是有限的7天,可以⼀⼀列举 性别有:男、⼥、保密,也可以⼀⼀列举 ⽉份有12个⽉,也可以⼀⼀列举 三原⾊&am…

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(…

【FAQ】HarmonyOS SDK 闭源开放能力 —Asset Store Kit

1.问题描述 使用关键资产API需要配置SystemCapability.Security.Asset,但不知道syscap.json文件应该配置在哪里,文档也没找到。 解决方案 新增关键资产等API可以直接参考开发指南里的示例代码进行调用: https://developer.huawei.com/cons…

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章 数据结构与集合源码

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

什么是stable diffusion?

🌟 Stable Diffusion:一种深度学习文本到图像生成模型 🌟 Stable Diffusion是2022年发布的深度学习文本到图像生成模型,主要用于根据文本的描述产生详细图像。它还可以应用于其他任务,如内补绘制、外补绘制&#xff0…

基于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)是一种传统的软件架构模式,将整个应用程序作为一个单一的、统一的单元进行开发、部署和扩展。在单体架构中,所有的功…

vue3.x专题十二 ---- vuex持久化(自动保存到本地)

在开发的过程中,例如用户信息等需要vuex中存储且需要本地存储,我们可以使用一个模块,设置好后,可以在修改state后自动触发并自动到本地存储数据: 1)首先:我们需要安装一个vuex的插件vuex-persi…

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 …

设计模式:创建者模式

定义 创建者模式(Builder Pattern),又称建造者模式,是一种创建型设计模式,它提供了一种创建对象的最佳方式。该模式允许将一个复杂对象的构建与它的表示分离,这样同样的构建过程可以创建不同的表示。创建者…

mmdetection计算参数量和计算复杂度

参数量与图片尺寸无关 而计算复杂度(GFlops)与输入图片的尺寸有关,作比较的时候要确保,输入尺寸一致的,最新版本的mmdetection的tools/analysis_tools/get_flops.py中不支持更改输入图片尺寸,而是自己从数…

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

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