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

31-ESP32-S3-WIFI篇-02 Event Group (事件标记组)

ESP32-S3-WIFI 事件标记组

介绍

在ESP32-S3的WiFi驱动程序中,事件标记组(Event Group)是一个非常重要的概念。它是FreeRTOS中的一种同步机制,用于在任务之间传递和同步事件。在WiFi驱动程序中,我们使用事件标记组来通知不同的任务有关WiFi状态的变化。

在上一篇文章我们在Event_loop(定义事件处理程序其实就是event task任务)针对id,分别创建wifi_scan_taskwifi_show_task两个任务来执行相应的功能,那这时我们共创建了3个app task,造成了任务滥用的情况,那我们可以把这三个任务合在一起吗,当然可以,这就要用到Free RTOS 中的Event Group机制了。需要注意Event loop是ESP中的概念,而Event Group是Free RTOS 中的概念。

WiFi事件标记组的创建

在初始化WiFi驱动程序时,我们会创建一个事件标记组。这个事件标记组将被用来存储WiFi的状态信息。

EventGroupHandle_t wifi_event_group;void app_main(void)
{wifi_event_group = xEventGroupCreate();}

WiFi事件的处理

当WiFi状态发生变化时,例如连接到AP,断开连接,获取IP等,WiFi驱动程序会通过调用xEventGroupSetBits函数来设置相应的事件标记,xEventGroupSetBits函数第一个参数是事件标记组的句柄,第二个参数是要设置的位。

void event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data)
{if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {xEventGroupSetBits(wifi_event_group, WIFI_CONNECT_BIT);} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {xEventGroupSetBits(wifi_event_group, WIFI_DISCONNECT_BIT);} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {xEventGroupSetBits(wifi_event_group, WIFI_GOT_IP_BIT);}
}

WiFi事件的检查

在其他任务中,我们可以通过调用xEventGroupWaitBits函数来等待特定的WiFi事件xEventGroupWaitBits函数第一个参数是事件标记组的句柄,第二个参数是我们关心的位,第三个参数决定是否在返回前清除这些位,第四个参数决定是否需要所有的位都被设置,第五个参数是等待的最大时间,而返回值可以用来判断哪些位被设置了。

void task_function(void *pvParameters)
{EventBits_t bits = xEventGroupWaitBits(wifi_event_group,WIFI_CONNECT_BIT | WIFI_DISCONNECT_BIT | WIFI_GOT_IP_BIT,pdFALSE,pdFALSE,portMAX_DELAY);if (bits & WIFI_CONNECT_BIT) {printf("WiFi connected\n");} else if (bits & WIFI_DISCONNECT_BIT) {printf("WiFi disconnected\n");} else if (bits & WIFI_GOT_IP_BIT) {printf("Got IP address\n");}
}

总结

🚨需要注意
在FreeRTOS中,事件标记组的位数取决于configUSE_16_BIT_TICKS的设置。如果configUSE_16_BIT_TICKS设置为1,那么事件标记组中的位数为8位。如果configUSE_16_BIT_TICKS设置为0,那么事件标记组中的位数为24位。

📚参考资料
freertos官方编程手册
微软copilot

相关文章:

  • c语言是编程软件还是编程语言?深入解析C语言的本质与定位
  • 【C语言】基于C语言实现的贪吃蛇游戏
  • 【VSCode】快捷方式log去掉分号
  • 修改ModelLink在RTX3090完成预训练、微调、推理、评估以及TRT-LLM转换、推理、性能测试
  • el-date-picker的使用,及解决切换type时面板样式错乱问题
  • 1.8k Star!RAGApp:在任何企业中使用 Agentic RAG 的最简单方法!
  • ADB日常使用命令
  • 大国之间的互联网博弈:新时代的战略竞争
  • vue-table的使用,解决懒加载展开列,数据量过大,造成的卡顿问题
  • 12 FreeRTOS 调试与优化
  • Flutter 中的 SliverPrototypeExtentList 小部件:全面指南
  • TiDB-从0到1-分布式事务
  • 蓝桥杯2024国赛--备赛刷题题单
  • Linux--进程间通信(1)(匿名管道)
  • LabVIEW软件需求分析文档内容和编写指南
  • 【css3】浏览器内核及其兼容性
  • 77. Combinations
  • Angular Elements 及其运作原理
  • CSS 三角实现
  • CSS居中完全指南——构建CSS居中决策树
  • echarts的各种常用效果展示
  • egg(89)--egg之redis的发布和订阅
  • HTTP--网络协议分层,http历史(二)
  • JAVA多线程机制解析-volatilesynchronized
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Terraform入门 - 1. 安装Terraform
  • 成为一名优秀的Developer的书单
  • 简单实现一个textarea自适应高度
  • 如何进阶一名有竞争力的程序员?
  • 系统认识JavaScript正则表达式
  •  一套莫尔斯电报听写、翻译系统
  • 应用生命周期终极 DevOps 工具包
  • ionic异常记录
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二十四)Flask之flask-session组件
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (三)SvelteKit教程:layout 文件
  • (三十五)大数据实战——Superset可视化平台搭建
  • (十一)图像的罗伯特梯度锐化
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • ***监测系统的构建(chkrootkit )
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复