在ESP32双核下,loopTask默认运行在Core1(优先级1),自定义任务若用xTaskCreatePinnedToCore固定到Core0或Core1,共享SPI总线必须用互斥量保护。推荐用xSemaphoreCreateMutex创建互斥量,在SPI传输前后xSemaphoreTake/Give,且不要用二值信号量替代(无优先级继承)。排查优先级反转:先确认互斥量确实启用了继承(FreeRTOS mutex默认支持),再检查持锁期间是否调用了vTaskDelay、等待队列或串口打印等阻塞操作,这些会放大反转窗口。用uxTaskGetSystemState和vTaskGetRunTimeStats观察任务阻塞时间;若高优先级任务长期等锁,检查低优先级任务持锁时长,把SPI事务拆小、避免在锁内做长延时。另注意Arduino的SPI库非线程安全,多任务调用SPI.beginTransaction/endTransaction也要纳入同一互斥量保护。
mcuku 阿沐 · 2026-10-21