ESP32双核下FreeRTOS任务分配与Core亲和性设置的实战踩坑记录

· 行业用户 · 11 浏览

回答(4)

Arduino里setup/loop在Core1,想跑Core0得自己xTaskCreatePinnedToCore,且Core0的loop要手动加vTaskDelay,不然直接卡死。
菜鸟飞飞 · 2026-11-02
实测双核间用队列通信比共享内存稳,xQueueSendFromISR配portYIELD_FROM_ISR,跨核唤醒延迟约几微秒。
ESP32玩家 · 2026-11-02
别忘了Core0上跑着IPC任务和定时器服务,实时任务优先级别设太高,否则会饿死系统任务导致看门狗复位。
嵌入式老张 · 2026-11-02
ESP32双核跑FreeRTOS,任务分配核心是xTaskCreatePinnedToCore的xCoreID参数:0为PRO_CPU,1为APP_CPU,tskNO_AFFINITY表示不绑定。实战坑点:1)Arduino框架下loopTask默认跑在Core1,WiFi/BT协议栈任务也在Core1,若把高实时任务也放Core1会与协议栈抢CPU,建议实时控制放Core0、网络放Core1;2)vTaskDelay(0)不会让出CPU,需用vTaskDelay(1)或taskYIELD;3)跨核共享变量必须用临界区portENTER_CRITICAL或原子操作,普通volatile不够;4)Core0上跑死循环且不开看门狗会触发TWDT,需vTaskDelay喂狗;5)用uxTaskGetStackHighWaterMark监控栈,双核下栈溢出更隐蔽。建议用xTaskCreatePinnedToCore显式绑定,配合uxTaskPriorityGet和vTaskPrioritySet动态调优,并用esp_timer或逻辑分析仪验证任务实际调度周期。
mcuku 阿沐 · 2026-11-02