FreeRTOS信号量 | FreeRTOS十

news2024/11/6 1:19:01

目录

说明:

一、信号量

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)创建互斥信号量时,会主动释放一次信号量。

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

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

相关文章

Python语言零基础入门教程(十三)

Python 字典(Dictionary) 字典是另一种可变容器模型,且可存储任意类型对象。 字典的每个键值 key:value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示: d {key1 : value1, key2 : …

企业进存销管理系统

技术:Java、JSP等摘要:随着当今世界计算机技术的飞速发展,计算机在企业管理中应用的普及,利用计算机实现企业进销存管理势在必行。本系统结合公司实际的进销存制度,通过对本公司的供应商、客户、商品、进货、销售、进销…

分享77个JS菜单导航,总有一款适合您

分享77个JS菜单导航,总有一款适合您 77个JS菜单导航下载链接:https://pan.baidu.com/s/1e_384_1KC2oSTDy7AaD3og?pwdzkw6 提取码:zkw6 Python采集代码下载链接:https://wwgn.lanzoul.com/iKGwb0kye3wj class ChinaZJsSeleni…

大型医院分诊系统源码 排队叫号系统源码 C#源码

医院排队分诊叫号系统用于医院各门诊科室,实现分诊、排队叫号、显示叫号、刷卡签到等功能。可有效地解决病人就诊时排队无序、医生工作量不平衡、就诊环境嘈杂等问题。 医院分诊叫号系统由分诊管理端、大屏显示端、医生呼叫端三大模块组成。 开发环境:…

第01章_数据库概述

第01章_数据库概述 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. 为什么要使用数据库 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#x…

4年外包终上岸,我只能说这类公司能不去就不去..

我大学学的是计算机专业,毕业的时候,对于找工作比较迷茫,也不知道当时怎么想的,一头就扎进了一家外包公司,一干就是4年。现在终于跳槽到了互联网公司了,我想说的是,但凡有点机会,千万…

SpringBoot 全局异常处理用法及原理

SpringBoot 全局异常处理用法及原理 Springboot或springMVC项目中, 我们一般会设置一个全局异常处理, 来对异常进行兜底。 业务代码执行过程中抛出的异常, 如果业务逻辑没有主动捕获,那么异常就会一直往上抛,最后进入…

RockChip MPP编码

概述瑞芯微提供的媒体处理软件平台(Media Process Platform,简称 MPP)是适用于瑞芯微芯片系列的通用媒体处理软件平台。该平台对应用软件屏蔽了芯片相关的复杂底层处理,其目的是为了屏蔽不同芯片的差异,为使用者提供统…

使用java开发连连看游戏

技术:Java等摘要:社会在发展,人类在进步,生活质量保证之余,各种游戏蜂拥而起,越来越受到各界人士的追捧,比如老少适宜的斗地主,深受广大女性喜欢的节奏大师,受高智商人群…

Pandas——Series操作【建议收藏】

pandas——Series操作 作者:AOAIYI 创作不易,觉得文章不错或能帮助到你学习,可以点赞收藏评论哦 文章目录pandas——Series操作一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.创建Series2.从具体位置的Series中访问数据3.使…

FyListen——生命周期监听器(设计原理之理解生命周期)

FyListen——生命周期监听器(设计原理之理解生命周期) FyListen 的核心原理有两个: 通过子Fragment对Activity、Fragment进行生命周期监听Java8 接口特性 default 1. 什么是上下文Context 这是一个装饰器模式, ContextImpl 是 …

【ChatGPT说】我想给大家【编】一个故事,故事的主人公叫【架构师李肯】,故事的开头,还得从他那年买房说起。。。

大家好啊,我就是那个【天涯何处无知己,人穷陌路勿担忧】的架构师李肯! 架构师李肯(全网同名) 在深圳白手起家,毕业不到4年实现一线城市核心地段的安家梦,从0开始谱写励志人生!一个专…

一文手把手教你写一个 Makefile 文件

如果我们是在Linux下开发,那Makefile肯定要知道,不懂Makefile,面对较大的工程项目的时候就会比较麻烦,懂得利用开发工具将会大大提高我们的开发效率,也可以说Makefile是必须掌握的一项技能。 一、了解什么是 Makefile…

java集合框架内容整理

主要内容集合框架体系ArrayListLinkedListHashSetTreeSetLinkedHashSet内部比较器和外部比较器哈希表的原理List集合List集合的主要实现类有ArrayList和LinkedList,分别是数据结构中顺序表和链表的实现。另外还包括栈和队列的实现类:Deque和Queue。• Li…

steam/csgo搬砖项目真能月入过万吗?到底真的假的?

提前说明,这是正经、真实、官方渠道的兼职赚钱方式,不需要学历、不需要人脉,只要你认真学,每天花1-2个小时空闲时间动动手指,日赚300-1000问题不大! 搬砖是从国外steam市场置办游戏装备回来,在…

javassm运列车物资进销存及领用管理系统

主要对个人中心、生产部管理、财务部管理、库房部管理、用户管理、车型分类管理、线路信息管理、列车信息管理、物资分类管理、物资信息管理、储备定额管理、物资入库管理、物资申请管理、入库记录管理的实现。 本系统设计的现状和趋势,从需求、结构、数据库等方面的…

五、Git本地仓库基本操作——分支管理

1. 什么是分支? master分支 我们在初始化git仓库的时候,会默认创建一个master分支,HEAD指针这时就会默认执行master分支。当我们在master分支提交(commit)了更新之后,master分支就会指向当前当前最新的co…

微搭中如何实现弹性布局

我们在实际开发中经常可能会有一些社交的场景,比如开发一个类似朋友圈九宫格图片展示的功能。因为图片的数量不确定,所以需要实现图片的从左到右顺序排列。 在微搭中可以以可视化的方式设置样式。但是对于我们这类特殊需求,只用可视化设置显…

【SSL/TLS】准备工作:HTTPS服务器部署:Nginx部署

HTTPS服务器部署:Nginx部署1. 准备工作2. Nginx服务器YUM部署2.1 直接安装2.2 验证3. Nginx服务器源码部署3.1 下载源码包3.2 部署过程4. Nginx基本操作4.1 nginx常用命令行4.2 nginx重要目录1. 准备工作 1. Linux版本 [rootlocalhost ~]# cat /proc/version Li…

【宝塔部署PHP项目】含域名访问部署、IP访问部署、数据库、端口号、Nginx等知识

一定要弄懂项目部署的方方面面。当服务器上部署的项目过多时,端口号什么时候该放行、什么时候才会发生冲突?多个项目使用redis怎么防止覆盖?Nginx的配置会不会产生站点冲突?二级域名如何合理配置?空闲的时候要自己用服…