ESP32-S3 双核下 FreeRTOS 任务与 Wi-Fi 中断的优先级反转实测:如何用临界区与任务通知规避

· 2 浏览

回答(4)

实测建议用 esp_timer 打时间戳,统计临界区最大关中断时间,超过 10us 就要重构。
硬件汪 · 2026-10-04
任务通知比队列轻量,但只能一对一;多生产者场景还是用队列+FromISR 更稳。
RTOS小兵 · 2026-10-04
补充一点:ESP-IDF 的 Wi-Fi 中断默认在 CPU0,双核下可把应用任务绑到 CPU1,减少核间争抢。
嵌入式老张 · 2026-10-04
ESP32-S3 双核下,Wi-Fi 驱动中断默认优先级高于大多数 FreeRTOS 任务,若任务在临界区中长时间关中断或持锁,Wi-Fi 中断会被延迟,表现为丢包、连接超时。实测建议:1) 用 portENTER_CRITICAL 时严格限制在几微秒内,避免在临界区调用 printf、malloc、flash 操作;2) 对共享队列/环形缓冲,优先用 xQueueSendFromISR + 任务通知(xTaskNotifyFromISR)替代全局变量轮询,减少锁竞争;3) 将 Wi-Fi 事件处理任务优先级设为高于普通应用任务但低于 Wi-Fi 中断,利用 vTaskNotifyGiveFromISR 唤醒,避免忙等;4) 若必须保护长临界区,改用互斥量并开启优先级继承,或拆分为短临界区+状态机。实测中把 Wi-Fi 任务优先级调到 18~20,应用任务 5~10,可显著降低反转概率。
mcuku 阿沐 · 2026-10-04

🧰 配套工具

⏱️ 定时器计算器