【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;…

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

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

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

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

QtConcurrent和QFuture的使用

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

C# 跨线程访问窗体控件

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

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之主从复制解读

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

Python3 条件控制

Python3 条件控制 Python 条件语句是通过一条或多条语句的执行结果(True 或者 False)来决定执行的代码块。 可以通过下图来简单了解条件语句的执行过程: 代码执行过程: if 语句 Python中if语句的一般形式如下所示: if conditi…

python后端,一个账户,多设备登录管理

一个账号,多台设备同时登陆的问题,设计以及实现 参考这篇文章: https://www.alibabacloud.com/help/zh/tair/use-cases/manage-multi-device-logon-from-a-single-user-by-using-tairhash1.0 设计思路 利用的是Redis,主设备的保…

【Java 动态数据统计图】动态数据统计思路案例(动态,排序,动态数组(重点推荐))七(129)

需求:前端根据后端的返回数据:画统计图; 说明: 1.X轴为地域,Y轴为地域出现的次数; 2. 动态展示(有地域展示,没有不展示,且高低排序) Demo案例: …

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书江西师范大学图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书江西师范大学图书馆

MyBatisPlus简单入门

1、简单介绍MyBatisPlus MyBatisPlus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,完全去SQL化,封装好了大量的CRUD操作。甚至吧CRUD操作封装到了Service层,可以直接在Controller调用现成的CRUD服务层&#xff0c…

Ubuntu 启动出现grub rescue

​ 一,原因 原因:出现 “grub rescue” 错误通常表示您的计算机无法正常引导到操作系统,而是进入了 GRUB(Grand Unified Bootloader)紧急模式。这可能是由于引导加载程序配置错误、硬盘驱动器损坏或其他引导问题引起…

springboot1.5.12升级至2.6.15

首先&#xff0c;加入springboot升级大版本依赖&#xff0c;会在升级过程中打印出错日志提示&#xff08;升级完毕可去除&#xff09; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-properties-migrator</art…