FreeRTOS线程同步---信号量

目录

二值信号量

二值信号量相关API函数

一般使用方法为

1.创建二值信号量

2.在一个任务中置为二值释放信号

3.在另一个任务中获取信号


        信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问。其中,“同步”指的
是任务间的同步,即信号量可以使得一个任务等待另一个任务完成某件事情后,才继续执行;
而“有序访问”指的是对被多任务或中断访问的共享资源(如全局变量)的管理,当一个任务
在访问(读取或写入)一个共享资源时,信号量可以防止其他任务或中断在这期间访问(读取
或写入)这个共享资源。

二值信号量

        信号量是基于队列实现的,二值信号量也不例外,二值信号量实际上就是一个队列长度为 1 的队列,在这种情况下,队列就只有空和满两种情况,这不就是二值情况吗。

事实上RTOS正是这样做的:

在创建二值信号量的函数xSemaphoreCreateBinaryStatic( )里跳转进入可以看到它是一个宏定义,会在预处理阶段直接替换为xQueueGenericCreateStatic( )静态创建了一个大小为1的队列

#if ( configSUPPORT_STATIC_ALLOCATION == 1 )#define xSemaphoreCreateBinaryStatic( pxStaticSemaphore )    xQueueGenericCreateStatic( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, ( pxStaticSemaphore ), queueQUEUE_TYPE_BINARY_SEMAPHORE )
#endif /* configSUPPORT_STATIC_ALLOCATION */

二值信号量相关API函数

函数
描述
xSemaphoreCreateBinary()
使用动态方式创建 二值信号量
xSemaphoreCreateBinaryStatic()
使用静态方式创建二值信号量
xSemaphoreTake()
获取信号量
xSemaphoreTakeFromISR().
在中断中获取信号量
xSemaphoreGive()
释放信号量
xSemaphoreGiveFromISR()
在中断中释放信号量
vSemaphoreDelete()
删除信号量

一般使用方法为

1.创建二值信号量

QueueHandle_t xSemaphore;//声明二值信号量
xSemaphore = xSemaphoreCreateBinary();//创建二值信号量

2.在一个任务中置为二值释放信号

xSemaphoreGive(xSemaphore);//释放信号

3.在另一个任务中获取信号

xSemaphoreTake(xSemaphore, portMAX_DELAY);//获得信号量

注意在等待信号量的任务中应该为

while(1){if(xSemaphoreTake(xSemaphore, portMAX_DELAY);//阻塞等待{... /*具体操作*/}
}

从而达到任务阻塞等待信号的作用

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

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

相关文章

Spring Boot报错:没有配置数据源(url属性未设置)

文章目录 小结问题解决参考 小结 Spring Boot报错:没有配置数据源(url属性未设置),进行解决。 问题 Spring Boot报错: ERROR 2024-08-28 17:24:43.734 [main] - *************************** APPLICATION FAILED T…

24年7月-8月工作笔记整理(前端)

目录 一、问题解决二、基础知识学习 一、问题解决 1.浏览器拦截跳转的解决方案 //先打开一个空白页let winHandler window.open(, _blank)//再重定向到想要跳转的链接winHandler.location.href redirectUrl2.文字大小跟随父级元素宽度适配缩放 //父元素加不换行和相对定位…

sqli-labs靶场(56-60)

56关 ?id-1)union select 1,2,database()-- 看数据库 ?id-1) union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()-- 看表 ?id-1) union select 1,group_concat(column_name),3 from information_schema.columns wh…

深入探索MySQL数据库结构设计:实战案例解析,打造高效、可扩展的数据存储方案

作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元 个人主页:团儿.-CSDN博客 前言:…

noge-gyp构建项目踩坑记录

开发环境 系统: win11 node: 19.7.0 npm: 8.3.2 node-gyp: 10.0.2可以不使用windows-build-tools来安装构建工具,手动进行安装 我这边用windows-build-tools安装时候会提示 process.env only accepts a configurable, writable, and enumerable data descriptor. 查了资料后…

转换视频格式轻松搞定!3个小窍门助你轻松将mxf格式转mp4

你是否因为格式转换而烦恼?你是否经历过这样的情况:你想要在别的设备或平台上播放心仪的视频,但是你的视频文件是xmf格式的,很多设备都不支持这个格式,导致视频无法播放。现在,你需要把mxf格式转mp4格式。你…

【时间盒子】-【2.准备】HarmonyOS 开发前需要准备什么?

零基础新手或转行进入鸿蒙生态应用的开发者,请提前准备以下内容: 一、注册华为帐号 此帐号在华为官方各平台通用,比如:华为手机、华为商城、华为云、华为开发者联盟等等。 https://id1.cloud.huawei.com/CAS/portal/userRegist…

linux 下转化 ppk 文件 为openssh 文件(private,public)

1. 首先安装: puttygen ubuntu : apt install putty-tools 2. ppk 文件转化 openssh key private key : puttygen /path/to/puttykey.ppk -O private-openssh -o ~/.ssh/id_rsa public key: puttygen /path/to/puttykey.ppk -O public-openssh -o…

如何在Windows和Mac上免费提取RAR文件?这里有方法

序言 你有没有下载过一个文件,却发现它有一个奇怪的.rar文件扩展名?RAR是一种压缩文件格式,与ZIP文件非常相似,在本文中,我们将向你展示如何在Windows或macOS上打开RAR文件。 如何在Windows 11上打开RAR文件 Windows 11在2023年增加了对RAR文件的原生支持。从那时起,你…

问:说说内部类和静态内部类的区别?

示例 内部类(Non-static Inner Class): public class OuterClass {private String outerField "我是外部类字段";class InnerClass {public void display() {System.out.println(outerField); // 可以直接访问外部类的成员}}public void sh…

144. 腾讯云Redis数据库

文章目录 一、Redis 的主要功能特性二、Redis 的典型应用场景三、Redis 的演进过程四、Redis 的架构设计五、Redis 的数据类型及操作命令六、腾讯云数据库 Redis七、总结 Redis 是一种由 C 语言开发的 NoSQL 数据库,以其高性能的键值对存储和多种应用场景而闻名。本…

可重入VI,VI模板和动态VI之间的差异 转

可重入VI 当您想要同时运行同一VI的多个实例时,将使用可重入VI。当VI不可重入时,VI只有一个数据空间。因此,一次只能有一个调用者运行VI,因此调用者可能必须“等待轮到它”时才能使用VI。这是VI的默认选项,但您可以将V…

ARKTS数组和Map的常规操作

数组 Entry Component struct ArrayDemo {State message: string Hello World;// 创建一个数组State testList: Array<string> [测试1, 测试2, 测试3];build() {Row() {Column() {Button(新增元素).onClick(() > {// this.testList.push(测试4)//在数组末尾添加一个…

js基础速成-字符串方法

字符串方法 JavaScript 中的所有内容都是对象。字符串是一种基本数据类型&#xff0c;这意味着一旦创建就无法修改。字符串对象有许多字符串方法&#xff0c;有不同的字符串方法可以帮助我们处理字符串。 length 字符串的 length 方法返回字符串中字符的数量&#xff0c;包括…

Hibernate 批量插入速度慢的原因和解决方法

由于业务需要一次性连续写入超过10k条以上的新数据&#xff0c;当对象超过10个成员变量以后&#xff0c;整个写入过程居然需要长达35秒&#xff0c;这个速度是不能接受的&#xff0c;故此研究了一下怎么开启Hibernate批量写入的功能。 我这边使用的是Hibernate 5.6.15 在网上…

Spark MLlib模型训练—回归算法 Linear regression

Spark MLlib模型训练—回归算法 Linear regression 线性回归是回归分析中最基础且应用广泛的一种方法。它用于建模目标变量和一个或多个自变量之间的关系。随着大数据时代的到来,使用像 Spark 这样的分布式计算框架进行大规模数据处理和建模变得尤为重要。本文将全面解析 Spa…

Java 异常架构Exception(异常)

1. Exception 类的概述 在Java中&#xff0c;Exception类是Throwable类的直接子类之一。Throwable类是Java异常处理体系的根类&#xff0c;所有异常和错误都继承自它。Java的异常体系可以分为以下几个部分&#xff1a; Throwable&#xff1a;所有异常和错误的基类。 - Exce…

【Java|Stream流】不可变集合

文章目录 1.什么是不可变集合2.创建不可变集合的方式2.1 List类型2.2 Set2.3 Map 1.什么是不可变集合 不可变集合:不可以被修改的集合 不可变集合优点: 安全性 由于不可变集合不能被修改&#xff0c;所以可以安全地在多个线程之间共享&#xff0c;而不用担心被意外修改&#xf…

【kubernetes】Service 介绍和应用

一&#xff0c;Service介绍 四层代理是基于传输层&#xff08;第四层&#xff09;工作的代理&#xff0c;主要在传输层&#xff08;如TCP、UDP协议&#xff09;上转发和管理数据流 七层代理是基于应用层&#xff08;第七层&#xff09;工作的代理&#xff0c;能够对应用层协议…

# 利刃出鞘_Tomcat 核心原理解析(十)-- Tomcat 性能调优--2

利刃出鞘_Tomcat 核心原理解析&#xff08;十&#xff09;-- Tomcat 性能调优–2 二、Tomcat专题 - Tomcat性能调优 - 性能测试结果说明 1、压力性能测试 # 打开另一个终端&#xff0c;切换目录 [rootbogon ~]# cd /usr/local/tomcat# 进行压力性能测试[rootbogon tomcat]# …