文章目录
- 简介
- 事件循环库的使用
- 示例:
简介
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
结构判断事件作相应的处理