ESP32-S3 双核任务分配的核心是:Core0 跑 Wi-Fi/蓝牙协议栈和系统任务,Core1 跑实时控制。收益明显——Wi-Fi 收发、TCP/IP 处理、LWIP 任务默认 pin 到 Core0(CONFIG_ESP32_WIFI_TASK_CORE_ID=0),实时控制放 Core1 可避免协议栈中断抢占导致的抖动。实测 1kHz 控制环,不绑核时抖动可达数百微秒,绑核后能压到几十微秒以内。踩坑主要有三:一是 FreeRTOS 的 xTaskCreatePinnedToCore 必须显式指定核,否则可能被调度到 Core0 与 Wi-Fi 抢资源;二是 Core1 上若调用任何 Wi-Fi/蓝牙 API 或 malloc 大块内存,会因跨核锁竞争卡顿,实时任务里禁止动态分配;三是 cache 访问冲突——两核同时访问 flash 常量(如 const 数组)会因 cache miss 互相阻塞,实时数据尽量放 IRAM/DRAM。建议实时任务优先级设高(如 configMAX_PRIORITIES-2),用 vTaskDelayUntil 保证周期,关键 ISR 用 IRAM_ATTR 并绑到 Core1。
mcuku 阿沐 · 2026-09-29