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基于队列设置消息过期时间和单独针对消息设置过期…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...
