十五、FreeRTOS之FreeRTOS信号量

news2025/1/23 3:57:51

本节需要掌握以下内容:

1,信号量的简介(了解)

2,二值信号量(熟悉)

3,二值信号量实验(掌握)

4,计数型信号量(熟悉)

5,计数型信号量实验(掌握)

6,优先级翻转简介(熟悉)

7,优先级翻转实验(掌握)

8,互斥信号量(熟悉)

9,互斥信号量实验(掌握)

一、信号量的简介(了解)

1.1 信号量的概念

信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问

举个栗子:假设有一个人需要在停车场停车。

1、首先判断停车场是否还有空车位(判断信号量是否有资源);

2、停车场正好又空位(信号量又资源),那么就可以直接将车开入空位进行停车(获取信号量成功);

3、停车场已经没有空位了(信号量没有资源),那么这个人可以选择不停车(获取信号量失败);也可以选择等待(任务阻塞)其他人将车开出停车场(释放信号量资源),然后再将车停入空车位。

 空车位                :   信号量资源数(计数值)

让出占用车位      :   释放信号量(计数值++

占用车位             :    获取信号量(计数值 --

 当数值大于0,代表有信号量资源

当释放信号量,信号量计数值(资源数)加一

当获取信号量,信号量计数值(资源数)减一

信号量:用于传递状态

信号量的计数值都有限制:限定最大值。

如果最大值被限定为1,那么它就是二值信号量;

如果最大值不是1,那么它就是计数型信号量。

1.2 队列与信号量的对比

队列

信号量

可以容纳多个数据;

创建队列有两部分内存:队列结构体+队列项存储空间

仅存放计数值,无法存放其他数据;

创建信号量,只需分配信号量结构体

写入队列:当队列满时,可阻塞;

释放信号量:不可阻塞,计数值++

当计数值为最大值时,返回失败

读取队列:当队列为空时,可阻塞;

获取信号量:计数值--

当没有资源时,可阻塞

二、二值信号量(熟悉)

2.1 二值信号量相关概念

二值信号量的本质是一个队列长度为1的队列,该队列就只有空 和 满两种情况,这就是二值。

二值信号量通常用于互斥访问或者任务同步,与互斥信号量比较类似,但是二值信号量可能会导致优先级翻转的问题,所以二值信号量更适合用于同步!

2.2 二值信号量相关API函数(熟悉)

使用二值信号量的过程:创建二值信号量->释放二值信号量->获取二值信号量

函数

描述

xSemaphoreCreateBinary()

使用动态方式创建二值信号量

xSemaphoreCreateBinaryStatic()

使用静态方式创建二值信号量

xSemaphoreGive()

释放信号量

xSemaphoreGiveFromISR()

在中断中释放信号量

xSemaphoreTake()

获取信号量

xSemaphoreTakeFromISR()

在中断中获取信号量

创建方式仅介绍动态创建的方式。

2.2.1  创建二值信号量函数:SemaphoreHandle_t   xSemaphoreCreateBinary( void )

返回值

描述

NULL

创建失败

其他值

创建成功返回二值信号量的句柄

2.2.2 释放二值信号量函数:BaseType_t   xSemaphoreGive( xSemaphore )  

形参

描述

xSemaphore

要释放的信号量句柄

返回值

描述

pdPASS

释放信号量成功

errQUEUE_FULL

释放信号量失败

2.2.3 获取二值信号量函数:BaseType_t   xSemaphoreTake( xSemaphore, xBlockTime )   

形参

描述

xSemaphore

要获取的信号量句柄

xBlockTime

阻塞时间

返回值

描述

pdTRUE

获取信号量成功

pdFALSE

超时,获取信号量失败

 三、二值信号量实验(掌握)

3.1、实验目的:

学习 FreeRTOS 的二值信号量相关API函数的使用

3.2、实验设计:

将设计三个任务:start_task、task1、task2

三个任务的功能如下:

  • start_task:用来创建task1和task2任务
  • task1:用于按键扫描,当检测到按键KEY0被按下时,释放二值信号量
  • task2:获取二值信号量,当成功获取后打印提示信息

3.3 实验代码

demo.c

 空格不够了,明日再更!

四、计数型信号量(熟悉)

4.1 计数型信号量相关概念

计数型信号量相当于队列长度大于1的队列,因此计数型信号量能够容纳多个资源,这在计数型信号量被创建的时候确定的。

 计数型信号量适用场合:

事件计数:当每次事件发生后,在事件处理函数中释放技术型信号量(计数值+1),其它任务会获取计数型信号量(计数值-1),这种场合一般在创建时将初始计数值设置为0

资源管理:信号量表示有效的资源数目。任务必须先获取信号量(信号量计数值-1),才能获取资源控制权。当计数值减为零时表示没有资源。当任务使用完资源后,必须释放信号量(信号量计数值+1)。信号量创建时计数值应等于最大资源数目。

4.2 使用计数型信号量相关API函数(熟悉)

 使用计数型信号量的过程:创建计数型信号量->释放信号量->获取信号量

函数

描述

xSemaphoreCreateCounting()

使用动态方法创建计数型信号量。

xSemaphoreCreateCountingStatic()

使用静态方法创建计数型信号量

uxSemaphoreGetCount()

获取信号量的计数值

 计数型信号量的释放和获取与二值信号量相同 !此处也仅介绍动态方法创建计数型信号量。

4.2.1 计数型信号量创建API函数
#define   xSemaphoreCreateCountinguxMaxCount  uxInitialCount  )     \
 
xQueueCreateCountingSemaphore( (  uxMaxCount  ) , (  uxInitialCount  ) )

此函数用于创建一个计数型信号量 。 

形参

描述

uxMaxCount

计数值的最大值限定

uxInitialCount

计数值的初始值

返回值

描述

NULL

创建失败

其他值

创建成功返回计数型信号量的句柄 

 4.2.2 获取信号量的计数值
#define   uxSemaphoreGetCount( xSemaphore )   \
 
uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) )

此函数用于获取信号量当前计数值大小

形参

描述

xSemaphore

信号量句柄

返回值

描述

整数

当前信号量的计数值大小

 五、计数型信号量实验(掌握)

5.1、实验目的:

学习 FreeRTOS 的计数型信号量相关API函数的使用

5.2、实验设计:

将设计三个任务:start_task、task1、task2

三个任务的功能如下:

  • start_task:用来创建task1和task2任务
  • task1:用于按键扫描,当检测到按键KEY0被按下时,释放计数型信号量
  • task2:每过一秒获取一次计数型信号量,当成功获取后打印信号量计数值

5.3 实验代码

demo.c

六、优先级翻转简介(熟悉)

优先级翻转:高优先级的任务反而慢执行,低优先级的任务反而优先执行。

                                                                                                                                                                                                                                                                                                                                                                                                

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

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

相关文章

Linux--程序地址空间

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 [TOC](文章目录) 一、程序地址空间回顾 我们在讲C语言的时候,老师给大家画过这样的空间布局…

Transformer在视觉的应用

文章目录 Vison TransformerSwin TransformerVisual Attention Network Vison Transformer transformer 在 cv 中最重要的算法 Linear Projection of Flattened Patches 对于标准的Transformer模块,要求输入的是token(向量)序列&#xff…

鸿蒙4.0开发笔记之ArkTS语法基础之应用生命周期与页面中组件的生命周期(十六)

文章目录 一、应用生命周期二、生命周期函数定义三、生命周期五函数练习 一、应用生命周期 1、定义 应用生命周期就是代表了一个HarmonyOS应用中所有页面从创建、开启到销毁等过程的全生命周期。查看路径如下: Project/entry/src/main/ets/entryability/EntryAbili…

vue elementUI 上传非空验证

<el-form-item label"照片" prop"staffImg"><template v-slot:label><span v-show"!rules.staffImg[0].required"style"color: #ff4949;margin-right: 4px;">*</span><span>照片</span></temp…

【JavaWeb学习笔记】6 - Tomcat

项目代码 零、在线文档 Apache Tomcat 8 (8.0.53) - Documentation Index WEB开发 1. WEB,在英语中web表示网/网络资源(页面&#xff0c;图片,css,js)意思&#xff0c;它用于表示WEB服务器(主机)供浏览器访问的资源 2. WEB服务器(主机)上供外界访问的Web资源分为: 静态web…

LeetCode 每日一题 Day 4

2477. 到达首都的最少油耗 给你一棵 n 个节点的树&#xff08;一个无向、连通、无环图&#xff09;&#xff0c;每个节点表示一个城市&#xff0c;编号从 0 到 n - 1 &#xff0c;且恰好有 n - 1 条路。0 是首都。给你一个二维整数数组 roads &#xff0c;其中 roads[i] [ai,…

Myblog01-基于基本的javaWeb设计实现

目录 一、项目概述&#xff1a; 应用技术&#xff1a; 接口实现&#xff1a; 数据库建表&#xff0c;sql脚本&#xff1a; 页面展示&#xff1a;登陆页面 项目源码&#xff1a;myblog01: 初版的个人博客项目-使用基本的javaWeb (gitee.com) 二、对博客系统进行测试 总结 一、项…

怎么给文章润色?文章润色怎么收费?

文章润色&#xff0c;指的是在原有文章基础上&#xff0c;对语言表达、逻辑结构、风格等方面进行优化调整&#xff0c;以提高文章的阅读体验和质量。 润色不同于修改&#xff0c;修改主要针对文章中的错误&#xff0c;如语法、拼写、标点等&#xff1b;而润色则是对文章的整体…

网页抓取为什么要使用http代理?

目录 前言 一、网页抓取的定义 二、使用HTTP代理的原因 1. 防止IP被封锁 2. 提高访问速度 3. 保护隐私 4. 突破地域限制 三、使用Python进行网页抓取并使用HTTP代理 1. 安装必要的Python模块 3. 获取网页源代码 4. 解析网页内容 总结 前言 网页抓取是指从互联网中…

如何解决syntaxerror: more than 255 arguments 报错

如何解决syntaxerror: more than 255 arguments 报错 问题背景解释解决方案 问题背景 今天拼接特征的时候&#xff0c;突然代码报错syntaxerror: more than 255 arguments &#xff0c;看了一下感觉这个报错非常有意思&#xff0c;估计平时也是没机会碰到&#xff0c;和大家分…

课题学习(十五)----阅读《测斜仪旋转姿态测量信号处理方法》论文

一、 论文内容 1.1 摘要 为准确测量旋转钻井时的钻具姿态&#xff0c;提出了一种新的信号处理方法。测斜仪旋转时&#xff0c;垂直于其旋转轴方向加速度计的输出信号中重力加速度信号分量具有周期性特征&#xff0c;以及非周期性离心加速度分量频率低于重力加速度信号分量频率…

ROS-ROS通信机制-参数服务器

文章目录 一、基础理论知识二、C实现三、Python实现 一、基础理论知识 参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器&#xff0c;可以将数据存储在该容器中&#xff0c;被不同的节点调用&#xff0c;当然不同的节点…

【GAMES101】二维变换和齐次坐标

这几天都在抽空学OpenGL、敲leetcode和看games&#xff0c;这里留点笔记给以后复习 games101第一节课在吹水&#xff0c;第二节课讲了线性代数的入门知识&#xff0c;比较简单&#xff0c;这里稍微回顾一下重点&#xff0c;然后开始讲第三节课的二维变换和齐次坐标 目录 向量…

前端CSS(层叠样式表)总结

CSS2总结 一、CSS基础 1. CSS简介 CSS 的全称为&#xff1a;层叠样式表 ( Cascading Style Sheets ) 。CSS 也是一种标记语言&#xff0c;用于给 HTML 结构设置样式&#xff0c;例如&#xff1a;文字大小、颜色、元素宽高等等。 简单理解&#xff1a; CSS 可以美化…

一篇文章带你详细了解C++智能指针

一篇文章带你详细了解C智能指针 为什么要有智能指针内存泄漏1.什么是内存泄漏&#xff0c;它的危害是什么2.内存泄漏的分类3.如何避免内存泄漏 智能指针的使用及原理1.RAII2.智能指针的原理3.auto_ptr4.unique_ptr5.shared_ptr6.weak_ptr 为什么要有智能指针 C引入智能指针的主…

【SVM】不同数据划分方式导致结果不同...

此帖是一个自我纠查帖&#xff0c;感觉基本不会有其他人踩相同的坑。 背景&#xff1a;在MI分类中使用FBCSPSVM&#xff0c;基于这个方法写了两个分类的.py文件实现&#xff0c;在数据划分上大差不差&#xff08;都是CV5&#xff09;&#xff0c;但是结果却相差很多 方法一&a…

从零开始学习 JavaScript APl(七):实例解析关于京东案例头部案例和放大镜效果!

大家好关于JS APl 知识点已经全部总结了&#xff0c;第七部部分全部都是案例部分呢&#xff01;&#xff01;&#xff08;素材的可以去百度网盘去下载&#xff01;&#xff01;&#xff01;&#xff09; 目录 前言 一、个人实战文档 放大镜效果 思路分析&#xff1a; 关于其它…

【C++】String类经典OJ题目分析

目录 字符串相加字符串里面最后一个单词的长度反转字符串||反转字符串中的单词 字符串相加 链接: link class Solution { public:string addStrings(string num1, string num2) {int next 0;//存放进位int end1 num1.size()-1;int end2 num2.size()-1;int ret 0;string …

安全测试工具,自动发现网站所有URL!

作为一个安全测试人员来说&#xff0c;首先要拿到网站所有url&#xff0c;然后根据拿到的url进行渗透测试进行漏洞挖掘。本文给大家介绍的是如何拿到一个网站所有的url。 深度爬取层级控制 现在我也找了很多测试的朋友&#xff0c;做了一个分享技术的交流群&#xff0c;共享了很…

Android Glide自定义AppCompatImageView切分成若干小格子,每个小格子onDraw绘制Bitmap,Kotlin(1)

Android Glide自定义AppCompatImageView切分成若干小格子&#xff0c;每个小格子onDraw绘制Bitmap&#xff0c;Kotlin&#xff08;1&#xff09; 垂直方向的RecyclerView&#xff0c;每行一个AppCompatImageView&#xff0c;每个AppCompatImageView被均匀切割成n个小格子&#…