FreeRTOS信号量 | FreeRTOS十
目录
说明:
一、信号量
1.1、信号量简介
1.2、信号量特点
二、二值信号量
2.1、二值信号量简介
2.2、获取与释放二值信号量函数
2.3、二值信号量使用过程与相关API函数
2.4、创建二值信号量函数了解
2.5、释放二值信号量了解
2.6、获取二值信号量了解
三、计数型信号量
3.1、计数型信号量简介
3.2、计数型信号量适用场合
3.3、创建计数型信号量函数
3.4、获取信号量当前数值大小函数
3.5、计数型信号量释放与获取
四、优先级翻转
4.1、什么是优先级翻转
4.2、优先级翻转出现原因
4.3、解决优先级翻转
五、互斥信号量
5.1、什么是互斥信号量
5.2、什么是优先级继承
说明:
关于内容:
1)以下内容多为概念了解与步骤分析
2)暂无个人示例代码,使用的是FreeRTOS的官方示例代码
3)若想移植代码测试的,请移步其它地方寻找,下文内容暂无个人示例代码供测试
关于其它:
1)操作系统:win 10
2)平台:keil 5 mdk
3)语言:c语言
4)板子:STM32系列移植FreeRTOS
一、信号量
1.1、信号量简介
1)信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问。
2)信号量资源数表示共享资源的数量(称为计数值,计数值大于0表示有信号量资源)
3)释放信号量表示让出共享资源,计数值+1(因为共享资源空位多了)
4)获取信号量表示占用共享资源,计数值-1(因为共享资源空位少了)
5)信号量的计算值有限制:限定最大值,当限定最大值为1-->它就是二值信号量;让最大值不是1-->它就是计数型信号量
1.2、信号量特点
1)仅存放计数值,无法存放其它数据;创建信号量,只需分配信号量结构体
2)释放信号量时,不可阻塞,计数值+1,当计数值最大值时,返回失败
3)获取信号量,计数值-1,当没有资源时,可以阻塞
二、二值信号量
2.1、二值信号量简介
1)二值信号量本质是一个队列长度为1的队列,故该队列只存在空或满两种情况,这就是二值的意思
2)二值信号量通常用于互斥访问或任务同步,与互斥信号量相似,但二值信号量可能导致优先级翻转问题,故二值信号量多用于任务同步
2.2、获取与释放二值信号量函数
1)释放二值信号量函数:xSemaphoreGive(任务中),xSemaphoreGiveFromISR(中断中)
2)获取二值信号量函数:xSemaphoreTake(任务中),xSemaphoreTakeFromISR(中断中)
3)Give相当于把标志置“满”-->相当于1,Take相当于把标志置“空”-->相当于0
2.3、二值信号量使用过程与相关API函数
1)首先创建二值信号量-->释放二值信号量-->获取二值信号
2)相关API函数,如下图1:

图1
2.4、创建二值信号量函数了解
函数名称:SemaphoreHandle_t xSemaphoreCreateBinary(void)
或使用创建队列函数,代入不同参数即可,如下图2:

图2
返回值:
返回值为,NULL,表示:创建失败
返回值为,其他值,表示:创建成功返回二值信号的句柄
2.5、释放二值信号量了解
函数名称:BaseType_t xSemaphoreGive(xSemaphore)
参数:
xSemaphore,含义:要获取的信号量句柄
2.6、获取二值信号量了解
函数名称:BaseType_t xSemaphoreTake( xSemaphore,xBlockTime)
参数:
xSemaphore,含义:要获取的信号量句柄
xBlockTime,含义:阻塞时间
返回值:
pdTRUE,含义:获取信号量成功
pdFALSE,含义:超时,获取信号量失败
三、计数型信号量
3.1、计数型信号量简介
计数型信号量相当于队列长度大于1的队列,因此计数型信号量能够容纳多个资源,这在计数型信号量被创建的时候确定的。
3.2、计数型信号量适用场合
1)事件计数:当每次事件发生后,在事件处理函数释放计数型信号量(计数值+1),其他任务会获取计数型信号量(计数值-1),这种场合一般在创建时将初始值设置为0;
2)资源管理:信号量表示有效的资源数目,任务必须先获取信号量(信号量计数值-1),才能获得资源控制权,当计数值为0时表示没有可用资源,当任务使用完资源后,必须释放信号量(计数值+1)。信号量创建时计数值应大于最大资源数目。
3.3、创建计数型信号量函数
函数名称:xSemaphoreCreateCounting(uxMaxCount, uxlnitalCount)
3.4、获取信号量当前数值大小函数
函数名称:xSemaphoreGetCount(xSemaphore)
3.5、计数型信号量释放与获取
同二值信号量,不在说明。
四、优先级翻转
4.1、什么是优先级翻转
高优先级的任务反而慢执行,低优先级的任务先执行。优先级翻转在强占式内核中是很常见的,但在实时操作系统中是不允许被出现优先级翻转的,因为优先级翻转会破坏任务的预期允许顺序,可能导致未知的严重后果。
4.2、优先级翻转出现原因
1)假设存在三个任务A,B,C,任务A优先级最高(在ABC任务中,下同),任务B优先级中间,任务C优先级最低;任务A和任务C都是对二值信号量进行申请的;任务B执行其他功能(例如打印信息)
2)任务C先被创建,故C先运行(此时任务A刚刚就绪,此时任务B未就绪),任务A也申请二值信号量,但此时任务C已占用,任务A申请不到,只能被阻塞进行等待;此时任务B就绪了,因为任务B不申请二值信号量,且优先级高于任务C,所以任务B抢占了任务C;此时就会出现,任务A优先级>任务B优先级,但任务B却先运行的情况;
3)高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度。但其他中等优先级的任务却能抢到CPU资源。从现象看,就像是中优先级的任务比高优先级任务具有更高的优先级。
4.3、解决优先级翻转
1)优先级继承(互斥信号量)
2)优先级天花板
五、互斥信号量
5.1、什么是互斥信号量
互斥信号量其实就是一个拥有优先级继承二值信号量,在同步的应用中二值信号量最合适。互斥信号量适用于那些需要互斥访问的应用中。
5.2、什么是优先级继承
当一个互斥信号量正在被一个低优先级的任务持有时,如果此时有个高优先级的任务也尝试获取这个互斥信号量,那么这个高优先级的任务就会被阻塞。不过这个高优先级的任务将会将优先级的提升到与自己相同的优先级。
注意点:
1)互斥信号量不能用于中断服务函数中,原因:1、互斥信号量有任务优先级继承的机制,但是中断不是任务,没有任务优先级,所以互斥信号量只能用于任务中,不能用于中断服务函数中;2、中断服务函数不能因为要等待互斥信号量而设置阻塞时间进入阻塞态
2)创建互斥信号量时,会主动释放一次信号量。
相关文章:
FreeRTOS信号量 | FreeRTOS十
目录 说明: 一、信号量 1.1、信号量简介 1.2、信号量特点 二、二值信号量 2.1、二值信号量简介 2.2、获取与释放二值信号量函数 2.3、二值信号量使用过程与相关API函数 2.4、创建二值信号量函数了解 2.5、释放二值信号量了解 2.6、获取二值信号量了解 三…...
【SpringBoot】SpringBoot常用注解
一、前言首先这里说的SpringBoot常用注解是指在我们开发项目过程中,我们经常使用的注解,包含Spring、SpringBoot、SpringCloud、SpringMVC等这些框架中的注解,而不仅仅是SpringBoot中的注解。这里只是作一个注解列举,每个注解具体…...
数据一致性
目录一、AOP 动态代理切入方法(1) Aspect Oriented Programming(2) 切入点表达式二、SpringBoot 项目扫描类(1) ResourceLoader 扫描类(2) Map 的 computeIfAbsent 方法(3) 反射几个常用 api① 创建一个测试注解② 创建测试 PO 类③ 反射 api 获取指定类的指定注解信息(4) 返回…...
Docker不做虚拟化内核,对.NET有什么影响?
引子前两天刷抖音,看见了这样一个问题。问题:容器化不做虚拟内核,会有什么弊端?Java很多方法会跟CPU的核数有关,这个时候调用系统函数,读到的是宿主机信息,而不是我们限制资源的大小。思考&…...
HTML总结
CSS代码风格 空格规范: 1. 属性值前面,冒号后面,保留一个空格; 2. 选择器(标签)和大括号中间保留空格。 基本语法概述: 1.HTML标签是由尖括号包围的关键词,如<html> 2.HTM…...
ByteHouse:基于ClickHouse的实时数仓能力升级解读
更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 ByteHouse是火山引擎上的一款云原生数据仓库,为用户带来极速分析体验,能够支撑实时数据分析和海量数据离线分析。便捷的弹性扩缩容能力&…...
[SSD固态硬盘技术 15] FTL映射表的神秘面纱
为什么需要映射表?固态硬盘的存储器件采用的是闪存[5],具有以下几个特点: (1)读写基本单位是以页(Page)为单位,擦除是以块(Block)为单位。...
浅析依赖注入框架的生命周期(以 InversifyJS 为例)
在上一篇介绍了 VSCode 的依赖注入设计,并且实现了一个简单的 IOC 框架。但是距离成为一个生产环境可用的框架还差的很远。 行业内已经有许多非常优秀的开源 IOC 框架,它们划分了更为清晰地模块来应对复杂情况下依赖注入运行的正确性。 这里我将以 Inv…...
HER2靶向药物研发进展-销售数据-上市药品前景分析
HER2长期作为肿瘤领域的热门靶点之一,其原因是它在多部位、多种形式的癌症中均有异常的表达,据研究表明HER2除了在胃癌、胆道癌、胆管癌、乳腺癌、卵巢癌、结肠癌、膀胱癌、肺癌、子宫颈癌、子宫浆液性子宫内膜癌、头颈癌、食道癌中的异常表达还存在于多…...
【第38天】不同路径数问题 | 网格 dp 入门
本文已收录于专栏🌸《Java入门一百例》🌸学习指引序、专栏前言一、网格模型二、【例题1】1、题目描述2、解题思路3、模板代码4、代码解析5.原题链接三、【例题2】1、题目描述2、解题思路3、模板代码4、代码解析5.原题链接三、推荐专栏四、课后习题序、专…...
LINUX之链接命令
链接命令学习目标能够说出软链接的创建方式能够说出硬链接的创建方式1. 链接命令的介绍链接命令是创建链接文件,链接文件分为:软链接硬链接命令说明ln -s创建软链接ln创建硬链接2. 软链接类似于Windows下的快捷方式,当一个源文件的目录层级比较深&#x…...
1628_MIT 6.828 xv6_chapter0操作系统接口
全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 这本书最初看名字以为是对早期unix的一个解读,但是看了开篇发现 不完全是,只是针对JOS教学OS系统来做的一些讲解。 Xv6是对UNIX v6的重新实…...
使用 Sahi 实现 Web 自动化测试
Sahi 是 Tyto Software 旗下的一个基于业务的开源 Web 应用自动化测试工具。Sahi 运行为一个代理服务器,并通过注入 JavaScript 来访问 Web 页面中的元素。Sahi 支持 HTTPS 并且独立于 Web 站点,简单小巧却功能强大。它相对于 Selenium 等自动化测试工具…...
天津菲图尼克科技携洁净及无菌防护服解决方案与您相约2023生物发酵展
BIO CHINA 生物发酵产业一年一度行业盛会,由中国生物发酵产业协会主办,上海信世展览服务有限公司承办,2023第10届国际生物发酵产品与技术装备展览会(济南)于2023年3月30-4月1日在山东国际会展中心(济南市槐…...
Java 网络编程详解
1、什么是网络编程 在网络通信协议下,不同计算机上运行的程序,可以进行数据传输。 应用场景: 1、即时通信 2、网游对战 3、邮件等等 Java中可以使用java.net包下的技术轻松开发出常见的网络应用程序 2、网络编程三要素 2.1 IP地址 要…...
Scratch少儿编程案例-几何形式贪吃蛇
专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...
一定要收藏的面试思维导图,粉丝分享面试经验
一位粉丝分享面试经验:1.常见面试题有哪些?主要从以下一些知识点做了准备: 常用的分析方法、Excel、SQL、 A/B测试、产品分析。然后每份面试针对职位要求,还有前期和HR聊天一点点了解这个职位之后,定向准备。 Excel、S…...
【博客615】通过systemd设置cgroup来限制服务资源争抢
通过systemd设置cgroup来限制服务资源争抢 1、场景 我们的宿主机上通常会用systemctl来管理一些agent服务,此时我们需要限制服务的cpu,memory等资源用量,以防止服务之前互相争抢资源,导致某些核心agent运行异常 2、systemd与cgro…...
C语言经典编程题100例(21-40)
21、练习3-2 计算符号函数的值对于任一整数n,符号函数sign(n)的定义如下:请编写程序计算该函数对任一输入整数的值。输入格式:输入在一行中给出整数n。输出格式:在一行中按照格式“sign(n) 函数值”输出该整数n对应的函数值。输入样例1:10输出样例1:sig…...
Rabbitmq业务难点
Rabbitmq业务难点1.消息生产者发送的消息无法路由到任何一个队列怎么处理?2.聊聊Rabbitmq的七种工作模式3.Rabbitmq的消息确认机制4.Rabbitmq的消息持久化5.发布确认模式如何确保生产者能够成功将消息投递到消息队列6. Rabbitmq基于队列设置消息过期时间和单独针对消息设置过期…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
