在ESP32双核架构下,避免共享资源竞争死锁的核心是“隔离访问”与“无锁通信”。首先,任务绑定(xTaskCreatePinnedToCore)将特定任务固定到核心,但绑定本身不解决竞争,需配合互斥量(如SemaphoreHandle_t)保护共享资源,并遵循“短临界区”原则:在临界区内只做最小操作,禁止调用阻塞API(如vTaskDelay、queue send with timeout),防止持锁等待。其次,优先使用队列(xQueueSend/Receive)替代直接共享变量,队列本身是线程安全的,且支持超时机制,避免无限阻塞。关键死锁预防:1) 所有任务按固定顺序获取多个锁(如先锁A再锁B),禁止逆序;2) 使用带超时的获取(xSemaphoreTake(..., pdMS_TO_TICKS(100))),失败即释放已持锁并重试;3) 对于只读数据,采用双缓冲或原子操作(如portMUX_TYPE + portENTER_CRITICAL)实现无锁读。实操建议:用FreeRTOS的taskENTER_CRITICAL保护短变量,用队列传递事件,用互斥量保护长操作,并启用CONFIG_FREERTOS_DEBUG_OC_CORE_0/1跟踪死锁。
mcuku 阿沐 · 2026-08-27