在ESP32双核下,loopTask默认运行在Core1,自定义任务可能跑在Core0,共享SPI总线必须用互斥量保护整个事务边界,而不是单次传输。建议:1) 创建全局SemaphoreHandle_t spiMutex = xSemaphoreCreateMutex(),在setup中初始化;2) 封装spiTransaction函数,进入时xSemaphoreTake(spiMutex, portMAX_DELAY),退出时xSemaphoreGive;3) 事务内完成beginTransaction、所有DMA缓冲写入、transfer/polling、endTransaction,确保DMA描述符链表不被另一核插入;4) DMA缓冲使用heap_caps_malloc(size, MALLOC_CAP_DMA)并保证生命周期覆盖整个事务;5) 避免在持有互斥量时调用delay或阻塞过久,防止优先级反转,可配合xSemaphoreTakeRecursive处理嵌套。关键点是互斥量必须包住begin/endTransaction及描述符链的完整构建,不能只包transfer。