FreeRTOS:事件标志组

目录

一、简介

二、 事件控制块

三、相关API

四、 应用场景


 

一、简介

        在FreeRTOS中,使用信号量可以实现同步,但是使用信号量来同步的话任务只能与单个的任务进行同步。有时候某个任务可能会需要与多个任务进行同步,此时信号量就无能为力。FreeRTOS为此提供了一个可选的解决方法,那就是事件标志组。

        FreeRTOS中的事件标志组(Event Groups) 是一种任务间同步机制,允许多个任务通过设置或等待标志位来同步彼此的行为。每个事件标志组由一组32 位的二进制标志组成,其中每一位标志位可以表示某个事件的状态(0 或 1),任务可以对这些标志进行设置、清除、等待,进而实现更灵活的任务间通信和同步。       

 

二、 事件控制块

        在 FreeRTOS 中,事件标志组(Event Group)控制块是对事件标志组进行管理和操作的核心数据结构。它存储了事件标志组的状态以及操作这些标志位所需的所有信息。每当创建事件标志组时,FreeRTOS 会为其分配一个控制块(即事件组的句柄),该控制块负责管理事件标志组的标志位及其相关的任务同步信息。

 

三、相关API

         事件标志组的使用一般包含创建事件、置位事件标志、等待事件标志、清除事件标志和删除事件。

1.创建事件

  • xEventGroupCreate() 
  • 无参数,创建成功返回事件句柄;创建失败返回 NULL。

 

 2.置位事件(置1)

  • xEventGroupSetBits(xEventGroup, uxBitsToSet)
  • 参数为事件句柄xEventGroup和需要置位的位,0x08置位位3(00001000),0x09置位位8和位0(00001001)。
  • 当位被置位之后,阻塞在该位上的任务将会被解锁。

3.中断服务例程(ISR)中的置位事件

4.等待事件

 

  • 等待时间xTicksToWait取0~portMAT_DELAY(0表示不等待, portMAT_DELAY表示一直等待)。

 

5.清除事件 (置0)

  •  若在上述等待事件并获取事件标志位时没有选择清除相应的位(复位,置0),则要使用这里的清除事件的函数来清除要清除的位。

 

6.删除事件

  • vEventGroupDelete(xEventGroup) 
  • 参数为事件句柄。
  • 该函数不允许在中断里面使用。
  • 当事件组被删除之后,阻塞在该事件组上的任务都会被解锁,并向等待事件的任务返回为0的事件组的值。

 

四、应用场景

 

同步多个任务

        在这个场景中,任务 A 必须等待任务 B 和任务 C 完成各自的操作,然后再继续执行。如下:


EventGroupHandle_t xEventGroup;                         //定义一个事件句柄
xEventGroup = xEventGroupCreate();                      //创建事件标志组
if (xEventGroup == NULL)                                //判断是否创建成功
{//处理创建失败的情况
}void vTaskA(void *pvParameters)                         //任务A
{EventBits_t uxBits;                                 //定义EventBits_t类型的变量uxBits = xEventGroupWaitBits(xEventGroup,(1 << 0) | (1 << 1),   //等待任务B、C完成(位0、位1被置位)pdTRUE,                //清除标志位pdTRUE,                //等待所有位portMAX_DELAY);        //无限期等待//任务B和C完成后继续执行接下来的操作}void vTaskB(void *pvParameters)                         //任务B
{//执行某些操作xEventGroupSetBits(xEventGroup, (1 << 0));          //操作完成,置位事件组的位0
}void vTaskC(void *pvParameters)                         //任务C
{//执行某些操作xEventGroupSetBits(xEventGroup, (1 << 1));          //操作完成,置位事件组的位1
}

2.等待任意一个事件发生

         在这个场景中,只需通过设置 xWaitForAllBits 参数为 pdFALSE 即可实现。

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

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

相关文章

mysql 09 独立表空间结构

表空间中的页实在是太多了&#xff0c;为了更好的管理这些页面&#xff0c;设计 InnoDB 的大叔们提出了 区 &#xff08;英文名&#xff1a; extent &#xff09;的概念。对于16KB的页来说&#xff0c;连续的64个页就是一个 区 &#xff0c;也就是说一个区默认占用1MB空间大小。…

QT--单选按钮(QRadioButton)和复选按钮(QCheckBox)

在Qt中&#xff0c;单选按钮&#xff08;QRadioButton&#xff09;和复选按钮&#xff08;QCheckBox&#xff09;是两种常用的用户界面控件&#xff0c;它们的主要区别在于选择行为和用途&#xff1a; QRadioButton&#xff08;单选按钮&#xff09; 选择行为&#xff1a;单选…

jvm虚拟机调优实战

使用命令 jps查看进程使用jstat gc -1 5000查看内存占用和回收情况 正式测试 是否跑job区别。大量的job,部分用户点击的热数据 &#xff0c;不同时刻在跑 600-700对比 200 多了400-500m,代码原数据&#xff08;不占用堆区&#xff09;占了300m,所以 堆空间老年代&#xff08;90…

VsCode环境配置C++环境

目录 第一步下载应用 第二步应用文字汉化 第三步安装编译器MinGW 第四步 环境变量的配置 第五步 打开VsCode 第六步 配置环境设施 几个其他的好用的插件 会了吧 MarsCode: AI Coding Assistant 第一步下载应用 VSCode下载官方指定网址&#xff1a; Visual Studio Cod…

使用豆包MarsCode 来处理 Excel 的数据吧!

作者可乐三分糖 背景 Excel 是大部分没有信息化的公司通用的数据处理手段。但并不是所有的人对 excel 都是非常熟悉的。这些同学主要会遇到三类问题&#xff1a; Excel 的一些操作问题&#xff0c;如公式怎么写跨表处理太复杂&#xff0c;即使是写公式也很繁琐。一些数据批处…

关于k8s集群高可用性的探究

1. k8s的高可用的核心是什么&#xff1f; 说到核心、本质 意味着要从物理层来考虑技术 k8s是一个容器编排管理工具&#xff0c;k8s受欢迎的时机 是docker容器受欢迎时&#xff0c;因为太多的docker容器&#xff0c;管理起来是一个大工程 那么刚好k8s是google自己用了十来年…

如何设计开发RTSP直播播放器?

技术背景 我们在对接RTSP直播播放器相关技术诉求的时候&#xff0c;好多开发者&#xff0c;除了选用成熟的RTSP播放器外&#xff0c;还想知其然知其所以然&#xff0c;对RTSP播放器的整体开发有个基础的了解&#xff0c;方便方案之作和技术延伸。本文抛砖引玉&#xff0c;做个…

【环境搭建】更换电脑后的开发环境怎么重建

目录 &#x1f378;前言 &#x1f37b;一、系统配置检查 &#x1f37a;二、开发环境搭建 &#x1f379;三、章末 &#x1f378;前言 小伙伴们大家好&#xff0c;这次文章跟技术没有关联&#xff0c;因为最近刚更换了装备&#xff0c;开发环境啥的残缺不全&#xff0c;也不能…

Java基础:面向对象编程5

1 Java内部类 1.1 概念 在 Java 中&#xff0c;内部类是指定义在另一个类内部或方法内部的类。内部类可以分为以下几种类型&#xff1a; 成员内部类局部内部类匿名内部类静态内部类 1.2 成员内部类 定义&#xff1a;成员内部类是最常见的内部类&#xff0c;它定义在外部类…

深度解析 Redis 存储结构及其高效性背后的机制

目录 1. Redis 存储结构存储结构存储转换 2. 字典实现数据结构冲突处理负载因子 3. 扩容扩容步骤影响与优化 4. 缩容缩容步骤优化策略 5. 渐进式 Rehash**渐进式 Rehash 的工作原理**Rehash 规则优势 6. SCAN 命令SCAN 的实现原理遍历顺序避免重复和遗漏使用场景 7. 过期&#…

电子商务网站维护技巧:保持WordPress、主题和插件的更新

在这个快节奏的数字时代&#xff0c;维护一个电子商务网站的首要任务之一是保持WordPress、主题和插件的最新状态。过时的软件不仅可能导致功能故障&#xff0c;还可能带来安全风险。本文将深入探讨如何有效地更新和维护您的WordPress网站&#xff0c;以确保其安全性和性能。 …

工业物联网关-ModbusTCP

Modbus-TCP模式把网关视作Modbus从端设备&#xff0c;主端设备可以通过Modbus-TCP协议访问网关上所有终端设备。用户可以自定义多条通道&#xff0c;每条通道可以配置为TCP Server或者TCP Slave。注意&#xff0c;该模式需要指定采集通道&#xff0c;采集通道可以是串口和网口通…

简述微服务高可用之Sentinel、Seate

简述微服务高可用之Sentinel、Seate使用 下文主要讲述使用sentinel,如何降级限流熔断及如何使用seata管理分布式事务 sentinel服务端安装与使用 1、下载 进入https://github.com/alibaba/Sentinel/releases 根据你的需求进行下载对应版本 我这里是JDK17 下载的1.8.8版本&am…

【数据结构与算法】链表(上)

记录自己所学&#xff0c;无详细讲解 无头单链表实现 1.项目目录文件 2.头文件 Slist.h #include <stdio.h> #include <assert.h> #include <stdlib.h> struct Slist {int data;struct Slist* next; }; typedef struct Slist Slist; //初始化 void SlistI…

【C#】WPF MVVM 简单示例代码

1. 目录结构 2. 代码 2.1 DelegateCommand.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input;namespace MVVSSample.Commands {class DelegateCommand : ICommand{publ…

信息安全工程师(52)网络安全审计系统组成与类型

前言 网络安全审计系统是一种用于监控、分析和报告网络环境中安全事件的系统。其组成与类型均体现了对网络安全性的全面考虑和细致划分。 一、网络安全审计系统的组成 网络安全审计系统一般由以下几个关键部分组成&#xff1a; 审计数据采集系统&#xff1a;负责采集被审计系统…

shell案例之一键部署kafka

Shell案例之一键部署kafka 一、案例问题 &#xff08;1&#xff09;Kafka是用Java编写的&#xff0c;需要配置jdk环境变量 &#xff08;2&#xff09;Kafka配置文件数目多 &#xff08;3&#xff09;命令安装繁琐 二、案例分析&#xff1a; &#xff08;1&#xff09;检查…

elementUI,设置日期,只能选择过去的和今天的日期

在 el-date-picker 组件中加&#xff1a;:picker-options"pickerOptions" <el-form-item label"票据生成日期&#xff1a;"> <el-date-picker v-model"date1" type"daterange" range-separator"至" value-format&…

chatgpt搭建大模型技术知识解读与总结

搭建大型语言模型&#xff08;如ChatGPT&#xff09;的技术知识涉及多个领域&#xff0c;包括机器学习、自然语言处理&#xff08;NLP&#xff09;、深度学习、数据处理等。下面是一些关键概念和步骤的总结&#xff1a; ### 1. **基础知识** #### a. **自然语言处理 (NLP)** …

基于Qt/QChart实现折线图和散点图的绘制示例程序解析

1. 项目简介 本文讲解的是一个基于Qt框架的QChart模块实现的折线图与散点图结合的绘制程序。程序通过自定义类LineChartWithGradient实现折线图、散点图以及带有渐变填充的区域图&#xff0c;最终形成一个美观的数据可视化效果。 2. 类构造函数 LineChartWithGradient::LineC…