【FreeRTOS】信号量的相关函数使用及示例解释

FreeRTOS中的信号量是一种用于任务间同步的机制。它可以用来实现任务之间的互斥访问共享资源或者等待某个事件发生。
在这里插入图片描述

文章目录

    • 信号量类型
      • 1. 二进制信号量(Binary Semaphore):
      • 2. 计数信号量(Counting Semaphore):
    • 信号量使用
      • 1. `xSemaphoreCreateBinary()`
      • 2. `xSemaphoreCreateCounting()`
      • 3. `xSemaphoreCreateMutex()`
      • 4. `xSemaphoreTake()`
      • 5. `xSemaphoreGive()`
    • 示例代码块

信号量类型

FreeRTOS中的信号量有两种类型:二进制信号量和计数信号量。

1. 二进制信号量(Binary Semaphore):

  • 二进制信号量只有两种状态:0和1。
  • 当一个任务获取到二进制信号量时,它会将信号量的值减1,如果信号量的值已经为0,则任务会被阻塞,直到有其他任务释放了该信号量。
  • 当一个任务释放二进制信号量时,它会将信号量的值加1,如果有其他任务正在等待该信号量,则会唤醒其中一个等待的任务。

2. 计数信号量(Counting Semaphore):

  • 计数信号量可以有多个状态,取决于其初始值和每次操作的增减值。
  • 当一个任务获取到计数信号量时,它会将信号量的值减去指定的增减值,如果信号量的值已经为0,则任务会被阻塞,直到有其他任务释放了足够的信号量。
  • 当一个任务释放计数信号量时,它会将信号量的值加上指定的增减值,如果有其他任务正在等待该信号量,则会唤醒其中一个等待的任务。

在FreeRTOS中使用信号量的步骤如下:

  1. 创建一个信号量对象,可以使用xSemaphoreCreateBinary()函数创建二进制信号量,或者使用xSemaphoreCreateCounting()函数创建计数信号量。
  2. 在任务中使用xSemaphoreTake()函数获取信号量,在需要访问共享资源或者等待事件发生的地方调用该函数。
  3. 在任务中使用xSemaphoreGive()函数释放信号量,在完成对共享资源的访问或者事件发生后调用该函数。
  4. 根据需要,可以使用xSemaphoreTake()函数的阻塞时间参数来控制任务等待信号量的时间。

信号量使用

1. xSemaphoreCreateBinary()

  • 原型

    SemaphoreHandle_t xSemaphoreCreateBinary(void)
    
  • 作用:创建一个二进制信号量。

  • 参数:无。

  • 返回值:返回一个指向信号量的句柄(SemaphoreHandle_t)。

2. xSemaphoreCreateCounting()

  • 原型:

    SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount, UBaseType_t uxInitialCount)
    
  • 作用:创建一个计数信号量。

  • 参数:一个参数,指定信号量的最大计数值。

  • 返回值:返回一个指向信号量的句柄(SemaphoreHandle_t)。

3. xSemaphoreCreateMutex()

  • 原型
SemaphoreHandle_t xSemaphoreCreateMutex(void)
  • 作用:创建一个互斥信号量。
  • 参数:无。
  • 返回值:返回一个指向信号量的句柄(SemaphoreHandle_t)。

4. xSemaphoreTake()

  • 原型
BaseType_t xSemaphoreTake(SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait)
  • 作用:获取一个信号量。
  • 参数:信号量的句柄(SemaphoreHandle_t)和可选的超时时间(TickType_t)。
  • 返回值:如果获取成功,则返回pdTRUE;如果获取失败(超时或其他原因),则返回pdFALSE

5. xSemaphoreGive()

  • 原型:
BaseType_t xSemaphoreGive(SemaphoreHandle_t xSemaphore)
  • 作用:释放一个信号量。
  • 参数:信号量的句柄(SemaphoreHandle_t)。
  • 返回值:无。

示例代码块

#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"// 共享资源
int sharedResource = 0;// 互斥信号量
SemaphoreHandle_t mutex;void task1(void *pvParameters)
{while (1) {// 获取互斥信号量xSemaphoreTake(mutex, portMAX_DELAY);// 访问共享资源sharedResource++;// 释放互斥信号量xSemaphoreGive(mutex);vTaskDelay(pdMS_TO_TICKS(1000));}
}void task2(void *pvParameters)
{while (1) {// 获取互斥信号量xSemaphoreTake(mutex, portMAX_DELAY);// 访问共享资源sharedResource--;// 释放互斥信号量xSemaphoreGive(mutex);vTaskDelay(pdMS_TO_TICKS(1000));}
}int main(void)
{// 创建互斥信号量mutex = xSemaphoreCreateMutex();// 创建任务xTaskCreate(task1, "Task 1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);xTaskCreate(task2, "Task 2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);// 启动调度器vTaskStartScheduler();return 0;
}

在示例中,使用了上述函数来创建互斥信号量(xSemaphoreCreateMutex()),获取互斥信号量(xSemaphoreTake()),释放互斥信号量(xSemaphoreGive())。其中,互斥信号量的句柄存储在全局变量mutex中。

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

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

相关文章

python in excel 如何尝鲜 有手就行

众所周知,微软在8月下旬放出消息python已入驻excel,可到底怎么实现呢。 今天我就将发布python in excel的保姆级教程,开始吧! 获取office 365 账号 首先我们要有微软office365 这时候需要再万能的某宝去找一个账号,…

Android JNI系列详解之ndk-build工具的使用

一、Android项目中使用ndk-build工具编译库文件 之前介绍过CMake编译工具的使用,今天介绍一种ndk自带的编译工具ndk-build的使用。 ndk-build目前主要有两种配置使用方式: 如上图所示,第一种方式是Android.mkApplication.mkgradle的方式生成…

5.Redis-string

string 字符串 字符串类型是 Redis 最基础的数据类型,关于字符串需要特别注意: 1.⾸先Redis中所有 key 的类型都是字符串类型,⽽且其他⼏种数据结构也都是在字符串类似基础上构建的,例如 list 和 set 的元素类型是字符串类型。 2…

Web_单一视频文件mp4转换为m3u分段ts文件实现边下边播

一、下载ffmpeg: Builds - CODEX FFMPEG @ gyan.dev 二、转换视频文件: 先解压缩,会看到如下结构: 进入bin目录,把需要转换的视频文件复制过来,同时新建一个文件夹用来存放转换后的文件,然后按住Shift键同时单击鼠标右键,选择打开Powershell窗口: 输入以下命令(根据…

【管理运筹学】第 7 章 | 图与网络分析(1,图论背景以及基本概念、术语)

文章目录 引言一、图与网络的基本知识1.1 图与网络的基本概念1.1.1 图的定义1.1.2 图中相关术语1.1.3 一些特殊图类1.1.4 图的运算 写在最后 引言 按照正常进度应该学习动态规划了,但我想换换口味,而且动态规划听说也有一定难度,还不一定会考…

UE5- c++ websocket客户端写法

# 实现目标 ue5 c 实现socket客户端,读取服务端数据,并进行解析 #实现步骤 {projectName}.Build.cs里增加 "WebSockets","JsonUtilities", "Json"配置信息,最终输出如下: using UnrealBuildTool;…

IDEA 快捷键

方法参数顺序快速调整 参数顺序调整 交换参数位置 参数交换位置 编码过程中经常碰到函数调用的参数顺序需要调整的情况。 比如单元测试中,期望和实际值得参数顺序反了,就可以选中参数后或者光标放到要调整的参数位置,然后用 CTRL SHIFTA…

SpringBatch chunk详解

目录 一、Chunk基本概念 1. Chunk的概念: 2. 配置Chunk: 3. Chunk的示例配置: 4. Chunk的执行流程:

maven报错:[ERROR] 不再支持源选项 7。请使用 8 或更高版本。

解决方案 pom.xml文件中增加maven编译的java.version jdk版本设置&#xff0c;以及maven.compiler.source 资源编译jdk版本设置和maven.compiler.target 资源构建jdk版本设置 JDK&#xff1a;6~8 一般都是1.6&#xff0c;1.7&#xff0c;1.8的写法。 <properties><…

前端面试基础面试题——4

1.谈谈你对 ES6 的理解 2.说说你对 promise 的了解 3.解构赋值及其原理 4.Vue常用的修饰符及使用的场景 5.vue 中 key 值的作用 6.什么是 vue 的计算属性&#xff1f; 7.watch的作用是什么 8.计算属性的缓存和方法调用的区别 9.响应式系统的基本原理 10.vue-loader …

基于科大讯飞AIGC创作平台,构建数字人虚拟主播

笔者为体验目前数字人虚拟主播创作视频的质量&#xff0c;特意制作了一段测试视频。 基于讯飞智作创建 总体感受&#xff0c;数字人虚拟主播具有成本低、可定制性强等优点&#xff0c;但是也存在缺乏人情味、技术限制和法律问题等缺点。因此&#xff0c;在使用数字人虚拟主播时…

opencv 提取选中区域内指定hsv颜色的水印

基于《QT 插件化图像算法研究平台》做的功能插件。提取选中区域内指定hsv颜色的水印。 《QT 插件化图像算法研究平台》有个HSV COLOR PICK功能&#xff0c;可以很直观、方便地分析出水印 的hsv颜色&#xff0c;比如, 蓝色&#xff1a;100,180,0,255,100,255。 然后利用 opencv …

QtConcurrent和QFuture的使用

在Qt中&#xff0c;有时候我们会遇到这样一种情况&#xff0c;需要执行一个很长时间的操作&#xff0c;这时候我们的主界面就会卡住。我们的通常做法就是把这个很长时间的操作扔到线程里去处理&#xff0c;可以使用标准库中的线程也可以使用QThread。 如果我们要在这个很长时间…

C# 跨线程访问窗体控件

在不加任何修饰的情况下&#xff0c;C# 默认不允许跨线程访问控件&#xff0c;实际在项目开发过程中&#xff0c;经常使用跨线程操作控件属性&#xff0c;需要设置相关属性才能正确使用&#xff0c;两种方法设置如下&#xff1a; 方法1&#xff1a;告诉编译器取消跨线程访问检…

Springboot GET和POST请求的常用参数获取方式

GET 使用RequestParam注解 可以在控制器方法的参数上使用RequestParam注解来获取请求中的参数值。例如&#xff1a; GetMapping("/example") public String example(RequestParam String param) {// 使用param参数的值return "Value of param: " param…

TDengine函数大全-时序库特有函数

以下内容来自 TDengine 官方文档 及 GitHub 内容 。 以下所有示例基于 TDengine 3.1.0.3 TDengine函数大全 1.数学函数 2.字符串函数 3.转换函数 4.时间和日期函数 5.聚合函数 6.选择函数 7.时序数据库特有函数 8.系统函数 时序库特有函数 TDengine函数大全CSUMDERIVATIVEDIFF…

Android 13.0 Launcher3定制之双层改单层(去掉抽屉式一)

1.概述 在13.0的系统产品开发中,对于在Launcher3中的抽屉模式也就是双层模式,在系统原生的Launcher3中就是双层抽屉模式的, 但是在通过抽屉上滑的模式拉出app列表页,但是在一些产品开发中,对于单层模式的Launcher3的产品模式也是常用的功能, 所以需要了解抽屉模式,然后修…

ModaHub魔搭社区——未来向量数据库会不像传统数据库那样,在国内涌现 200 多家出来?

I. 引言:数据库市场的持续扩张与向量数据库的崛起 随着技术的迭代速度越来越快,技术门槛也在逐渐降低,数据库市场的持续扩张是不可避免的。当前存在着大量的需求,这将吸引越来越多的数据库甚至向量数据库加入竞争。然而,从业界角度看,这种市场扩张是有利的。它可以促使更…

实现公网远程访问:Windows本地快速搭建SFTP文件服务器并配置端口映射

文章目录 1. 搭建SFTP服务器1.1 下载 freesshd服务器软件1.3 启动SFTP服务1.4 添加用户1.5 保存所有配置 2 安装SFTP客户端FileZilla测试2.1 配置一个本地SFTP站点2.2 内网连接测试成功 3 使用cpolar内网穿透3.1 创建SFTP隧道3.2 查看在线隧道列表 4. 使用SFTP客户端&#xff0…

Redis之主从复制解读

目录 基本概述 作用 如何配置主从复制 命令配置&#xff08;Slaveof &#xff09; 配置文件配置 主从复制缺点 主从复制原理 主从复制常见问题解答 命令补充&#xff08;info replication&#xff09; 基本概述 主从复制,是指将一台Redis服务器的数据,复制到其他的R…