FreeRTOS入门教程(信号量的概念及API函数使用)
文章目录
- 前言
- 一、什么是信号量
- 二、信号量种类和对比
- 三、信号量和队列的区别
- 四、信号量相关的函数
- 1.创建函数
- 2.删除函数
- 3.获取和释放信号量函数
- 总结
前言
本篇文章正式带大家开始学习什么是信号量,并且掌握信号量函数的基本使用方法,并且将和队列进行一个对比。
一、什么是信号量
FreeRTOS 中的信号量是一种用于任务间同步和互斥的机制。它允许任务在临界区保护资源的访问、线程间通信以及任务之间的同步操作。信号量可以用来保护共享资源,限制对资源的并发访问,以及进行任务间的事件通知。
二、信号量种类和对比
FreeRTOS 提供了两种类型的信号量:二值信号量(Binary Semaphore)和计数型信号量(Counting Semaphore)。
二值信号量(Binary Semaphore):
二值信号量是最简单的一种信号量,它只能有两个状态:0 和 1。它常用于互斥访问共享资源的情况,如保护共享数据结构、保证一次只有一个任务执行临界区等。任务可以通过获取或释放二值信号量来请求或释放对共享资源的访问。
创建二值信号量使用 xSemaphoreCreateBinary 函数,并通过 xSemaphoreGive 和 xSemaphoreTake 函数来释放和获取信号量。
计数型信号量(Counting Semaphore):
计数型信号量可以有多个状态值,允许多个任务同时访问共享资源,可以用于控制资源的可用性。计数型信号量常用于限制任务的并发执行数量,或者用于任务间的生产者-消费者模型等场景。
创建计数型信号量使用 xSemaphoreCreateCounting 函数,并通过 xSemaphoreGive 和 xSemaphoreTake 函数来增加和减少信号量的计数值。
在使用信号量时,任务通过获取信号量来尝试占用资源,并在未能获取时阻塞等待。一旦资源可用或条件满足,任务释放信号量,让其他任务可以获取资源或继续执行。这样可以确保对共享资源的安全性和正确性。
需要注意的是,使用信号量时要小心处理同步和互斥问题,以避免竞态条件和死锁。此外,信号量的使用应该遵循良好的软件设计原则,以避免过度使用和滥用信号量。
二种信号量的对比:
1.功能:
二值信号量(Binary Semaphore):只有两个状态,0 和 1。主要用于互斥访问共享资源的情况,保护共享数据结构,限制对资源的并发访问。一般用于排它性操作,尽量保持资源独占一个任务操作。
计数型信号量(Counting Semaphore):可以有多个状态值,用于控制资源的可用性。可用于限制并发执行数量、任务间的生产者-消费者模型等场景。
2.创建和初始化:
二值信号量:可以使用 xSemaphoreCreateBinary 函数创建,并使用 xSemaphoreGive 进行初始化,调用 xSemaphoreTake 来获取信号量。
计数型信号量:可以使用 xSemaphoreCreateCounting 函数创建,并使用 xSemaphoreGive 进行初始化,调用 xSemaphoreTake 来获取信号量。
3.值的范围:
二值信号量:具有两个状态,0 和 1。只能通过 xSemaphoreGive 和 xSemaphoreTake 将其值从 0 切换到 1 或者从 1 切换到 0。
计数型信号量:具有更大的范围,可以从 0 到一个设定的最大数值之间进行计数。
4.使用场景:
二值信号量:适用于互斥访问共享资源的场景,例如保护共享数据结构、保证一次只有一个任务执行临界区等。
计数型信号量:适用于控制并发执行数量的场景,或者用于任务间的生产者-消费者模型等
三、信号量和队列的区别
1.功能:
信号量:信号量是一种用于任务间同步和互斥的机制。它可以用于保护共享资源、限制并发访问、控制任务的执行顺序等。信号量具有两种类型:二值信号量和计数型信号量。
队列:队列是一种用于任务间传递数据的机制。它允许任务按照先进先出(FIFO)的顺序共享数据。任务可以将数据发送到队列,并从队列接收数据。队列的长度限制了可以在其中排队的数据项的数量。
2.数据传输方式:
信号量:信号量一般用于同步和互斥,不直接传输数据。通过获取和释放信号量来控制任务对资源的访问。二值信号量和计数型信号量的获取和释放操作可以用来表示任务的事件和计数。
队列:队列用于任务间传递数据。任务通过发送和接收操作将数据项从一个任务传递到另一个任务。发送操作将数据项复制到队列中,接收操作将数据项从队列中复制到接收任务的缓冲区中。
3.数据复制:
信号量:信号量在任务间的数据共享过程中通常不涉及数据复制。它们通常用于任务间对资源的访问控制,而不是实际的数据传输。二值信号量和计数型信号量是通过操作信号量的计数值来控制任务的行为。
队列:队列在任务间传递数据时涉及数据的复制。发送任务向队列发送数据项时,数据项的副本将存储在队列中。接收任务从队列接收数据项时,队列将数据项的副本复制到接收任务的缓冲区中。
4.用途:
信号量:信号量在需要任务进行同步和互斥的场景下非常有用。例如,保护共享资源、控制并发访问、任务的事件通知等。
队列:队列在需要任务间传递数据的场景下非常有用。例如,实现生产者-消费者模型、任务间的消息传递、任务间的数据通信等。
综上所述,信号量主要用于同步和互斥,控制任务对资源的访问。它们不直接传输数据,而是控制任务的行为。队列则用于任务间传递数据,按照先进先出的顺序共享数据项。选择使用信号量还是队列取决于需求,如任务间的数据传输、共享资源的访问控制,以及任务的同步需求。
四、信号量相关的函数
1.创建函数
创建二值信号量函数:
xSemaphoreCreateBinary 函数原型:
SemaphoreHandle_t xSemaphoreCreateBinary( void );
参数:无
返回值:SemaphoreHandle_t,一个二值信号量的句柄。
创建计数信号量函数:
xSemaphoreCreateCounting 函数原型:
SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount );
参数:
uxMaxCount:信号量的最大计数值,即最多可以计数到多少。
uxInitialCount:信号量的初始计数值,通常为 0。
返回值:SemaphoreHandle_t,一个计数型信号量的句柄。
2.删除函数
void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );
参数:
xSemaphore:要删除的信号量的句柄。
要注意的是,删除一个信号量前,请确保没有任务正在等待该信号量,否则可能导致未定义的行为。在删除信号量之前,可以使用 uxSemaphoreGetCount 函数来获取当前信号量的计数值,以确保没有任务在等待。
3.获取和释放信号量函数
获取信号量函数:
xSemaphoreGive 函数原型:
BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );
参数:
xSemaphore:信号量的句柄。
返回值:如果成功释放信号量,则返回 pdPASS(1),否则返回 pdFAIL(0)。
中断中释放信号量函数:
xSemaphoreGiveFromISR 函数原型:
BaseType_t xSemaphoreGiveFromISR( SemaphoreHandle_t xSemaphore, BaseType_t *pxHigherPriorityTaskWoken );
xSemaphore:信号量的句柄。
pxHigherPriorityTaskWoken:一个指向 BaseType_t 类型的变量的指针,用于指示在 ISR 中调用时是否唤醒了更高优先级的任务。
返回值:如果成功释放信号量,则返回 pdPASS(1),否则返回 pdFAIL(0)。
xSemaphoreGive 函数原型:
BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );
参数:
xSemaphore:信号量的句柄。
返回值:如果成功释放信号量,则返回 pdPASS(1),否则返回 pdFAIL(0)。
总结
本篇文章主要讲解了信号量的概念及API函数使用,大家看完后可以做个总结,并进行对应的实验。
相关文章:
FreeRTOS入门教程(信号量的概念及API函数使用)
文章目录 前言一、什么是信号量二、信号量种类和对比三、信号量和队列的区别四、信号量相关的函数1.创建函数2.删除函数3.获取和释放信号量函数 总结 前言 本篇文章正式带大家开始学习什么是信号量,并且掌握信号量函数的基本使用方法,并且将和队列进行一…...
简易版Pycharm(2023)+Conda开发环境配置教程
困 扰 不知道为什么,自从Pycharm更新了新的版本以后,在Pycharm中为项目工程配置Python解释器环境时,总是不能像以前那么方便的配置。 比如,当前Conda中有十个不同的开发环境,每个环境一个名称,比如&#x…...
深入浅出,SpringBoot整合Quartz实现定时任务与Redis健康检测(二)
前言 在上一篇深入浅出,SpringBoot整合Quartz实现定时任务与Redis健康检测(一)_往事如烟隔多年的博客-CSDN博客 文章中对SpringBoot整合Quartz做了初步的介绍以及提供了一个基本的使用例子,因为实际各自的需求任务不尽相同因此并…...
小谈设计模式(22)—单例模式
小谈设计模式(22)—单例模式 专栏介绍专栏地址专栏介绍 单例模式点睛所在优缺点分析优点确保只有一个实例全局访问点节省资源线程安全 缺点难以扩展对象的生命周期单一职责原则隐藏依赖关系 Java程序实例实例a分析实例b,更安全分析优化 ——“…...
华为OD机考算法题:分班
题目部分 题目分班难度易题目说明幼儿园两个班的小朋友在排队时混在了一起,每位小朋友都知道自己是否与前面一位小朋友是否同班,请你帮忙把同班的小朋友找出来。 小朋友的编号为整数,与前一位小朋友同班用 Y 表示,不同班用 N 表示…...
【gcc】RtpTransportControllerSend学习笔记 3:gcc
本文是大神 https://www.cnblogs.com/ishen 的文章的学习笔记。大神的webrtc源码分析(8)-拥塞控制(上)-码率预估 详尽而具体,堪称神作。本文使用的代码是m79 ,与大神有不同。2.4 Probe只会在一些特殊的时候才会进行探测(链路刚开始时, 码率不正常暴跌时)2.5 : 对发送的吞吐量…...
CSP-J第二轮试题-2019年-3题
文章目录 参考:总结 [CSP-J2019] 纪念品题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示答案 现场真题注意事项 参考: P5662 CSP-J2019纪念品 总结 本系列为CSP-J/S算法竞赛真题讲解,会按照年…...
数据库:Hive转Presto(三)
继续上节代码。 import re import os import tkinter.filedialog from tkinter import *class Hive2Presto:def __int__(self):self.t_funcs [substr, nvl, substring, unix_timestamp] \[to_date, concat, sum, avg, abs, year, month, ceiling, floor]self.time_funcs [d…...
【AI视野·今日Robot 机器人论文速览 第四十八期】Thu, 5 Oct 2023
AI视野今日CS.Robotics 机器人学论文速览 Thu, 5 Oct 2023 Totally 32 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers LanguageMPC: Large Language Models as Decision Makers for Autonomous Driving Authors Hao Sha, Yao Mu, Yuxuan Jiang, Li…...
学信息系统项目管理师第4版系列20_风险管理
1. 针对不确定性的应对方法 1.1. 【高23上选58】 1.2. 收集信息 1.2.1. 可以对信息收集和分析工作进行规划,以便发现更多信息(如进行研究、争取专家参与或进行市场分析)来减少不确定性 1.3. 为多种结果做好准备 1.3.1. 制定可用的解决方…...
卷积神经网络的发展历史-VGG
VGG的产生 2014 年,Simonyan和Zisserman提出了VGG系列模型(包括VGG-11/VGG-13/VGG-16/VGG-19),并在当年的ImageNet Challenge上作为分类任务第二名、定位(Localization)任务第一名的基础网络出现。 VGG的…...
qt解决信号和槽连接时传递额外参数的问题
解决信号和槽连接时传递额外参数的问题 QSignalMapper 是 Qt 框架中的一个类,用于解决信号和槽连接时传递额外参数的问题。当一个信号被触发时,QSignalMapper 可以将该信号与一个特定的参数关联起来,并将信号与对应的槽函数进行连接。 下面…...
『力扣每日一题14』:消失的数字
昨天忙过头,等想起来已经 12 点多了,于是乎断更了。在这里先跟广大读者说声抱歉,并且稍后我会再更一篇。 一、题目 数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&…...
【b站韩顺平 快速学Java课】Java的JDK8(包括公共JRE8)安装教程 总结
最近开始学Java,如果是程序员的话要使用Java——需要安装JDK。 不同操作系统(Win/Linux/Mac)——需要安装不同的JDK。 1.JDK安装官网链接: Java Downloads | Oracle 我的电脑是win x64,以下笔记总结就暂且以本人电脑操作系统版本…...
Spark 弹性分布式数据集 RDD
1.RDD简介 `RDD` 全称为 Resilient Distributed Datasets,是 Spark 最基本的数据抽象,它是只读的、分区记录的集合,支持并行操作,可以由外部数据集或其他 RDD 转换而来,它具有以下特性: 一个 RDD 由一个或者多个分区(Partitions)组成。对于 RDD 来说,每个分区会被一个…...
电脑被删除的文件怎么恢复?2023年数据恢复方法分享
大多数人在使用电脑时都可能会遇到误删文件的情况。一不小心,重要的文件或数据就消失了,情急之下,大多会感到慌乱和无助。但其实,文件误删除并非不可挽回的灾难。本文将为大家介绍几种有效的文件恢复方法,以帮助大家在…...
李宏毅 2022机器学习 HW3 boss baseline 上分记录
作业数据是所有数据都有标签的版本。 李宏毅 2022机器学习 HW3 boss baseline 上分记录 1. 训练数据增强2. cross validation&ensemble3. test dataset augmentation4. resnet 1. 训练数据增强 结论:训练数据增强、更长时间的训练、dropout都证明很有效果&…...
SpringBatch适配不同数据库的两种方法
一、配置JobRepository Configuration EnableBatchProcessing public class TaskArrangeConfig extends DefaultBatchConfigurer {Autowiredprivate DataSource dataSource;Autowiredprivate JobLauncher jobLauncher;Autowiredprivate JobExplorer jobExplorer;Autowiredpriv…...
【ARM CoreLink 系列 5 -- CI-700 控制器介绍 】
文章目录 1.1 什么是 CI-700?1.1.1 关于 CI-7001.1.2 CI-700 特点1.2 全局配置参数1.2.1 寻址能力1.3 组件和配置1.3.1 CI-700 互联的结构1.3.2 Crosspoint(XP)1.3.3 外部接口1.4 组件(Components)1.1 什么是 CI-700? CI-700是一种AMBA 5 CHI互连,具有可定制的网状拓扑结构…...
找不到msvcp140_1.dll怎么办,快速解决msvcp140_1.dll问题的方法分享
在日常使用计算机的过程中,经常会遇到一些程序无法正常运行的问题,其中最常见的就是“msvcp140_1.dll丢失”。这是一个典型的DLL文件丢失问题,但背后的原因却往往并不简单。通过深入研究这个问题,我对其有了更深入的理解。 首先&a…...
华为云云耀云服务器L实例评测|部署私有网盘 Nextcloud
华为云云耀云服务器L实例评测|部署私有网盘 Nextcloud 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 产品规格1.3 应用场景 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Nextcloud3.1 Nextcloud 介绍3.2 Docker 环境搭建3.3 Nex…...
vue3中使用插件vite-plugin-svg-icons
在vue3 vite 项目中使用svg图标 插件:vite-plugin-svg-icons 预加载 在项目运行时就生成所有图标,只需操作一次 dom高性能 内置缓存,仅当文件被修改时才会重新生成 安装 yarn add vite-plugin-svg-icons -D # or npm i vite-plugin-svg-icons -D # or pnpm inst…...
面试题20231008
前端 2023年前端面试题汇总-CSDN博客 后端 1.Java基础 容器、线程等等 a.JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。 JRE:Java Runtime Envir…...
2023全新小红书图集和视频解析去水印网站源码
2023全新小红书图集和视频解析去水印网站源码 小红书视频图集解析网站源码,在红书看到好看的图片以及好看的头像,但是直接下载又有水印就非常难受,这个可以一键解析去除水印,支持统计解析次数,本地接口。 源码下载&a…...
2023去水印小程序源码修复版-前端后端内置接口+第三方接口
去水印小程序源码,前端后端,内置接口第三方接口,修复数据库账号密码错误问题,内置接口支持替换第三方接口,看了一下文件挺全的,可以添加流量主代码,搭建需要准备一台服务器,备案域名…...
鸿蒙手表开发之使用adb命令安装线上包
#国庆发生的那些事儿# 鸿蒙手表开发之使用adb命令安装线上包 前言: 由于之前的哥们匆忙离职了,所以鸿蒙手表项目的新版本我临时接过来打包发布,基本上之前没有啥鸿蒙经验,但是一直是做Android开发的,在工作人员的指…...
华为OD机试 - 计算最大乘积(2022Q4 100分)
目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…...
安卓RecycleView包含SeekBar点击列表底部圆形阴影处理
seekbar在列表中点击底部圆形阴影禁止显示方法 大家好,最近写了自定义的seekbar实现显示进度值,然而呢,我的seekbar控件是作为recycleview的item来使用的,我设置了禁止点击和滑动方法如下: seekBar.setOnTouchListene…...
计算机视觉中的可解释性分析
计算机视觉中的可解释性分析是指通过不同的方法和技术来解释和理解深度学习模型对图像或视频数据的预测和决策过程。这是一个非常重要的领域,因为深度学习模型通常被认为是“黑盒子”,很难理解其内部工作原理。可解释性分析的目标是提供对模型决策的更好…...
Python 爬虫报错分析
在使用requests库进行网络连接时出现了 ConnectionError: (Connection aborted., RemoteDisconnected(Remote end closed connection without response)) 这个错误。这个错误通常发生在以下几种情况: 目标服务器无法访问:可能由于服务器宕机、网络故障…...
建设银行网站怎么查开户行/厦门seo优
一:队列的三种模式 先进先出(FIFO) class queue.Queue(maxsize)后进先出(LIFO) class queue.LifoQueue(maxsize)优先级顺序(优先级低的先进先出) class queue.PriorityQueue(maxsize)二…...
有没有专门做翻译的网站/最近的重要新闻
原文地址:http://jason61719.blog.163.com/blog/static/11417604120106325114274/ 一、Eclipse,MyEclipse安装插件方法大全(dropins) 使用eclipse,最看重的还是它的插件数量比较多,使用起来比较方便,但是大多数人对eclipse的插件…...
电子网站怎么做/合肥seo推广公司
http://www.data-compression.com/index.shtml 转载于:https://www.cnblogs.com/gaozehua/articles/2291611.html...
与狗做网站/企业微信管理系统
Windows下如何使用CMD命令打开进入MySQL数据库?1.打开【开始】》【运行】输入【cmd】单击【确定】后出现CMD命令黑色窗口,这就是我们说的CMD命令行,或者使用快捷键Windows键(在键盘上有个Windows标志的按键)R输入cmd后回车。2.在CMD命令窗口敲入命令mys…...
做蛋糕网站的 实训报告图/营销推广的工具有哪些
memcached安装存档日期:2019年5月15日 | 首次出版:2009年9月15日 在由两部分组成的关于Memcached和Grails的上半部分的前半部分中,作者James Goodwill向您介绍了开源缓存解决方案memcached。 本文涵盖的主题包括安装,配置&#x…...
wordpress wp2pcs sy/关键词怎么做快速的有排名
Kotlin中的序列一、前言二、filter、map、flatMap、Sequence一、前言 Kotlin里面的集合式api和Java类似,但也有区别,Kotlin里面加入了可变和不可变的特性,例如可变集合MutableList,不可变的则是List,这部分的功能主要…...