我的项目除了 main.c 之外还有三个源代码。它们是 spiffs.c、event_loop.c 和 wifi_prov_mgr.c。Wifi_prov_mgr.c 是 ESP 的 wifi_provisioning 示例中主程序的副本(此示例有自己的 event_handler 来处理发布到默认事件循环的事件)。将 wifi_provisioning 示例复制到 wifi_prov_mgr.c 后,我对它所做的唯一更改是取消了默认偶数循环的创建并将其移动到另一个文件 - event_loop.c,该文件旨在管理其他源代码的执行每个不同的 .c 文件中某些自定义事件的发生。
在 main.c 中,我调用了 event_loop.c 和 spiffs.c 中的起始函数。这是我的 event_loop.c 代码的样子:
代码:
全选
ESP_EVENT_DEFINE_BASE(CUSTOM_EVENT);
sta
tic void event_loop_event_handler(void* arg, esp_event_base_t event_base,
int32_t event_id, void* event_data)
{if (event_base == CUSTOM_EVENT){
switch (event_id) {
case SPIFFSDONE:
ESP_LOGI(TAG, "Done with spiffs.");
wifi_provision();
break;
case WIFIDONE:
ESP_LOGI(TAG, "Done with wifi_prov.");
break;
}
}
}
/* Initialize the event loop */
void event_loop_start(void){
ESP_ERROR_CHECK(esp_event_loop_create_default());
ESP_ERROR_CHECK(esp_event_handler_instance_register(CUSTOM_EVENT, ESP_EVENT_ANY_ID, event_handler1, NULL, NULL));
}
spiffs.c 完成后,它会将 SPIFFS_DONE 事件发布到默认循环:
代码:
全选
ESP_ERROR_CHECK(esp_event_post(CUSTOM_EVENT, SPIFFSDONE, NULL, 0, 0));
和 event_loop.c 打印
完成 spiffs
并从 wifi_prov_mgr.c 启动 wifi_provision()。
但是,当 wifi_provision.c 将 CUSTOM_EVENT/WIFIDONE 发布到默认循环时
代码:
全选
esp_event_post(CUSTOM_EVENT, WIFIDONE, NULL, 0, 0);
什么都没发生。我本来希望 event_loop.c 打印
完成 wifi_prov
奇怪的是,如果我直接从 main.c 调用 wifi_prov_mgr.c 中的 wifi_provision(),它是 CUSTOM_EVENT (WIFIDONE) 事件被 event_loop.c 中的 event_loop_event_handler 函数识别并且函数打印
完成 wifi_prov
有人可以帮我弄清楚为什么当直接从 event_loop.c 而不是 main.c 调用 wifi_provision() 时 event_loop_event_handler() 无法识别 wifi_prov_mgr.c 发布的 CUSTOM_EVENT WIFIDONE 事件吗?
0