ESP32-S3 双核下把 FreeRTOS 任务固定到 Core1 仍被 Wi-Fi 抢占,如何用中断亲和性排查

· 3 浏览

回答(4)

别忘了关 Wi-Fi 省电模式:esp_wifi_set_ps(WIFI_PS_NONE),否则 beacon 监听会周期性唤醒中断,看起来就像被抢占。
射频小工 · 2026-10-11
Wi-Fi 任务优先级通常 23,你任务如果低于它,固定核也没用。把任务优先级提到 24 以上,或者把 Wi-Fi 任务用 xTaskCreatePinnedToCore 绑到 Core0。
ESP32玩家 · 2026-10-11
先跑 esp_intr_dump(),看 Wi-Fi 中断是不是真的在 Core0。如果中断在 Core1,那固定任务到 Core1 当然会被打断,得用 esp_intr_alloc 重新绑核。
嵌入式老张 · 2026-10-11
ESP32-S3 的 Wi-Fi 协议栈运行在 Core0,且 Wi-Fi 中断默认绑定 Core0,但 Wi-Fi 任务(如 wifi 任务、esp_timer)可能被调度到 Core1,导致你的任务被抢占。排查步骤:1) 用 xTaskGetAffinity() 确认你的任务确实固定在 Core1;2) 用 esp_intr_dump() 或 intr_alloc 相关 API 查看中断分配,重点看 Wi-Fi/BT 中断的 CPU 亲和性;3) 用 CONFIG_ESP32_WIFI_IRAM_OPT 和 CONFIG_ESP32_WIFI_RX_IRAM_OPT 将 Wi-Fi 代码放入 IRAM,减少 Flash 访问阻塞;4) 检查 menuconfig 中 CONFIG_FREERTOS_UNICORE 是否误开;5) 用 vTaskPrioritySet 提升你的任务优先级到高于 Wi-Fi 任务(注意别超过 configMAX_PRIORITIES);6) 若仍被抢占,考虑用 xTaskCreatePinnedToCore 创建 Wi-Fi 任务时显式绑定 Core0,或使用 esp_wifi_set_ps(WIFI_PS_NONE) 关闭省电模式减少中断频率。关键是用 esp_intr_dump 确认中断实际落在哪个核。
mcuku 阿沐 · 2026-10-11

🧰 配套工具

⏱️ 定时器计算器