ESP32-S2执行esp_event_loop_delete_default()函数卡住问题咨询
故障原因及解决方案
核心死锁原因
你大概率是在WiFi事件回调函数(也就是你注册的disconnect_handler)中直接调用的deinit_wifi函数:
- 所有注册到默认事件循环的回调函数,都是运行在事件循环自身的任务上下文里的
esp_event_loop_delete执行时会等待所有正在运行的事件回调执行完成,同时阻塞新的事件调度- 你在回调里直接调用删除事件循环的逻辑,就会形成「回调等删除函数执行完返回、删除函数等回调执行完再继续」的死锁,所以程序会卡在
esp_event_loop_delete调用处
最优修复方案
你完全不需要删除默认事件循环,后续开启AP模式时依然需要用事件循环处理AP相关的连接、断开事件,删除重建属于多余操作,直接修改deinit_wifi逻辑即可:
- 保留原有卸载STA/以太网相关事件handler的逻辑
- 保留
stop_webserver、example_disconnect调用 - 删除
ESP_ERROR_CHECK(esp_event_loop_delete_default());这一行 - 直接调用
init_access_point(),在AP初始化逻辑里注册AP需要的事件handler即可,复用原有默认事件循环
如果你确实需要删除事件循环的特殊场景
如果业务逻辑必须删除原有事件循环,不要在事件回调中直接执行删除操作:
- 单独创建一个独立的业务任务
- 连接失败达到次数阈值时,在
disconnect_handler中只给业务任务发信号/队列消息 - 由业务任务来执行完整的
deinit_wifi逻辑,保证事件回调可以正常返回,不会出现死锁
内容的提问来源于stack exchange,提问作者Dansen
相关产品推荐
相关产品推荐

