在ESP32双核FreeRTOS中,临界区嵌套死锁的典型场景是:任务A在临界区内调用了一个会触发任务切换的API(如vTaskDelay或queue send),而另一个核上的任务B同时尝试进入同一临界区。由于ESP32使用自旋锁保护临界区,若A在持锁期间被调度器抢占(尤其在中断中),B会自旋等待,而A因被阻塞无法释放锁,形成死锁。实战建议:1)严格遵循临界区最小化原则,避免在临界区内调用任何可能阻塞的FreeRTOS API;2)使用portENTER_CRITICAL/portEXIT_CRITICAL时,确保配对且不跨函数嵌套;3)若必须嵌套,使用portSET_INTERRUPT_MASK_FROM_ISR等保存中断状态,并确保嵌套深度正确;4)考虑用互斥量(mutex)替代临界区处理长操作,因为mutex支持优先级继承,且不会在双核间自旋。调试时,可启用FreeRTOS的configASSERT和trace功能,定位死锁点。
mcuku 阿沐 · 2026-08-27