【FreeRTOS】事件标志组

news2025/7/31 8:53:46

文章目录

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

任务同步咋使用呢?

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

在日常生活中&#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;可供此组织使用。这是唯一一次显示您的密钥。 请妥善保管您的…

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与SAE J1939-71协议的重型汽车CAN报文解析工具开发实战】

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

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…

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…

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

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

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

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

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

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

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

IPv6 技术细节 | 源 IP 地址选择 / Anycast / 地址自动配置 / 地址聚类分配

注&#xff1a;本文为 “IPv6 技术细节” 相关文章合集。 部分文章中提到的其他文章&#xff0c;一并引入。 略作重排&#xff0c;未整理去重。 如有内容异常&#xff0c;请看原文。 闲谈 IPv6 - 典型特征的一些技术细节 iteye_21199 于 2012-11-10 20:54:00 发布 0. 巨大的…

【工具】使用 MCP Inspector 调试服务的完全指南

Model Context Protocol (MCP) Inspector 是一个交互式开发工具&#xff0c;专为测试和调试 MCP 服务器而设计。本文将详细介绍如何使用 Inspector 工具有效地调试和测试 MCP 服务。 1. MCP Inspector 简介 MCP Inspector 提供了直观的界面&#xff0c;让开发者能够&#xff…

【音视频】AVIO输入模式

内存IO模式 AVIOContext *avio_alloc_context( unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t (*seek)(…

Uniapp:scroll-view(区域滑动视图)

目录 一、基本概述二、属性说明三、基本使用3.1 纵向滚动3.2 横向滚动一、基本概述 scroll-view,可滚动视图区域。用于区域滚动。 二、属性说明 属性名类型默认值说明平台差异说明scroll-xBooleanfalse允许横向滚动scroll-yBooleanfalse允许纵向滚动三、基本使用 3.1 纵向滚…

单精度浮点运算/定点运算下 MATLAB (VS) VIVADO

VIVADO中单精度浮点数IP核计算结果与MATLAB单精度浮点数计算结果的对比 MATLAB定点运算仿真&#xff0c;对比VIVADO计算的结果 目录 前言 一、VIVADO与MATLAB单精度浮点数运算结果对比 二、MATLAB定点运算仿真 总结 前言 本文介绍了怎么在MATLAB中使用单精度浮点数进行运算…

【AI插件开发】Notepad++ AI插件开发1.0发布和使用说明

一、产品简介 AiCoder是一款为Notepad设计的轻量级AI辅助插件&#xff0c;提供以下核心功能&#xff1a; 嵌入式提问&#xff1a;对选中的文本内容进行AI分析&#xff0c;通过侧边栏聊天界面与AI交互&#xff0c;实现多轮对话、问题解答或代码生成。对话式提问&#xff1a;独…