我正在开发我的ESP32-S2,我想实现一个Restserver。作为模板,我使用了由esp-idf提供的https "simple“示例。我的ESP32应该尝试使用硬编码的SSID和密码连接到本地路由器。ESP每隔1-2秒尝试连接到路由器。尝试4次后,我希望ESP停止连接到路由器,并改为启动和访问点。现在我在实现这个逻辑时遇到了一些问题。在连接失败后,尝试调用我的deinit_wifi函数,如下所示:
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卡在以下代码行中:
ESP_ERROR_CHECK(esp_event_loop_delete_default());我开始搜索这个问题,查看了定义,并添加了一些printf来定位函数被卡住的行。
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“。这意味着,我的程序驻留在这个函数中:
err = esp_event_loop_delete(s_default_loop);有没有人有主意?
下面是我的init函数:
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());
}发布于 2021-11-15 10:28:51
因此,在esp_event_loop_delete_default内部,您调用esp_event_loop_delete,并将s_default_loop传递给它。
代码说明event_loop 不能为空。
您可以找到该函数的实现。这段代码说涉及到一些递归,就在这里:
这些是您解决问题所需的信息块。然而,实际的解决方案需要调试C代码并查看那里发生了什么。
https://stackoverflow.com/questions/69972454
复制相似问题