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

【FreeRTOS】事件标志组

文章目录

  • 1 简介
    • 1.1事件标志
    • 1.2事件组
  • 2事件标志组API
    • 2.1创建
      • 动态创建
      • 静态创建
    • 2.2 删除事件标志组
    • 2.3 等待事件标志位
    • 2.4 设置事件标志位
      • 在任务中
      • 在中断中
    • 2.5 清除事件标志位
      • 在任务中
      • 在中断中
    • 2.6 获取事件组中的事件标志位
      • 在任务中
      • 在中断中
    • 2.7 函数xEventGroupSync
  • 3 事件标志组使用
    • 3.1 使用流程
    • 3.2获取、等待标志组函数区别

1 简介

事件标志组与信号量一样,属于任务键的同步机制。但是信号量一般用于单事件同步,事件标志组用于多事件同步。

1.1事件标志

一个用于指示事件是否发生的布尔值,一个事件只有0和1两种状态,FreeRTOS将多个事假标志存储在一个EventBits_t类型的变量中,这个变量就是事件标志组。

1.2事件组

一组事件标志的集合,一个事件组就包含了一个EventBits_t数据类型的变量,变量类型定义如下:

typedef TickType_t EventBits_t;if ( configUSE_16_BIT_TICKS == 1 )typedef uint16_t TickType_t;
#else typedef uint32_t TickType_t;
#endif

从上面的代码中可以看出,EventBits_t是一个16位或者32位的无符号类型。
EventBits_t为32位时,并不意味着可以存储32个事件标志,因为发数据类型被拆分成了两个部分,其中低24位[23:0]用于存储事件标志,高8位[31:24]用作存储事件标志组的控制信息。EventBits_t数据类型变量的位使用情况如下:
在这里插入图片描述
当某一位被置一时,就表示这一位对应的事件发生了。

2事件标志组API

事件标志组的API大概分为6类,分别为创建、删除、等待事件标志位、设置标志位、获取标志位、删除。

2.1创建

创建事件标志组有两种方式,动态和静态,两种方式的区别为:
静态创建时需要用户提供事件标志组所需要的内存空间,动态分配是FreeRTOS从FreeRTOS管理的堆中分配事件标志组所需的内存空间。函数原型如下;

动态创建

函数原型

EventGroupHandle_t xEventGroupCreat(void)

返回值
NULL:事假标志组创建失败,
其他值:事件标志组创建成功,返回其句柄

静态创建

函数原型

EventGroupHandle_t xEventGroupCreatStatic(StaticEventGroup_t *pxEventGroupBuffer);

形参
pxEventGroupBuffer:创建事件标志组所需要的内存空间

返回值
NULL:事假标志组创建失败,
其他值:事件标志组创建成功,返回其句柄

2.2 删除事件标志组

函数原型

void vEventGroupDelete(EventGroupHandle_t xEventGroup);

形参
xEventGroup:待删除的事件标志组句柄

返回值

2.3 等待事件标志位

函数原型

EventBits_t xEventGroupWaitBits(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToWairFor,const BaseType_t xClearOnWait,const BaseType_t xWaitForAllBits,TickType_t xTicksToWait);

形参
xEventGroup:等待的事件标志组
uxBitsToWairFor:等待的事件标志位,可以用逻辑或等待多个标志位
xClearOnWait:成功等到事件后需要清除的标志位
xWaitForAllBits:等待xWaitForAllBits中的所有标志位,(逻辑与)
xTicksToWait:等待的阻塞时间

返回值
EventBits_t :等待到的事件标志位

2.4 设置事件标志位

有两个设置事件标志位函数,分别是在任务重和在中断中

在任务中

函数原型

EventBits_t xEventGroupSetBits(EventGroupHandle_t xEventGroup,const EventBits_t  uxBitsToSet);

形参
xEventGroup:待操作的事件标志组
uxBitsToSet:待设置的事件标志位

返回值
整数:事件组中的事件标志位值

在中断中

函数原型

BaseType_t xEventGroupSetBitsFromISR(EventGroupHandle_t xEventGroup,const EventBits_t  uxBitsToSet,BaseType_t *  pxHigherPriorityTaskWoken)

形参
xEventGroup:待操作的事件标志组
uxBitsToSet:待设置的事件标志位
pxHigherPriorityTaskWoken:用于标记函数退出后是否需要进行任务切换

返回值
pdPASS:事件标志位设置成功
pdFAIL:事件标志位设置失败

2.5 清除事件标志位

同样是有两种,在任务中和在中断中

在任务中

函数原型

EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,const EventBits_t  uxBitsToClear)

形参
xEventGroup:待操作的事件标志组
uxBitsToSet:待清除的事件标志位

返回值
整数:清零事件标志位之前事件组中事件标志位的值

在中断中

函数原型

BaseType_t xEventGroupClearBitsFromISR(
EventGroupHandle_t EventGroup,
const EventBits_t  uxBitsToClear)

形参
xEventGroup:待操作的事件标志组
uxBitsToSet:待清除的事件标志位

返回值
pdPASS:事件标志位设置成功
pdFAIL:事件标志位设置失败

2.6 获取事件组中的事件标志位

在任务中和在中断中

在任务中

函数原型

EventBits_t xEventGroupGetBits(xEventGroup);

形参
xEventGroup:待获取事件标志位值的事件组

返回值
整数:事件组的事件标志位的值

在中断中

函数原型

EventBits_t xEventGroupGetBitsFromISR(EventGroupHandle_t xEventGroup);

形参
xEventGroup:待获取事件标志位值的事件组

返回值
整数:事件组的事件标志位的值

2.7 函数xEventGroupSync

此函数一般用于多任务同步,每个任务都必须等待其他任务达到同步点,然后才能继续执行(没理解啥意思,后面理解在补充)。
函数原型

EventBits_t xEventGroupSync(EventGroupHandle_t xEventGroup,const EventBits_t  uxBitsToSet,const EventBits_t  uxBitsToWaitFor,TickType_t xTicksToWait)

形参
xEventGroup:待获取事件标志位值的事件组
uxBitsToSet:达到同步点后,要设置的事件标志
uxBitsToWaitFor:等待的事件标志
xTicksToWait:等待的阻塞时间

返回值
成功:返回等待到的事件标志位
失败:返回事件组中的事件标志位

3 事件标志组使用

3.1 使用流程

1)创建事件标志组
2)设置标志组标志位
3)获取、等待、删除 标志组标志位
3)删除事件标志组

事件标志位可以使用宏定义的方式设置

#define EVENTBIT_0      (1 << 0)            /* 事件位 */
#define EVENTBIT_1      (1 << 1)
#define EVENTBIT_ALL    (EVENTBIT_0 | EVENTBIT_1)

3.2获取、等待标志组函数区别

同样都是可以获取当前事件标志组的值,两个函数的区别如下:

特性xEventGroupGetBits()xEventGroupWaitBits()
是否阻塞任务❌ 不阻塞,立即返回✔️ 可阻塞(可设置超时)
是否修改事件组❌ 只读,不修改✔️ 可配置是否清除标志位
是否等待标志位❌ 不等待,仅查询✔️ 可等待特定标志位
适用场景轮询检查事件状态任务同步(等待事件触发)

任务同步咋使用呢?

相关文章:

【FreeRTOS】事件标志组

文章目录 1 简介1.1事件标志1.2事件组 2事件标志组API2.1创建动态创建静态创建 2.2 删除事件标志组2.3 等待事件标志位2.4 设置事件标志位在任务中在中断中 2.5 清除事件标志位在任务中在中断中 2.6 获取事件组中的事件标志位在任务中在中断中 2.7 函数xEventGroupSync 3 事件标…...

超级扩音器手机版:随时随地,大声说话

在日常生活中&#xff0c;我们常常会遇到手机音量太小的问题&#xff0c;尤其是在嘈杂的环境中&#xff0c;如KTV、派对或户外活动时&#xff0c;手机自带的音量往往难以满足需求。今天&#xff0c;我们要介绍的 超级扩音器手机版&#xff0c;就是这样一款由上海聚告德业文化发…...

【数据可视化-27】全球网络安全威胁数据可视化分析(2015-2024)

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...

【6G 开发】NV NGC

配置 生成密钥 API Keys 生成您自己的 API 密钥&#xff0c;以便通过 Docker 客户端或通过 NGC CLI 使用 Secrets Manager、NGC Catalog 和 Private Registry 的 NGC 服务 以下个人 API 密钥已成功生成&#xff0c;可供此组织使用。这是唯一一次显示您的密钥。 请妥善保管您的…...

计算机视觉各类任务评价指标详解

文章目录 计算机视觉各类任务评价指标详解一、图像分类&#xff08;Image Classification&#xff09;常用指标1. 准确率&#xff08;Accuracy&#xff09;2. Top-k Accuracy3. 精确率&#xff08;Precision&#xff09;、召回率&#xff08;Recall&#xff09;、F1 分数&#…...

SIEMENS PLC程序解读 -Serialize(序列化)SCATTER_BLK(数据分散)

1、程序数据 第12个字节 PI 2、程序数据 第16个字节 PI 3、程序数据 第76个字节 PO 4、程序代码 2、程序解读 图中代码为 PLC 梯形图&#xff0c;主要包含以下指令及功能&#xff1a; Serialize&#xff08;序列化&#xff09;&#xff1a; 将 SRC_VARIABLE&#xff…...

宁德时代25年时代长安动力电池社招入职测评SHL题库Verify测评语言理解数字推理真题

测试分为语言和数字两部分&#xff0c;测试时间各为17分钟&#xff0c;测试正式开始后不能中断或暂停...

python源码打包为可执行的exe文件

文章目录 简单的方式&#xff08;PyInstaller&#xff09;特点步骤安装 PyInstaller打包脚本得到.exe文件 简单的方式&#xff08;PyInstaller&#xff09; 特点 支持 Python 3.6打包为单文件&#xff08;–onefile&#xff09;或文件夹形式自动处理依赖项 步骤 安装 PyIns…...

数据加密技术:从对称加密到量子密码的原理与实战

数据加密技术&#xff1a;从对称加密到量子密码的原理与实战 在网络安全体系中&#xff0c;数据加密是保护信息机密性、完整性的核心技术。从古代的凯撒密码到现代的量子加密&#xff0c;加密技术始终是攻防博弈的关键战场。本文将深入解析对称加密、非对称加密、哈希函数的核…...

高性能的开源网络入侵检测和防御引擎:Suricata介绍

一、Debian下使用Suricata 相较于Windows&#xff0c;Linux环境对Suricata的支持更加完善&#xff0c;操作也更为便捷。 1. 安装 Suricata 在Debian系统上&#xff0c;你可以通过包管理器 apt 轻松安装 Suricata。 更新软件包列表: sudo apt update安装 Suricata: sudo apt …...

【硬核解析:基于Python与SAE J1939-71协议的重型汽车CAN报文解析工具开发实战】

引言&#xff1a;重型汽车CAN总线的数据价值与挑战 随着汽车电子化程度的提升&#xff0c;控制器局域网&#xff08;CAN总线&#xff09;已成为重型汽车的核心通信网络。不同控制单元&#xff08;ECU&#xff09;通过CAN总线实时交互海量报文数据&#xff0c;这些数据隐藏着车…...

React类组件与React Hooks写法对比

React 类组件 vs Hooks 写法对比 分类类组件&#xff08;Class Components&#xff09;函数组件 Hooks组件定义class Component extends React.Componentconst Component () > {}状态管理this.state this.setState()useState()生命周期componentDidMount, componentDidU…...

Uniapp 自定义 Tabbar 实现教程

Uniapp 自定义 Tabbar 实现教程 1. 简介2. 实现步骤2.1 创建自定义 Tabbar 组件2.2 配置 pages.json2.3 在 App.vue 中引入组件 3. 实现过程中的关键点3.1 路由映射3.2 样式设计3.3 图标处理 4. 常见问题及解决方案4.1 页面跳转问题4.2 样式适配问题4.3 性能优化 5. 扩展功能5.…...

记录一次使用面向对象的C语言封装步进电机驱动

简介 (2025/4/21) 本库对目前仅针对TB6600驱动下的42步进电机的基础功能进行了一定的封装, 也是我初次尝试以面向对象的思想去编写嵌入式代码, 和直流电机的驱动步骤相似在调用stepmotor_attach()函数和stepmotor_init()函数之后仅通过结构体数组stepm然后指定枚举变量中的id即…...

Spark-streaming核心编程

1.导入依赖‌&#xff1a; <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-kafka-0-10_2.12</artifactId> <version>3.0.0</version> </dependency> 2.编写代码‌&#xff1a; 创建Sp…...

Exposure Adjusted Incidence Rate (EAIR) 暴露调整发病率:精准量化疾病风险

1. 核心概念 1.1 传统发病率的局限性 1.1.1 公式与定义 传统发病率公式为新发病例数除以总人口数乘以观察时间。例如在某社区观察1年,有10例新发病例,总人口1000人,发病率即为10/10001=0.01。 此公式假设所有个体暴露时间和风险相同,但实际中个体差异大,如部分人暴露时间…...

vue3+TS+echarts 折线图

需要实现的效果如下 <script setup lang"ts" name"RepsSingleLineChart">import * as echarts from echartsimport { getInitecharts } from /utils/echartimport type { EChartsOption } from echarts// 定义 props 类型interface Props {id: strin…...

MYSQL中为什么不建议delete数据

在 MySQL 中不建议频繁使用 delete 删除数据的原因主要在于性能、数据安全等方面的问题&#xff0c;以下是具体介绍&#xff1a; 性能问题 磁盘空间与碎片&#xff1a;delete 操作只是将数据标记为 “已删除”&#xff0c;并不会立即释放磁盘空间&#xff0c;频繁执行会导致大量…...

Linux多线程技术

什么是线程 在一个程序里的多执行路线就是线程。线程是进程中的最小执行单元&#xff0c;可理解为 “进程内的一条执行流水线”。 进程和线程的区别 进程是资源分配的基本单位&#xff0c;线程是CPU调度的基本单位。 fork创建出一个新的进程&#xff0c;会创建出一个新的拷贝&…...

12个HPC教程汇总!从入门到实战,覆盖分子模拟/材料计算/生物信息分析等多个领域

在科学研究、工程仿真、人工智能和大数据分析等领域&#xff0c;高性能计算 (High Performance Computing, HPC) 正扮演着越来越重要的角色。它通过并行处理、大规模计算资源的整合&#xff0c;极大提升了计算效率&#xff0c;使原本耗时数日的任务能够在数小时内完成。 随着计…...

[OpenGL] Lambertian材质漫反射BRDF方程的解释与推导

一、简介 本文简单的介绍了 Physical Based Rendering, PBR 中的 Lambertian 材质漫反射BRDF公式 f r l a m b e r t i a n c d i f f π fr_{lambertian}\frac{c_{diff}}{\pi} frlambertian​πcdiff​​的推导。 二、漫反射项 根据 渲染方程&#xff1a; L o ( v ) ∫ …...

小火电视桌面TV版下载-小火桌面纯净版下载-官方历史版本安装包

别再费心地寻找小火桌面的官方历史版本安装包啦&#xff0c;试试乐看家桌面吧&#xff0c;它作为纯净版本的第三方桌面&#xff0c;具有诸多优点。 界面简洁纯净&#xff1a;乐看家桌面设计简洁流畅&#xff0c;页面简洁、纯净无广告&#xff0c;为用户打造了一个干净的电视操…...

VSFTPD+虚拟用户+SSL/TLS部署安装全过程(踩坑全通)

Author : Spinach | GHB Link : http://blog.csdn.net/bocai8058文章目录 前言准备配置虚拟用户1.创建虚拟用户列表文件2.生成数据库文件3.设置虚拟用户独立访问权限 配置PAM认证1.创建PAM配置文件2.测试PAM认证 创建虚拟用户映射的系统用户生成SSL/TLS证书配置VSFTPD服务1…...

07 Python 字符串全解析

文章目录 一. 字符串的定义二. 字符串的基本用法1. 访问字符串中的字符2. 字符串切片3. 字符串拼接4. 字符串重复5.字符串比较6.字符串成员运算 三. 字符串的常用方法1. len() 函数2. upper() 和 lower() 方法3. strip() 方法4. replace() 方法5. split() 方法 四. 字符串的进阶…...

androidstudio安装配置

B站配置视频AndroidStudio安装配置教程&#xff08;最新版本教程&#xff09;3分钟搞定 快速安装使用_哔哩哔哩_bilibili 1、环境变量 D:\AndroidSdk ANDROID_HOME ANDROID_SDK_HOME 2、新建 3、配置 distributionUrlhttps://mirrors.cloud.tencent.com/gradle/gradle-8.11.1-…...

全面解析 MCP(Model Context Protocol):AI 大模型的“万能连接器”

一、MCP 的定义与技术定位 **MCP(Model Context Protocol,模型上下文协议)**是由 Anthropic 公司于 2024 年 11 月推出的开源协议,旨在为 AI 大模型与外部数据源、工具之间建立标准化连接通道。它被业界称为 “AI 的 USB-C 接口”,通过统一的通信协议和数据结构,解决大模…...

《AI大模型趣味实战》基于RAG向量数据库的知识库AI问答助手设计与实现

基于RAG向量数据库的知识库AI问答助手设计与实现 引言 随着大语言模型&#xff08;LLM&#xff09;技术的快速发展&#xff0c;构建本地知识库AI问答助手已成为许多企业级应用的需求。本研究报告将详细介绍如何基于FLASK开发一个使用本地OLLAMA大模型底座的知识库AI问答助手&…...

Lua 第8部分 补充知识

8.1 局部变量和代码块 Lua 语言中的变量在默认情况下是全局变量 &#xff0c;所有的局部变量在使用前必须声明 。 与全局变量不同&#xff0c;局部变量的生效范围仅限于声明它的代码块。一个代码块&#xff08; block &#xff09;是一个控制结构的主体&#xff0c;或是一个函…...

正则表达式三剑客之——awk命令

目录 一.什么是awk 二.awk的语法格式 1.选项 2. 模式&#xff08;Pattern&#xff09; 3. 操作&#xff08;Action&#xff09; 4. 输入文件&#xff08;file&#xff09; 5.总结 三.awk的工作原理 1. 逐行扫描输入 2. 匹配模式 1.正则表达式&#xff1a; 2.逻辑…...

BeeWorks Meet:私有化部署视频会议的高效选择

在数字化时代&#xff0c;视频会议已成为企业沟通协作的重要工具。然而&#xff0c;对于金融、政务、医疗等对数据安全和隐私保护要求极高的行业来说&#xff0c;传统的公有云视频会议解决方案往往难以满足其严格的安全标准。此时&#xff0c;BeeWorks Meet 私有化部署视频会议…...