32-ESP32-S3-WIFI篇-03 Event Loop (事件循环)

ESP32-S3-WIFI 事件循环

介绍

在ESP32-S3的WiFi驱动程序中,事件循环是一个非常重要的概念。事件循环是一个无限循环,用于处理和分发系统中发生的各种事件。在WiFi驱动程序中,我们使用事件循环来处理和分发WiFi相关的事件。

创建事件循环

在初始化WiFi驱动程序时,我们会创建一个事件循环。这个事件循环将被用来处理和分发WiFi的事件。

  • esp_event_loop_args_t:这个结构体,用于指定事件循环的属性,
  • esp_event_loop_create():这个函数用于创建一个事件循环。它接受一个esp_event_loop_args_t类型的参数,用于指定事件循环的属性,然后返回一个esp_event_loop_handle_t类型的句柄,这个句柄可以用来引用事件循环
// 定义事件循环句柄
esp_event_loop_handle_t event_loop;void app_main(void)
{// 定义事件循环参数esp_event_loop_args_t event_loop_args = {.queue_size = 5,  // 事件队列的大小.task_name = "wifi_event_loop",  // 事件循环任务的名称.task_priority = ESP_TASK_MAIN_PRIO,  // 事件循环任务的优先级.task_stack_size = 2048,  // 事件循环任务的堆栈大小.task_core_id = tskNO_AFFINITY  // 事件循环任务运行的CPU核心ID};// 创建事件循环esp_event_loop_create(&event_loop_args, &event_loop);...
}

注册事件处理函数

在事件循环中,我们可以注册事件处理函数。当特定的事件发生时,相应的事件处理函数就会被调用。

// 定义事件处理函数
void event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data)
{// 根据事件的类型和ID进行相应的处理...
}void app_main(void)
{...// 将事件处理函数注册到事件循环中esp_event_handler_register_with(event_loop,WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL);
}

运行事件循环

事件循环在一个单独的任务中运行。当事件发生时,事件循环会调用相应的事件处理函数。

esp_event_loop_run():这个函数用于运行事件循环。它会在一个无限循环中等待事件的发生,然后调用相应的事件处理函数。

void app_main(void)
{...// 运行事件循环while (true) {esp_event_loop_run(event_loop, portMAX_DELAY);}
}

WiFi事件循环示例

这个程序中,我们创建一个WiFi STA(Station模式)并连接到一个AP(Access Point)。

#include "esp_event.h"
#include "esp_wifi.h"// 定义WiFi STA的SSID和密码
#define WIFI_SSID "your_ssid"
#define WIFI_PASSWORD "your_password"// 定义事件处理函数
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) {// WiFi STA已经启动,开始连接到APesp_wifi_connect();} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {// WiFi STA已经断开连接,重新连接到APesp_wifi_connect();} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {// WiFi STA已经获取到IP地址ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;printf("Got IP: %s\n", ip4addr_ntoa(&event->ip_info.ip));}
}void app_main(void)
{// 初始化ESP-IDF的事件库esp_event_loop_args_t event_loop_args = {.queue_size = 5,.task_name = "wifi_event_loop",.task_priority = ESP_TASK_MAIN_PRIO,.task_stack_size = 2048,.task_core_id = tskNO_AFFINITY};esp_event_loop_handle_t event_loop;esp_event_loop_create(&event_loop_args, &event_loop);// 初始化WiFi驱动程序wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();esp_wifi_init(&cfg);// 设置WiFi为STA模式esp_wifi_set_mode(WIFI_MODE_STA);// 设置WiFi STA的SSID和密码wifi_config_t wifi_config = {.sta = {.ssid = WIFI_SSID,.password = WIFI_PASSWORD,},};esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config);// 将事件处理函数注册到自定义的事件循环中esp_event_handler_register_with(event_loop, WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL);esp_event_handler_register_with(event_loop, IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL);// 启动WiFiesp_wifi_start();// 运行事件循环while (true) {esp_event_loop_run(event_loop, portMAX_DELAY);}
}

这个例子中,我们首先初始化了ESP-IDF的事件库和WiFi驱动程序,然后设置WiFi为STA模式,并设置了WiFi STA的SSID和密码。然后,我们注册了一个事件处理函数,用于处理WiFi的事件。最后,我们启动了WiFi,并运行了事件循环。

在事件处理函数中,我们处理了三种事件:WiFi STA启动,WiFi STA断开连接,和WiFi STA获取到IP地址。当WiFi STA启动时,我们开始连接到AP。当WiFi STA断开连接时,我们重新连接到AP。当WiFi STA获取到IP地址时,我们打印出获取到的IP地址。

总结

事件循环是ESP32-S3 WiFi驱动程序中的一个重要概念,它使我们能够在任务之间同步和传递WiFi状态信息。

🚨需要注意在ESP-IDF中,esp_event_loop_create()esp_event_loop_run()函数是用于创建和运行用户定义的事件循环。然而,ESP-IDF也提供了一个默认的事件循环,这个默认的事件循环在系统启动时就已经被创建,并且在系统运行期间一直在后台运行。

因此,如果你的应用程序只需要处理一些常见的系统事件(例如WiFi事件),那么你可以直接使用默认的事件循环,而不需要自己创建和运行事件循环。你只需要使用esp_event_handler_register()函数将你的事件处理函数注册到默认的事件循环中,然后当相应的事件发生时,你的事件处理函数就会被调用。

但是,如果你的应用程序需要处理一些特殊的事件,或者你需要更细粒度的控制事件的处理,那么你可以创建和运行你自己的事件循环。你可以使用esp_event_loop_create()函数创建你自己的事件循环,然后使用esp_event_loop_run()函数在一个单独的任务中运行你的事件循环,但此时要使用esp_event_handler_register_with()将你的事件处理函数注册到默认的事件循环中。

📚参考资料
乐鑫编程指南-事件循环库

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

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

相关文章

PTA 7-10 构造二叉检索树

本题目构造一棵二叉检索树。要求读入n个整数,以0结束。最后输出这棵树的先序序列。 输入格式: 输入n个整数,以0表示结束,数据间以空格隔开。 输出格式: 输出这棵树的先序序列,以一个空格隔开,结尾也有一个空格。 …

常用电机测试方法的介绍与功能实现(M测试方法)

目录 概述 1 常用电机测速方法简介 1.1 方法概览 1.2 编码器测速方法 2 M法测速 2.1 理论描述 2.2 实现原理 2.3 速度计算方法 3 功能实现 3.1 功能介绍 3.2 代码实现 3.2.1 使用STM32Cube配置参数 3.2.2 脉冲计数功能 3.2.3 测速函数 4 测试 概述 本文主要介绍…

springboot针对返回的response拦截处理越权问题

背景:针对越权测试,通过拦截工具Fiddler修改请求参数,越权查看平台里面所有公司的数据 1、自定义MyResponseBodyAdvice 实现ResponseBodyAdvice 使用过滤器和拦截我都试过,最终没有成功,可能技术比较菜,这…

策略模式解析

import java.util.*; enum TYPE { NORMAL,CASH_DISCOUNT,CASH_RETURN}; interface Cashsuper { public double acceptCash(double money); } class CashNormal implements CashSuper{// 正常收费子类 public double accptCash(double money){ return money; …

C# Winform 已知窗体句柄,如何遍历出所有控件句柄

c# windform 已知窗体句柄&#xff0c;如何遍历出所有控件句柄 public delegate bool CallBack(int hwnd, int lParam);public delegate bool EnumWindowsProc(int hWnd, int lParam); List<string> list new List<string>();[DllImport("user32.dll")]…

通过MySQL JSON函数实现对GSON字段属性的搜索和筛选

在 MySQL 中直接对 Gson 格式的字段进行搜索是有一定的限制的&#xff0c;因为 MySQL 不支持直接解析和操作 JSON 或 Gson 数据。不过你可以使用一些函数来模拟实现对 Gson 字段内部某个属性的搜索&#xff0c;比如使用 LIKE 来做模糊匹配。 假设你的表名为 gson_table&#x…

GPT-4o版本间的对比分析和使用心得

GPT-4o&#xff1a;对人工智能领域的新贡献 GPT-4o是OpenAI最新发布的语言模型&#xff0c;相比于其前身GPT-4和更早的版本GPT-3&#xff0c;具有显著的改进和增强。以下是对GPT-4o的详细评价&#xff0c;包括版本间的对比分析、技术能力的提升&#xff0c;以及我在实际使用过…

黑马一站制造数仓实战2

问题 DG连接问题 原理&#xff1a;JDBC&#xff1a;用Java代码连接数据库 Hive/SparkSQL&#xff1a;端口有区别 可以为同一个端口&#xff0c;只要不在同一台机器 项目&#xff1a;一台机器 HiveServer&#xff1a;10000 hiveserver.port 10000 SparkSQL&#xff1a;10001…

谈谈Android AOP技术方案

先统一一下基本名词&#xff0c;以便表述。 切面&#xff1a;对一类行为的抽象&#xff0c;是切点的集合&#xff0c;比如在用户访问所有模块前做的权限认证。 切点&#xff1a;描述切面的具体的一个业务场景。 通知&#xff08;Advice&#xff09;类型&#xff1a;通常分为切…

一维时间序列信号的广义傅里叶族变换(Matlab)

广义傅里叶族变换是一种时频变换方法&#xff0c;傅里叶变换、短时傅里叶变换、S变换和许多小波变换都是其特殊情况&#xff0c;完整代码及子函数如下&#xff0c;很容易读懂&#xff1a; % Run a demo by creating a signal, transforming it, and plotting the results% Cre…

不同厂商SOC芯片在视频记录仪领域的应用

不同SoC公司芯片在不同产品上的应用信息&#xff1a; 大唐半导体 芯片型号: LC1860C (主控) LC1160 (PMU)产品应用: 红米2A (399元)大疆晓Spark技术规格: 28nm工艺&#xff0c;4个ARM Cortex-A7处理器&#xff0c;1.5GHz主频&#xff0c;2核MaliT628 GPU&#xff0c;1300万像…

计算属性与监听属性

【 1 】计算属性 计算属性大致就是这样 # 1 计算属性是基于它们的依赖进行缓存的# 2 计算属性只有在它的相关依赖发生改变时才会重新求值# 3 计算属性就像Python中的property&#xff0c;可以把方法/函数伪装成属性 # 计算属性本质上是一个函数&#xff0c;它们可以通过 get…

数据隐私新篇章:Facebook如何保护用户信息

随着数字化时代的到来&#xff0c;数据隐私保护成为了社交媒体平台和用户共同关注的焦点。作为全球最大的社交网络之一&#xff0c;Facebook一直致力于保护用户的隐私和数据安全。本文将深入探讨Facebook在数据隐私保护方面的措施和实践&#xff0c;以及其如何开启数据隐私的新…

vue实现简易基本对话功能

基于vue3.0实现的功能&#xff0c;仿照微信、QQ聊天界面。 HTML代码块 <template><el-container style"height: 100%" ref"bodyform"><div class"el_main_content"><div class"main_content_header">这是一…

Git基本配置,使用Gitee(一)

1、设置Giter的user name和email 设置提交用户的信息 git config --global user.name "username" git config --global user.email "Your e-mail"查看配置 git config --list2、生成 SSH 公钥 通过命令 ssh-keygen 生成 SSH Key -t key 类型 -C 注释 ssh-…

K8S 证书过期不能使用kubectl之后,kubeadm 重新生成证书

查询证书过期时间 kubeadm certs check-expiration重新生成证书 # 重新生成所有证书 kubeadm certs renew all # 重新生成某个组件的证书 kubeadm certs renew 组件名称 如&#xff1a;apiserver生成新的配置 # 重新生成kubeconfig配置 kubeadm init phase kubeconfig # 重…

LabVIEW中PID控制器系统的噪声与扰动抑制策略

在LabVIEW中处理PID控制器系统中的噪声和外部扰动&#xff0c;需要从信号处理、控制算法优化、硬件滤波和系统设计四个角度入手。采用滤波技术、调节PID参数、增加前馈控制和实施硬件滤波器等方法&#xff0c;可以有效减少噪声和扰动对系统性能的影响&#xff0c;提高控制系统的…

原生小程序一键获取手机号

1.效果图 2.代码index.wxml <!-- 获取手机号 利用手机号快速填写的功能&#xff0c;将button组件 open-type 的值设置为 getPhoneNumber--><button open-type"getPhoneNumber" bindgetphonenumber"getPhoneNumber">获取手机号</button> …

Spring使用的设计模式

Spring 框架是一个广泛使用的 Java 框架&#xff0c;它内部使用了多种设计模式来简化开发过程、提高代码的可维护性和扩展性。 以下是一些在 Spring 框架中常见的设计模式&#xff0c;以及用代码示例来解释它们&#xff1a; 一、工厂模式&#xff08;Factory Pattern&#xff…

elasticsearch7.15实现用户输入自动补全

Elasticsearch Completion Suggester&#xff08;补全建议&#xff09; Elasticsearch7.15安装 官方文档 补全建议器提供了根据输入自动补全/搜索的功能。这是一个导航功能&#xff0c;引导用户在输入时找到相关结果&#xff0c;提高搜索精度。 理想情况下&#xff0c;自动补…