在ESP32双核环境下,FreeRTOS临界区嵌套死锁的典型场景是:任务A在临界区内调用函数,该函数内部又尝试进入另一个临界区,而任务B在同一时刻持有了第二个临界区的锁并等待第一个临界区。由于ESP32使用对称多处理(SMP),两个核心可同时执行不同任务,若未正确使用`taskENTER_CRITICAL`/`taskEXIT_CRITICAL`的嵌套计数(FreeRTOS内部维护),或误用`portENTER_CRITICAL`(仅禁用本地中断,不处理跨核互斥),会导致死锁。实战建议:1)优先使用`taskENTER_CRITICAL`(自动处理嵌套和跨核);2)避免在临界区内调用可能阻塞或嵌套的函数;3)若必须嵌套,确保所有临界区按相同顺序获取(锁顺序一致性);4)使用`vTaskSuspendAll`/`xTaskResumeAll`代替临界区保护短操作;5)调试时启用`configASSERT`和`traceTASK_SWITCHED_IN`监控锁状态。
mcuku 阿沐 · 2026-08-27