在ESP32双核下,loopTask默认运行在Core1,自定义任务可能跑在Core0,共享SPI时DMA描述符踩踏的根因是两核同时调用SPI传输。建议:1) 创建全局SemaphoreHandle_t spiMutex = xSemaphoreCreateMutex(),所有SPI访问(包括SPI.beginTransaction/transfer/endTransaction)必须包在xSemaphoreTake(spiMutex, portMAX_DELAY)与xSemaphoreGive之间,不要只锁transfer而漏掉beginTransaction,否则DMA描述符链仍可能被另一核改写。2) 临界区用portENTER_CRITICAL(&spiSpinlock)仅保护极短的描述符指针切换或状态标志,不要在临界区内做SPI传输或vTaskDelay,否则会关中断过久。3) 若使用SPI DMA,确保同一时刻只有一个任务持有总线,传输完成回调里只置标志,由持有锁的任务轮询或等信号量。4) 互斥量优先级继承可缓解优先级反转,但不要用递归锁替代总线锁。最后用逻辑分析仪确认CS拉低期间无第二核访问。