当前位置: 首页 > news >正文

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 即可实现。

相关文章:

FreeRTOS:事件标志组

目录 一、简介 二、 事件控制块 三、相关API 四、 应用场景 一、简介 在FreeRTOS中&#xff0c;使用信号量可以实现同步&#xff0c;但是使用信号量来同步的话任务只能与单个的任务进行同步。有时候某个任务可能会需要与多个任务进行同步&#xff0c;此时信号量就无能为力。…...

【高分论文密码】AI赋能大尺度空间模拟与不确定性分析及数字制图

随着AI大语言模型的广泛应用&#xff0c;大尺度空间模拟预测与数字制图技术在不确定性分析中的重要性日益凸显。这些技术已经成为撰写高分SCI论文的关键工具&#xff0c;被誉为“高分论文密码”。大尺度模拟技术能够从不同的时空尺度揭示农业生态环境领域的内在机理和时空变化规…...

智能摆件(墨水屏)

因为需要申请8k的堆&#xff0c;所以需要更改堆的大小 stm32修改堆栈大小&#xff08;堆栈空间不足导致死机&#xff09;_minimum heap size-CSDN博客...

ansible————playbook

一、playbook和ad hoc命令 ad hoc命令是单行&#xff0c;一个简单的任务&#xff0c;运行一次。ansible真正强大的地方是使用ansible的playbook重复运行多次复杂的任务。 一个play是是一组有序的任务&#xff0c;该paly对应着在inventory被选择的主机。一个playbook是一个包含…...

linux日志分割工具logorate快速验证配置是否有效

创建一些文件, 并修改文件的mtime(修改时间) # /var/log/test/*.log touch -d "2024-10-14" test1.log touch -d "2024-10-15" test2.log touch -d "2024-10-16" test3.log touch -d "2024-10-17" test4.log#快速创建一个1G的大文…...

Unity3D URP画面品质的上限如何详解

Unity3D是一款广泛应用于游戏开发的引擎&#xff0c;它提供了多种渲染管线用于实现不同的画面品质。其中一种渲染管线是Universal Render Pipeline&#xff08;简称URP&#xff09;&#xff0c;它是Unity3D的一种轻量级渲染管线&#xff0c;专注于提供高性能和可移植性。 对惹…...

风管阻力计算

风管阻力主要包括摩擦阻力和局部阻力两大类。摩擦阻力:空气在风管内流动时,与管壁的摩擦作用导致的能量损失,与管道长度、断面尺寸、风速、空气密度等参数有关。局部阻力:风管系统中的弯头、三通、变径、阀门等部件,由于改变了气流的流动方向或速度,导致的额外能量损失,用局部阻…...

【redis】redis的多线程和IO多路复用

【redis】redis的多线程和IO多路复用 【一】前言【二】Redis单线程和多线程问题的背景【1】Redis的单线程【2】Redis为什么选择单线程&#xff1f;【3】Redis为什么开始利用多核&#xff1f;【4】Redis当前的性能瓶颈【5】Redis的主线程如何和IO线程协同 【三】IO多路复用的理解…...

webstorm 编辑器配置及配置迁移

1.下载地址 WebStorm&#xff1a;JetBrains 出品的 JavaScript 和 TypeScript IDE 其他版本下载地址 2.安装 点击下一步安装&#xff0c;可根据需要是否删除已有版本 注意&#xff1a; 完成安装后需要激活 3.设置快捷键 以下为个人常用可跳过或根据需要设置 如&#xff1a…...

Oracle19.25发布,如何打补丁到19.25

一. 19.25发布 2024年10月16日 19c 19.25补丁发布 文档编号19202410.9&#xff0c;文档编码规则&#xff1a; 19&#xff08;版本号&#xff09;2024&#xff08;年份&#xff09;07&#xff08;当季的第一个月01/04/07/10&#xff09;.9 一般每个季度的首月中15号左右发布…...

vue3中,拦截双击事件的第一次点击,写一些逻辑

在 Vue 3 中&#xff0c;如果想要拦截双击事件的第一次点击并执行一些逻辑&#xff0c;你可以使用一个状态变量来跟踪第一次点击事件&#xff0c;并在第二次点击时阻止第一次点击逻辑的执行。以下是一个实现示例&#xff1a; <template><divmousedown"handleMou…...

落地 ZeroETL 轻量化架构,ByteHouse 推出“四个一体化”策略

在数字化转型的浪潮中&#xff0c;数据仓库作为企业的核心数据资产&#xff0c;其重要性日益凸显。随着业务范围扩大&#xff0c;企业也会使用不同的数据仓库来管理、维护相关数据。研发人员需要花费大量时间和精力&#xff0c;从中导出数据&#xff0c;然后进行手动整理、转换…...

如何提高LabVIEW编程效率

提高LabVIEW编程效率对开发者来说非常重要&#xff0c;尤其是在处理复杂项目或紧迫的开发周期时。以下是一些可以显著提升LabVIEW编程效率的技巧&#xff0c;从代码结构、工具使用到团队协作的多个角度进行详细分析&#xff1a; 1. 模块化设计 模块化设计 是提高代码可维护性和…...

Android 开发 TabLayout 自定义指示器长度

前言 原生 TabLayout 的指示器长度是充满整个屏幕的&#xff0c;但在实际开发中 UI 会设计成 指示器的长度等于或者小于标题字体长度&#xff0c;如图 如果设置成跟字体长度一样即使用 API: mTabLayout.setTabIndicatorFullWidth(false);或者在 xml 布局文件中的TabLayout标签…...

构造mex(牛客周赛 Round 59)

题目链接&#xff1b; D-构造mex_牛客周赛 Round 59 (nowcoder.com) 题目描述&#xff1a; 输出和输出描述&#xff1a; 输入样例&#xff1a; 3 6 3 3 7 4 3 6 6 0 输出样例&#xff1a; NO YES 4 0 1 2 YES 1 1 1 1 1 1 分析&#xff1a; 数学思维题&#xff0c;赛后看了一…...

RabbitMQ 交换机的类型

在 RabbitMQ 中&#xff0c;交换机&#xff08;Exchange&#xff09;是一个核心组件&#xff0c;负责接收来自生产者的消息&#xff0c;并根据特定的路由规则将消息分发到相应的队列。交换机的存在改变了消息发送的模式&#xff0c;使得消息的路由更加灵活和高效。 交换机的类…...

机器人顶会参会经验——许华哲老师PRE-IROS 2024分享

摘要&#xff1a;清华大学交叉信息学院许华哲老师在PRE-IROS 2024上分享了机器人顶会参会技巧&#xff0c;包括社交和活动选择方面的实用建议等内容。本文整理了许老师在直播中分享的干货。 在刚刚过去的PRE-IROS 2024论文预分享会上&#xff0c;清华叉院许华哲老师全方位解析…...

计算机组成原理--一章二章

这里写目录标题 第一章&#xff1a;计算机系统概述计算机的发展计算机的组成计算机的性能指标 第二章&#xff1a;数据的表示和运算2.1进位十进制BCD码无符号整数的表示和运算带符号整数的表示和运算原反补码的特性对比移码定点小数 2.2奇偶校验码算数逻辑运算单元&#xff08;…...

zookeeper kafka集群配置

一.下载安装包 地址&#xff1a;https://download.csdn.net/download/cyw8998/16579797 二.配置文件 zookeeper.properties dataDir/data/kafka/zookeeper_data/zookeeper # the port at which the clients will connect clientPort2181 # disable the per-ip limit on the…...

Java IO 基础知识

IO 流简介 IO 即 Input/Output&#xff0c;输入和输出。数据输入到计算机内存的过程即输入&#xff0c;反之输出到外部存储&#xff08;比如数据库&#xff0c;文件&#xff0c;远程主机&#xff09;的过程即输出。数据传输过程类似于水流&#xff0c;因此称为 IO 流。IO 流在…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...