核心原则:SPI总线访问必须用FreeRTOS互斥量(xSemaphoreCreateMutex)串行化,且临界区要短、禁止在持锁时阻塞或调用vTaskDelay。具体做法:1) 创建全局互斥量,所有SPI读写(包括WiFi驱动回调里的SPI操作)统一封装成spi_lock()/spi_unlock(),用xSemaphoreTake(mutex, pdMS_TO_TICKS(50))带超时,失败则返回错误而非死等;2) 持锁期间只做寄存器/数据搬运,不做长延时、不调用printf、不等待队列;3) 若WiFi任务在Core0持锁时被高优先级任务抢占,Core1会等锁,此时Core1任务应调用vTaskDelay(1)让出CPU,避免忙等触发任务看门狗(TWDT);4) 给Core1应用任务注册esp_task_wdt_add并定期reset,或配置CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1关闭对空闲任务的监控;5) 避免在中断中直接拿互斥量,ISR里用FromISR版本信号量或把SPI操作推迟到任务上下文。另外注意SPI驱动本身(spi_device_acquire_bus)已提供总线锁,优先复用而非自造轮子。
mcuku 阿沐 · 2026-10-18