FreeRTOS从入门到精通 第十五章(事件标志组)
参考教程:【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili
一、事件标志组简介
1、概述
(1)事件标志位是一个“位”,用来表示事件是否发生。
(2)事件标志组是一组事件标志位的集合,可以简单的理解事件标志组,是一个整数。
(3)事件标志组的特点:
①每一个位与一个事件相关联,高8位除外,高8位用作存储事件标志组的控制信息。(下图所示的是32 位长度的事件标志组)

②每一位事件的含义,以及高电平和低电平分别代表什么,由用户自己决定。
③任意任务或中断都可以读写这些位。
④可以等待某一位成立,或者等待多位同时成立。
(4)一个事件组就包含了一个EventBits_t数据类型的变量,变量类型EventBits_t的定义如下所示,它实际上是一个16位或32位无符号的数据类型。
typedef TickType_t EventBits_t;
#if ( configUSE_16_BIT_TICKS == 1 )typedef uint16_t TickType_t;
#elsetypedef uint32_t TickType_t;
#endif
#define configUSE_16_BIT_TICKS 0
(5)事件标志组与队列、信号量的区别:
| 功能 | 唤醒对象 | 事件清除 |
| 队列、信号量 | 事件发生时,只会唤醒一个任务 | 是消耗型的资源,队列的数据被读走就没了;信号量被获取后就减少了 |
| 事件标志组 | 事件发生时,会唤醒所有符合条件的任务,可以理解为“广播”的作用 | 被唤醒的任务有两个选择,可以让事件保留不动,也可以清除事件 |
2、事件标志组相关API函数介绍
(1)事件标志组相关API函数概览:
| 函数 | 描述 |
| xEventGroupCreate() | 使用动态方式创建事件标志组 |
| xEventGroupCreateStatic() | 使用静态方式创建事件标志组 |
| xEventGroupClearBits() | 清零事件标志位 |
| xEventGroupClearBitsFromISR() | 在中断中清零事件标志位 |
| xEventGroupSetBits() | 设置事件标志位 |
| xEventGroupSetBitsFromISR() | 在中断中设置事件标志位 |
| xEventGroupWaitBits() | 等待事件标志位 |
| xEventGroupSync() | 设置事件标志位,并等待另一个事件标志位【A事件完成,同时还要等待B事件发生】 |
(2)xEventGroupCreate函数:
①函数定义:
EventGroupHandle_t xEventGroupCreate
(void
)
②返回值:
| 返回值 | 描述 |
| NULL | 事件标志组创建失败 |
| 其它值 | 事件标志组创建成功,返回其句柄 |
(3)xEventGroupClearBits函数:
①函数定义:
EventBits_t xEventGroupClearBits
(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToClear
)
②函数参数:
| 形参 | 描述 |
| xEventGroup | 待操作的事件标志组句柄 |
| uxBitsToSet | 待清零的事件标志位 |
③返回值:
| 返回值 | 描述 |
| 整数 | 清零事件标志位之前事件组中事件标志位的值 |
(4)xEventGroupSetBits函数:
①函数定义:
EventBits_t xEventGroupSetBits
(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToClear
)
②函数参数:
| 形参 | 描述 |
| xEventGroup | 待操作的事件标志组句柄 |
| uxBitsToSet | 待设置的事件标志位 |
③返回值:
| 返回值 | 描述 |
| 整数 | 函数返回时,事件组中的事件标志位值 |
(5)xEventGroupWaitBits函数:
①函数定义:
EventBits_t xEventGroupWaitBits
(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToWaitFor,const BaseType_t xClearOnExit,const BaseType_t xWaitForAllBits,TickType_t xTicksToWait
)
②函数参数:
| 形参 | 描述 |
| xEvenrGroup | 等待的事件标志组句柄 |
| uxBitsToWaitFor | 等待的事件标志位,可以用逻辑或等待多个事件标志位 |
| xClearOnExit | 成功等待到事件标志位后,清除事件组中对应的事件标志位, pdTRUE :清除uxBitsToWaitFor指定位; pdFALSE:不清除 |
| xWaitForAllBits | 等待 uxBitsToWaitFor 中的所有事件标志位(逻辑与) pdTRUE:等待的位,全部为1 pdFALSE:等待的位,某个为1 |
| xTicksToWait | 等待的阻塞时间 |
③返回值:
| 返回值 | 描述 |
| 等待的事件标志位值 | 等待事件标志位成功,返回等待到的事件标志位 |
| 其它值 | 等待事件标志位失败,返回事件组中的事件标志位 |
(6)xEventGroupSync函数:
①函数定义:
EventBits_t xEventGroupSync
(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet,const EventBits_t uxBitsToWaitFor,TickType_t xTicksToWait
)
②函数参数:
| 形参 | 描述 |
| xEventGroup | 等待事件标志所在事件组 |
| uxBitsToSet | 达到同步点后,要设置的事件标志 |
| uxBitsToWaitFor | 等待的事件标志 |
| xTicksToWait | 等待的阻塞时间 |
③返回值:
| 返回值 | 描述 |
| 等待的事件标志位值 | 等待事件标志位成功,返回等待到的事件标志位 |
| 其它值 | 等待事件标志位失败,返回事件组中的事件标志位 |
二、事件标志组实验
1、原理图与实验目标
(1)原理图(串口外设的接法与列表项的插入和删除实验相同,下图未示出):

(2)实验目标:
①设计3个任务——start_task、task1、task2:
[1]start_task:用于创建其它三个任务,并创建事件标志组。
[2]task1:读取按键按下键值,根据不同键值将事件标志组相应事件位置1,模拟事件发生(按下某个按键,对应的标志位置1)。
[3]task2:同时等待事件标志组中的多个事件位,当这些事件位都置1的话就执行相应的处理(串口打印信息),同时清除标志位。
②预期实验现象:
[1]程序下载到板子上后,暂时没有任何现象。
[2]按下相关按键,串口会输出相应的信息。
2、实验步骤
(1)将“队列集操作实验”的工程文件夹复制一份,在拷贝版中进行实验。
(2)更改FreeRTOS_experiment.c文件的内容,如下所示。
#include "FreeRTOS.h"
#include "task.h"
#include "LED.h"
#include "Key.h"
#include "Serial.h"
#include "queue.h"
#include "semphr.h"
#include "event_groups.h"//宏定义
#define START_TASK_STACK_SIZE 128 //start_task任务的堆栈大小
#define START_TASK_PRIO 1 //start_task任务的优先级
#define TASK1_STACK_SIZE 128 //task1任务的堆栈大小
#define TASK1_PRIO 2 //task1任务的优先级
#define TASK2_STACK_SIZE 128 //task2任务的堆栈大小
#define TASK2_PRIO 3 //task2任务的优先级#define EVENTBIT_0 (1 << 0) //用该宏时表示希望事件标志组的bit0位置为1
#define EVENTBIT_1 (1 << 1) //用该宏时表示希望事件标志组的bit1位置为1EventGroupHandle_t eventgroup_handle; //定义事件标志组句柄//任务函数声明
void start_task(void);
void task1(void);
void task2(void);//任务句柄
TaskHandle_t start_task_handler; //start_task任务的句柄
TaskHandle_t task1_handler; //task1任务的句柄
TaskHandle_t task2_handler; //task2任务的句柄QueueSetHandle_t queueset_handle;void FreeRTOS_Test(void)
{//创建任务start_taskxTaskCreate((TaskFunction_t)start_task, //指向任务函数的指针"start_task", //任务名字START_TASK_STACK_SIZE, //任务堆栈大小,单位为字NULL, //传递给任务函数的参数START_TASK_PRIO, //任务优先级(TaskHandle_t *) &start_task_handler //任务句柄,就是任务的任务控制块);//开启任务调度器vTaskStartScheduler();
}void start_task(void)
{taskENTER_CRITICAL();eventgroup_handle = xEventGroupCreate(); //创建事件标志组if(eventgroup_handle != NULL){Serial_Printf("事件标志组创建成功!!\r\n");}xTaskCreate((TaskFunction_t) task1,(char *) "task1",(configSTACK_DEPTH_TYPE) TASK1_STACK_SIZE,(void *) NULL,(UBaseType_t) TASK1_PRIO,(TaskHandle_t *) &task1_handler );xTaskCreate((TaskFunction_t) task2,(char *) "task2",(configSTACK_DEPTH_TYPE) TASK2_STACK_SIZE,(void *) NULL,(UBaseType_t) TASK2_PRIO,(TaskHandle_t *) &task2_handler );vTaskDelete(NULL);taskEXIT_CRITICAL();
}void task1(void)
{uint8_t key = 0;while(1) {key = Key_GetNum();if(key == 1){//将事件标志组的bit0位置1xEventGroupSetBits(eventgroup_handle, EVENTBIT_0);}else if(key == 2){//将事件标志组的bit1位置1xEventGroupSetBits(eventgroup_handle, EVENTBIT_1);}vTaskDelay(10);}
}void task2(void)
{EventBits_t event_bit = 0;while(1){event_bit = xEventGroupWaitBits(eventgroup_handle, //事件标志组句柄EVENTBIT_0 | EVENTBIT_1, //等待事件标志组的bit0和bit1位均置1pdTRUE, //等待到事件标志位后,清除事件标志组的bit0和bit1位pdTRUE, //等待事件标志组的bit0和bit1位都置1,就成立portMAX_DELAY ); //死等Serial_Printf("等待到的事件标志位值为:%#x\r\n",event_bit);}
}
(3)程序完善好后点击“编译”,然后将程序下载到开发板上,打开串口助手分析信息。
3、程序执行流程
(1)main函数全流程:
①初始化串口模块。
②调用FreeRTOS_Test函数。

(2)测试函数全流程:
①创建任务start_task。
②开启任务调度器。

(3)多任务调度执行阶段较为简单,这里不再赘述。
相关文章:
FreeRTOS从入门到精通 第十五章(事件标志组)
参考教程:【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili 一、事件标志组简介 1、概述 (1)事件标志位是一个“位”,用来表示事件是否发生。 (2)事件标志组是一组事件标志位的集合&#x…...
智慧园区管理平台实现智能整合提升企业运营模式与管理效率
内容概要 在当今数字化的背景下,智慧园区管理平台正逐渐成为企业提升运营效率和管理模式的重要工具。这个平台汇聚了多种先进技术,旨在通过智能整合各类资源与信息,帮助企业实现全面的管理创新。 智慧园区管理平台不仅仅是一个数据处理工具…...
markdown公式特殊字符
个人学习笔记 根号 在 Markdown 中,要表示根号 3,可以使用 LaTeX 语法来实现。常见的有以下两种方式: 行内公式形式:使用一对美元符号 $ 将内容包裹起来,即 $\sqrt{3}$ ,在支持 LaTeX 语法渲染的 Markdow…...
【深度分析】微软全球裁员计划不影响印度地区,将继续增加当地就业机会
当微软的裁员刀锋掠过全球办公室时,班加罗尔的键盘声却愈发密集——这场资本迁徙背后,藏着数字殖民时代最锋利的生存法则。 表面是跨国公司的区域战略调整,实则是全球人才市场的地壳运动。微软一边在硅谷裁撤年薪20万美金的高级工程师&#x…...
学习数据结构(5)单向链表的实现
(1)头部插入 (2)尾部删除 (3)头部删除 (4)查找 (5)在指定位置之前插入节点 (6)在指定位置之后插入节点 (7)删除…...
刷题记录 HOT100回溯算法-5:22. 括号生成
题目:22. 括号生成 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n 3 输出:["((()))","(()())","(())()",…...
Keepalived高可用集群企业应用实例二
一、实现ipvs的高可用性 ipvs相关配置 虚拟服务器配置结构: virtual_server ip port { …… real_server { …… } real_server { …… } } virtual server (虚拟服务器)的定义格式 virtual_server ip port 定义虚拟主机ip地址及其端口 virtual_server …...
C++计算特定随机操作后序列元素乘积的期望
有一个长度为 n n n的序列 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an。初始序列的所有元素均为 0 0 0。再给定正整数 m m m、 c c c和 ( n − m 1 ) (n-m1) (n−m1)个正整数 b 1 , b 2 , . . . , b n − m 1 b_1,b_2,...,b_{n-m1} b1,b2,...,bn−m1…...
c++字母大小写转换
可以通过标准库中的 <algorithm> 和 <cctype> 头文件来实现大小写转换。以下是常用的方法: 1. 使用 std::transform 和 std::toupper/std::tolower 1.1 转换为大写 #include <iostream> #include <string> #include <algorithm> //…...
MySQL知识点总结(十六)
请说明在复制拓扑中,中继日志集和从属服务器状态日志的作用。 中继日志用来保存从主服务器接受的二进制日志,与二进制日志相同的格式存储,由服务器自动管理,在其全部内容重放后会自动删除。 从属服务器状态日志存储关于如何连接…...
Windows程序设计10:文件指针及目录的创建与删除
文章目录 前言一、文件指针是什么?二、设置文件指针的位置:随机读写,SetFilePointer函数1.函数说明2.函数实例 三、 目录的创建CreateDirectory四、目录的删除RemoveDirectory总结 前言 Windows程序设计10:文件指针及目录的创建与…...
geolocator包的功能和用法
文章目录 1 概念介绍2 使用方法3 示例代码4 体验分享 我们在上一章回中介绍了如何实现滑动菜单相关的内容,本章回中将介绍如何获取位置信息.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里说的获取位置信息本质上是获取当前手机所在位置的…...
Node.js——body-parser、防盗链、路由模块化、express-generator应用生成器
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...
22.Word:小张-经费联审核结算单❗【16】
目录 NO1.2 NO3.4 NO5.6.7 NO8邮件合并 MS搜狗输入法 NO1.2 用ms打开文件,而不是wps❗不然后面都没分布局→页面设置→页面大小→页面方向→上下左右:页边距→页码范围:多页:拼页光标处于→布局→分隔符:分节符…...
Agent 高频知识汇总:查漏补缺参考大全
Agent 高频问题汇总 一、基础概念类 (一)请解释 Agent 的概念及其主要特点 Agent 是一种能够感知所处环境,并基于感知信息做出决策、采取行动以实现特定目标的实体。它既可以是简单的规则基系统,也能是复杂的智能体,…...
本地化部署DeepSeek-R1
本文环境搭建均基于免费工具,感谢开源。 一、下载工具并安装 1. Ollama:最新版本 0.5.7 官网在这里 https://ollama.com/download 但是下载太慢,得换个思路 https://sourceforge.net/projects/ollama.mirror/ 2.Chatbox https://cha…...
验证二叉搜索数(98)
98. 验证二叉搜索树 - 力扣(LeetCode) 解法: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …...
StarRocks BE源码编译、CLion高亮跳转方法
阅读SR BE源码时,很多类的引用位置爆红找不到,或无法跳转过去,而自己的Linux机器往往缺乏各种C依赖库,配置安装比较麻烦,因此总体的思路是通过CLion远程连接SR社区已经安装完各种依赖库的Docker容器,进行编…...
数模测评:doubao1.5>deepseek-v3>gpt-o1
本次测试了当前评价最高的三款大模型doubao1.5、gpt-o1、deepseek-v3(r1崩溃),都是采用无提示词的硬核提问方式,测试视频如下。 gpto1、doubao1.5、deepseek测评 测试方式: 上传美赛六道题目文件 直接提问以下5句话: 这是一道数学…...
晴,初三,年已过
既然直播如此影响情绪,为什么还要直播?因为无聊?明明那么多事情可以打发时间。 真不想懂。 今日初三,昨天晚上小舅家聚,今天大舅家聚,计划明天小姨妈家聚。 今晚喝了点大舅哥哥泡的白葡萄酒,…...
ESXi 7.0升级后Windows Server 2022启动报错?解决安全引导与驱动兼容性实战
ESXi 7.0升级后Windows Server 2022启动报错的深度解决方案 当你在一台运行ESXi 7.0的ThinkSystem服务器上部署了Windows Server 2022虚拟机,突然某天系统更新后虚拟机无法启动,屏幕上赫然显示"找不到磁盘"的错误信息——这种场景对于任何中级…...
量子网络模拟器SeQUeNCe的并行化设计与性能优化
1. 量子网络模拟的工程挑战与SeQUeNCe的定位量子网络正逐步从理论走向工程实践,其核心价值在于利用量子纠缠特性实现传统通信无法企及的安全性和计算能力。但在实际部署前,工程师们面临一个关键问题:如何验证包含数百个量子节点的网络设计方案…...
ChatTTS开源对话式语音合成:情感控制与实战部署指南
1. 项目概述:从文本到语音的“情感”革命最近在语音合成圈子里,一个名为ChatTTS的项目热度持续攀升。作为一个长期关注语音技术发展的从业者,我最初也被它“高质量、多语言、可控性强”的描述所吸引。但真正上手后才发现,这个项目…...
【ElevenLabs有声书量产指南】:从零到上线的7步闭环流程(含避坑清单+API调优参数)
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs有声书量产的底层逻辑与场景定位 ElevenLabs 的有声书量产并非简单调用 TTS API,而是依托其神经语音建模、上下文感知韵律合成与批量异步编排三重能力构建的工业化流水线。其底层…...
AI圈内两大热词 Agent 和 Skill,一文彻底搞懂它们之间的区别与联系!
本文以餐厅经理和厨师的类比,解释了 Agent 和 Skill 的核心区别:Agent 拥有决策权,决定下一步做什么;Skill 则负责执行具体任务。文章指出,尽管在实际应用中两者界限逐渐模糊,但在构建 AI 系统时࿰…...
在Windows电脑上体验酷安社区:酷安UWP桌面版完全指南
在Windows电脑上体验酷安社区:酷安UWP桌面版完全指南 【免费下载链接】Coolapk-UWP 一个基于 UWP 平台的第三方酷安客户端 项目地址: https://gitcode.com/gh_mirrors/co/Coolapk-UWP 你是否曾经想过,如果能在电脑上刷酷安会是怎样的体验…...
2026届学术党必备的六大AI论文工具推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 撰写AI毕业论文之时,需一直坚守学术伦理底线,严格禁止直接靠着生成式…...
光伏产业价值链迁移:从硬件制造到系统服务与金融创新的黄金机遇
1. 光伏行业的价值转移:从硬件制造到系统服务十年前,当我在深圳第一次接触光伏组件生产线时,满眼都是硅料、银浆和层压机,行业里人人谈论的是转换效率又提升了零点几个百分点,或是每瓦成本又降了几分钱。那时候&#x…...
Aura包管理器与Faur元数据服务器:了解Arch Linux包管理的终极解决方案
Aura包管理器与Faur元数据服务器:了解Arch Linux包管理的终极解决方案 【免费下载链接】aura A multilingual package manager for Arch Linux and the AUR. 项目地址: https://gitcode.com/gh_mirrors/aur/aura Aura是一个多语言包管理器,专为Ar…...
从零开始使用Taotoken为你的爬虫项目添加AI解析功能
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 从零开始使用Taotoken为你的爬虫项目添加AI解析功能 在数据采集项目中,我们常常会遇到非结构化或半结构化的网页内容。…...
