首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我被esp_event_loop_delete_default()函数卡住了?

为什么我被esp_event_loop_delete_default()函数卡住了?
EN

Stack Overflow用户
提问于 2021-11-15 09:58:34
回答 1查看 99关注 0票数 1

我正在开发我的ESP32-S2,我想实现一个Restserver。作为模板,我使用了由esp-idf提供的https "simple“示例。我的ESP32应该尝试使用硬编码的SSID和密码连接到本地路由器。ESP每隔1-2秒尝试连接到路由器。尝试4次后,我希望ESP停止连接到路由器,并改为启动和访问点。现在我在实现这个逻辑时遇到了一些问题。在连接失败后,尝试调用我的deinit_wifi函数,如下所示:

代码语言:javascript
复制
void deinit_wifi(void)
{  

 stop_webserver(mainserver);


#ifdef CONFIG_EXAMPLE_CONNECT_WIFI
ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, &connect_handler));
ESP_ERROR_CHECK(esp_event_handler_unregister(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, &disconnect_handler));
#endif // CONFIG_EXAMPLE_CONNECT_WIFI
#ifdef CONFIG_EXAMPLE_CONNECT_ETHERNET
ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_ETH_GOT_IP, &connect_handler));
ESP_ERROR_CHECK(esp_event_handler_unregister(ETH_EVENT, ETHERNET_EVENT_DISCONNECTED, &disconnect_handler));
#endif // CONFIG_EXAMPLE_CONNECT_ETHERNET

    ESP_ERROR_CHECK(example_disconnect());

    ESP_ERROR_CHECK(esp_event_loop_delete_default());

    init_access_point();

}

我注意到,我的ESP卡在以下代码行中:

代码语言:javascript
复制
   ESP_ERROR_CHECK(esp_event_loop_delete_default());

我开始搜索这个问题,查看了定义,并添加了一些printf来定位函数被卡住的行。

代码语言:javascript
复制
esp_err_t esp_event_loop_delete_default(void)
{
    printf("\n I'm in function \n");
    if (!s_default_loop) {
        printf("\n Invalide state?! \n");
        return ESP_ERR_INVALID_STATE;
    }

    esp_err_t err;
    printf("\n I try to delete \n");
    err = esp_event_loop_delete(s_default_loop);

    printf("\n i just deleted \n");
    if (err != ESP_OK) {
        printf("\n s_default_loop is not null \n");
        return err;
    }

    s_default_loop = NULL;
    printf("\n s_default_loop is null now \n");
    return ESP_OK;
}

我打印的最后一行是"I try to delete“。这意味着,我的程序驻留在这个函数中:

代码语言:javascript
复制
    err = esp_event_loop_delete(s_default_loop);

有没有人有主意?

下面是我的init函数:

代码语言:javascript
复制
void init_Wifi(void)
{
    

    ESP_ERROR_CHECK(nvs_flash_init());
    ESP_ERROR_CHECK(esp_netif_init());
    ESP_ERROR_CHECK(esp_event_loop_create_default());

    /* Register event handlers to start server when Wi-Fi or Ethernet is connected,
     * and stop server when disconnection happens.
     */

#ifdef CONFIG_EXAMPLE_CONNECT_WIFI
    ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &connect_handler, &mainserver));
    ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, &disconnect_handler, &mainserver));
#endif // CONFIG_EXAMPLE_CONNECT_WIFI
#ifdef CONFIG_EXAMPLE_CONNECT_ETHERNET
    ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_ETH_GOT_IP, &connect_handler, &mainserver));
    ESP_ERROR_CHECK(esp_event_handler_register(ETH_EVENT, ETHERNET_EVENT_DISCONNECTED, &disconnect_handler, &mainserver));
#endif // CONFIG_EXAMPLE_CONNECT_ETHERNET

    /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig.
     * Read "Establishing Wi-Fi or Ethernet Connection" section in
     * examples/protocols/README.md for more information about this function.
     */
    ESP_ERROR_CHECK(example_connect());
}
EN

回答 1

Stack Overflow用户

发布于 2021-11-15 10:28:51

因此,在esp_event_loop_delete_default内部,您调用esp_event_loop_delete,并将s_default_loop传递给它。

这里是https://github.com/espressif/esp-idf/blob/4a011f318377ab717b9dc459019c1055602c93ff/components/esp_event/include/esp_event.h#L70

代码说明event_loop 不能为空

这里:https://github.com/espressif/esp-idf/blob/4a011f318377ab717b9dc459019c1055602c93ff/components/esp_event/esp_event.c#L639

您可以找到该函数的实现。这段代码说涉及到一些递归,就在这里:

https://github.com/espressif/esp-idf/blob/4a011f318377ab717b9dc459019c1055602c93ff/components/esp_event/esp_event.c#L649

这些是您解决问题所需的信息块。然而,实际的解决方案需要调试C代码并查看那里发生了什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69972454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档