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

news2024/11/20 9:29:52

信号量

计数量

二进制

互斥量

递归锁

创建

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.coloradmin.cn/o/1570333.html

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

相关文章

mysql 判断一张表是否存在的方法

查询表是否存在 使用 SHOW TABLES SHOW TABLES LIKE %tbl_tabl%;结果: 查询 INFORMATION_SCHEMA // like 匹配 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA test AND TABLE_NAME like %tbl%; // 完全匹配 SELECT TABLE_NAME FROM INFORMATION_SC…

JVM基础二——类的生命周期

加载阶段 : 连接阶段: 初始化阶段: 总结:

C++ | Leetcode C++题解之第10题正则表达式匹配

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isMatch(string s, string p) {int m s.size();int n p.size();auto matches [&](int i, int j) {if (i 0) {return false;}if (p[j - 1] .) {return true;}return s[i - 1] p[j - 1];};vector<…

计算机网络——数据链路层(流量传输与可靠传输机制)

计算机网络——数据链路层&#xff08;流量传输与可靠传输机制&#xff09; 流量传输与可靠传输机制流量控制可靠传输机制 停止-等待协议无差错情况接收并检测到差错状态确认丢失或迟到状态 停等协议的效率分析后退N帧协议&#xff08;Go-Back-N&#xff0c;简称GBN&#xff09…

KnowLog:基于知识增强的日志预训练语言模型|顶会ICSE 2024论文

徐波 东华大学副教授 东华大学计算机学院信息技术系副系主任&#xff0c;复旦大学知识工场实验室副主任&#xff0c;智能运维方向负责人。入选“上海市青年科技英才扬帆计划”。研究成果发表在IJCAI、ICDE、ICSE、ISSRE、ICWS、CIKM、COLING等国际会议上&#xff0c;曾获中国数…

Linux 内核优化简笔 - 高并发的系统

简介 Linux 服务器在高并发场景下&#xff0c;默认的内核参数无法利用现有硬件&#xff0c;造成软件崩溃、卡顿、性能瓶颈。 当然&#xff0c;修改参数只是让Linux更好软件的去利用已有的硬件资源&#xff0c;如果硬件资源不够也无法解决问题的。而且当硬件资源不足的时候&am…

小红的平滑值插值【牛客周赛38】

题目描述&#xff1a; 小红定义一个数组的“平滑值”为&#xff1a;相邻两数差的绝对值的最大值。 具体的&#xff0c;数组a的平滑值定义为 现在小红拿到了一个数组。她每次操作可以在两个元素之间添加一个整数&#xff08;不能添加在第一项前面或者最后一项后面&#xff09;。…

鸿蒙开发第一课-工具与HelloWorld

武汉数字人才实训基地 一、初始HarmonyOS以及DevEco Studio 2023年8月4日&#xff0c;HarmonyOS 4.0操作系统正式发布。华为鸿蒙Next&#xff08;HarmonyOS Next&#xff09;操作系统开发者预览版(Developer Preview)发布。超过7亿台设备搭载了HarmonyOS 系统 2024年&#xf…

时序预测 | Matlab基于CFBP级联前向BP神经网络时序预测

时序预测 | Matlab基于CFBP级联前向BP神经网络时序预测 目录 时序预测 | Matlab基于CFBP级联前向BP神经网络时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab基于CFBP级联前向BP神经网络时序预测&#xff08;完整源码和数据)&#xff1b; 2.数据集为excel…

提灯定损的建模-UMLChina建模知识竞赛第5赛季第9轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。 如果有第4题&#xff0c;第4题为附加题&am…

阿里 对象存储OSS 云存储服务

1.简介 对象存储服务(Object Storage Service ,OSS) 是一种 海量、安全、低成本、高可靠的云存储服务&#xff0c;适合存放任意类型的文件。容量和处理能力弹性扩展&#xff0c;多种存储类型供选择&#xff0c;全面优化存储成本。 2.如何使用。参考文档 看文档&#xff0c;说的…

LeNet卷积神经网络

文章目录 简介conv2d网络层的结构 简介 它是最早发布的卷积神经网络之一 conv2d 这个卷积成的参数先进行介绍一下&#xff1a; self.conv1 nn.Conv2d(in_channels3, out_channels10, kernel_size3, stride1, padding1)先看一下in_channels 输入的通道数&#xff0c;out_cha…

Kotlin学习日志(一)TextView、Button、Toast的使用(1)

android:layout_width“wrap_content” android:layout_height“wrap_content”/> import kotlinx.android.synthetic.main.activity_main.* 这句话的意思是引进Kotlin的的控件变量自动映射功能&#xff0c;接下来只要是这个activity_main.xml文件中的控件&#xff0c;我…

Xshell Plus 详细安装教程以及附带使用图文教程

一、下载 Xshell Plus 6 完成后&#xff0c;请按照下面教程操作 1、下载 Xshell Plus 6 完成后&#xff0c;并解压 zip 包: 2、进入解压后的文件夹后&#xff0c;如果你之前安装了 Xshell&#xff0c; 先点击 !卸载.bat 卸载 xshell&#xff0c; 然后再点击 !绿化.bat; 如果是…

Pygame基础10-物理模拟

PyMunk PyMunk是一个模拟物理的库。 注意&#xff0c;PyMunk只是进行物理模拟&#xff0c;不包含可视化的功能。如果需要可视化&#xff0c;可使用pygame等库。 可用pip安装pymunk pip install pymunk pymunk中的概念&#xff1a; space&#xff1a; 物理空间。 包含gravity 模…

[问题记录] oracle问题汇总记录

plsql问题 1、oracle-initialization error could not locate OCI.dll 下载plsql客户端后&#xff0c;登录显示如图所示的错误 解决方法&#xff0c;点击下方链接&#xff0c;下载64位客户端 Instant Client for Microsoft Windows (x64) 64-bit (oracle.com) 2、显示中文乱…

如何打包一个手机软件

目录 前言&#xff1a; 准备工具&#xff1a; 创建项目&#xff1a; 打包程序&#xff1a; 前言&#xff1a; 我们平时手机上使用的程序&#xff0c;或者电脑上使用的程序都可以由Web程序打包而来的&#xff0c;而打包不是一个.html文件也不是一个.js文件而是一个大型的文…

可视化大屏的行业应用(3):智慧旅游智慧景区

可视化大屏在智慧旅游和智慧景区中具有重要的应用价值&#xff0c;可以帮助景区管理者更好地了解景区的情况&#xff0c;提高游客的满意度和体验&#xff0c;促进景区的发展。 实时监控&#xff1a; 可视化大屏可以将景区内的各种数据实时监控&#xff0c;包括游客数量、交通…

VC++建立空文档失败的一种情形

假设现在要在单文档程序的客户区创建控件; 把控件作为视类的成员变量; 先把成员变量定义加到视类头文件; 然后在视类的, BOOL CMyttView::PreCreateWindow(CREATESTRUCT& cs) {....... } 在此成员函数中创建控件; 运行程序,就会出现如下错误, 这就需要在类向导…

企业员工岗前培训管理系统的设计与实现(论文+源码)_kaic

摘 要 有效的处理想要的相关信息和如何传播有效的信息&#xff0c;一直是人类不断探索的动力。人类文明火种的传承都是通过了多种媒介作为载体&#xff0c;也是随着社会生产力的发展不断的更新。随着互联网的到来&#xff0c;信息传播与管理都上升了一个新的台阶&#xff0c;并…