ESP-IDF中的event loop library事件循环库
esp-idf
Espressif IoT Development Framework. Official development framework for Espressif SoCs.
项目地址:https://gitcode.com/gh_mirrors/es/esp-idf
免费下载资源
·
简介
Event Loop Library是一种信号传递机制,事件循环库允许组件声明事件,其他组件可以向其注册处理程序——当这些事件发生时将执行的代码。这允许松散耦合的组件将所需的行为附加到其他组件的状态更改,而无需应用程序参与。这也通过将代码执行序列化和延迟到另一个上下文来简化事件处理。
假设现在有A B C三个线程,A B C中的某个标志位发生变化时分别进行相应的处理,这样每个线程只能处理自己所关注的标志位,并且当多个标志位发生变化需要组合处理时,这种方式不能够满足需求了,需要使用事件循环库。现在引入线程D,用于检测A B C 三个线程中标志位的变化,当发生一个事件或多个事件的时候能够分别处理或者同时处理。提高程序耦合性和可读性,与FreeRTOS中的事件组类似,不知道为什么没有直接使用事件组,可能是事件循环库中可以定义默认用于WIFI蓝牙以及IP等系统事件。
事件循环库的使用
- 用户定义一个事件处理函数,该函数应在事件注册到事件循环时运行。
函数定义如下:
typedef void (*esp_event_handler_t)(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data)
- 使用
esp_event_loop_create()
创建事件循环,返回值为循环的句柄esp_event_loop_handle_t
。使用此 API 创建的事件循环称为用户事件循环。除此之外还有一种特殊类型的事件循环称为系统默认事件循环,使用esp_event_loop_create_default()
创建
函数原型如下:
esp_err_t esp_event_loop_create(const esp_event_loop_args_t* event_loop_args, esp_event_loop_handle_t* event_loop)
- 组件使用
esp_event_handler_register_with()
将事件注册到循环中。可以在多个循环中注册处理程序。
系统默认事件使用esp_event_handler_register()
esp_err_t esp_event_handler_register_with(esp_event_loop_handle_t event_loop, esp_event_base_t event_base,
int32_t event_id, esp_event_handler_t event_handler, void* event_handler_arg)
-
事件源(发生事件的地方)使用
esp_event_post_to()
将事件发布到事件循环。 -
想要从调用中删除其处理程序的组件可以通过使用
esp_event_handler_unregister_with()
从循环中注销来实现。 -
不再需要的事件循环可以使用删除
esp_event_loop_delete()
。
用户使用的API和系统默认事件的API区别:
用户事件循环 | 默认事件循环 |
---|---|
esp_event_loop_create() | esp_event_loop_create_default() |
esp_event_loop_delete() | esp_event_loop_delete_default() |
esp_event_handler_register_with() | esp_event_handler_register() |
esp_event_handler_unregister_with() | esp_event_handler_unregister() |
esp_event_post_to() | esp_event_post() |
示例:
这是smart_config示例代码,因为使用的是系统事先定义好的事件,所以第4步被隐藏在系统级函数中了
下面是事件处理函数:
通过if else
结构判断事件作相应的处理
GitHub 加速计划 / es / esp-idf
13.08 K
7.14 K
下载
Espressif IoT Development Framework. Official development framework for Espressif SoCs.
最近提交(Master分支:1 个月前 )
8e4454b2
feat(802.15.4): support 802.15.4 on esp32c5
Closes TZ-959 and TZ-956
See merge request espressif/esp-idf!32240 2 个月前
13bcf6ba
feat(tools): update openocd version to v0.12.0-esp32-20240726
See merge request espressif/esp-idf!32492 2 个月前
更多推荐
已为社区贡献4条内容
所有评论(0)