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…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...