ESP-IDF中的event loop library事件循环库

简介

Event Loop Library是一种信号传递机制,事件循环库允许组件声明事件,其他组件可以向其注册处理程序——当这些事件发生时将执行的代码。这允许松散耦合的组件将所需的行为附加到其他组件的状态更改,而无需应用程序参与。这也通过将代码执行序列化和延迟到另一个上下文来简化事件处理。
假设现在有A B C三个线程,A B C中的某个标志位发生变化时分别进行相应的处理,这样每个线程只能处理自己所关注的标志位,并且当多个标志位发生变化需要组合处理时,这种方式不能够满足需求了,需要使用事件循环库。现在引入线程D,用于检测A B C 三个线程中标志位的变化,当发生一个事件或多个事件的时候能够分别处理或者同时处理。提高程序耦合性和可读性,与FreeRTOS中的事件组类似,不知道为什么没有直接使用事件组,可能是事件循环库中可以定义默认用于WIFI蓝牙以及IP等系统事件。

事件循环库的使用

  1. 用户定义一个事件处理函数,该函数应在事件注册到事件循环时运行。
    函数定义如下:
typedef void (*esp_event_handler_t)(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data)
  1. 使用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)
  1. 组件使用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)
  1. 事件源(发生事件的地方)使用esp_event_post_to()将事件发布到事件循环。

  2. 想要从调用中删除其处理程序的组件可以通过使用esp_event_handler_unregister_with()从循环中注销来实现。

  3. 不再需要的事件循环可以使用删除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步被隐藏在系统级函数中了
20230504122950

下面是事件处理函数:
通过if else结构判断事件作相应的处理
20230504123345

猜你喜欢

转载自blog.csdn.net/weixin_51954217/article/details/130467864