【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 事件标…...

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

【数据可视化-27】全球网络安全威胁数据可视化分析(2015-2024)
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...

【6G 开发】NV NGC
配置 生成密钥 API Keys 生成您自己的 API 密钥,以便通过 Docker 客户端或通过 NGC CLI 使用 Secrets Manager、NGC Catalog 和 Private Registry 的 NGC 服务 以下个人 API 密钥已成功生成,可供此组织使用。这是唯一一次显示您的密钥。 请妥善保管您的…...
计算机视觉各类任务评价指标详解
文章目录 计算机视觉各类任务评价指标详解一、图像分类(Image Classification)常用指标1. 准确率(Accuracy)2. Top-k Accuracy3. 精确率(Precision)、召回率(Recall)、F1 分数&#…...

SIEMENS PLC程序解读 -Serialize(序列化)SCATTER_BLK(数据分散)
1、程序数据 第12个字节 PI 2、程序数据 第16个字节 PI 3、程序数据 第76个字节 PO 4、程序代码 2、程序解读 图中代码为 PLC 梯形图,主要包含以下指令及功能: Serialize(序列化): 将 SRC_VARIABLEÿ…...

宁德时代25年时代长安动力电池社招入职测评SHL题库Verify测评语言理解数字推理真题
测试分为语言和数字两部分,测试时间各为17分钟,测试正式开始后不能中断或暂停...
python源码打包为可执行的exe文件
文章目录 简单的方式(PyInstaller)特点步骤安装 PyInstaller打包脚本得到.exe文件 简单的方式(PyInstaller) 特点 支持 Python 3.6打包为单文件(–onefile)或文件夹形式自动处理依赖项 步骤 安装 PyIns…...
数据加密技术:从对称加密到量子密码的原理与实战
数据加密技术:从对称加密到量子密码的原理与实战 在网络安全体系中,数据加密是保护信息机密性、完整性的核心技术。从古代的凯撒密码到现代的量子加密,加密技术始终是攻防博弈的关键战场。本文将深入解析对称加密、非对称加密、哈希函数的核…...
高性能的开源网络入侵检测和防御引擎:Suricata介绍
一、Debian下使用Suricata 相较于Windows,Linux环境对Suricata的支持更加完善,操作也更为便捷。 1. 安装 Suricata 在Debian系统上,你可以通过包管理器 apt 轻松安装 Suricata。 更新软件包列表: sudo apt update安装 Suricata: sudo apt …...

【硬核解析:基于Python与SAE J1939-71协议的重型汽车CAN报文解析工具开发实战】
引言:重型汽车CAN总线的数据价值与挑战 随着汽车电子化程度的提升,控制器局域网(CAN总线)已成为重型汽车的核心通信网络。不同控制单元(ECU)通过CAN总线实时交互海量报文数据,这些数据隐藏着车…...
React类组件与React Hooks写法对比
React 类组件 vs Hooks 写法对比 分类类组件(Class Components)函数组件 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.导入依赖: <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-kafka-0-10_2.12</artifactId> <version>3.0.0</version> </dependency> 2.编写代码: 创建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 删除数据的原因主要在于性能、数据安全等方面的问题,以下是具体介绍: 性能问题 磁盘空间与碎片:delete 操作只是将数据标记为 “已删除”,并不会立即释放磁盘空间,频繁执行会导致大量…...
Linux多线程技术
什么是线程 在一个程序里的多执行路线就是线程。线程是进程中的最小执行单元,可理解为 “进程内的一条执行流水线”。 进程和线程的区别 进程是资源分配的基本单位,线程是CPU调度的基本单位。 fork创建出一个新的进程,会创建出一个新的拷贝&…...
12个HPC教程汇总!从入门到实战,覆盖分子模拟/材料计算/生物信息分析等多个领域
在科学研究、工程仿真、人工智能和大数据分析等领域,高性能计算 (High Performance Computing, HPC) 正扮演着越来越重要的角色。它通过并行处理、大规模计算资源的整合,极大提升了计算效率,使原本耗时数日的任务能够在数小时内完成。 随着计…...
[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的推导。 二、漫反射项 根据 渲染方程: L o ( v ) ∫ …...

小火电视桌面TV版下载-小火桌面纯净版下载-官方历史版本安装包
别再费心地寻找小火桌面的官方历史版本安装包啦,试试乐看家桌面吧,它作为纯净版本的第三方桌面,具有诸多优点。 界面简洁纯净:乐看家桌面设计简洁流畅,页面简洁、纯净无广告,为用户打造了一个干净的电视操…...
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安装配置教程(最新版本教程)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问答助手设计与实现 引言 随着大语言模型(LLM)技术的快速发展,构建本地知识库AI问答助手已成为许多企业级应用的需求。本研究报告将详细介绍如何基于FLASK开发一个使用本地OLLAMA大模型底座的知识库AI问答助手&…...
Lua 第8部分 补充知识
8.1 局部变量和代码块 Lua 语言中的变量在默认情况下是全局变量 ,所有的局部变量在使用前必须声明 。 与全局变量不同,局部变量的生效范围仅限于声明它的代码块。一个代码块( block )是一个控制结构的主体,或是一个函…...
正则表达式三剑客之——awk命令
目录 一.什么是awk 二.awk的语法格式 1.选项 2. 模式(Pattern) 3. 操作(Action) 4. 输入文件(file) 5.总结 三.awk的工作原理 1. 逐行扫描输入 2. 匹配模式 1.正则表达式: 2.逻辑…...

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