ESP32: pin all tskNO_AFFINITY tasks to core 0 via linker wrap
On dual-core ESP32-S3 (ARDUINO_RUNNING_CORE=1), the Arduino loop and LoRa processing run exclusively on core 1. ESP-IDF v4 creates mqtt_task with tskNO_AFFINITY, meaning FreeRTOS may schedule them on core 1 under load, preempting the LoRa loop. ESP-IDF v4 provides no public API to change a task's core affinity after creation (vTaskCoreAffinitySet is IDF v5+ only), and the esp_mqtt_client config struct has no task_core_id field. The precompiled Arduino-ESP32 framework cannot be patched via sdkconfig. Instead, use the GCC/LD --wrap linker mechanism to intercept every call to xTaskCreatePinnedToCore. Any task created with tskNO_AFFINITY is redirected to core 0. Tasks that are already explicitly pinned (Wi-Fi driver, LwIP, httpd, esp_timer, ipc0/ipc1) are passed through unchanged. We intentionally do not filter by task name. Pinning all unpinned tasks makes the approach robust against internal ESP-IDF task name changes and catches any future tasks that may be added with tskNO_AFFINITY. Verified task layout after the change: loopTask pri=1 core=1 (Arduino loop / LoRa — unchanged) mqtt_task pri=5 core=0 (was tskNO_AFFINITY, now pinned) httpd pri=2 core=0 (core_id set explicitly in WebPanelServer) tiT pri=18 core=0 (LwIP, already pinned by ESP-IDF) wifi pri=23 core=0 (Wi-Fi driver, already pinned) esp_timer pri=22 core=0 (already pinned) ipc0/ipc1 pri=24 core=0/1 (IPC, already pinned per-core) The -Wl,--wrap flag and arch/esp32/task_pinning.c are added only to [esp32_base] (IDF v4). The ESP32-C6 pioarduino target (IDF v5) is unaffected and can use vTaskCoreAffinitySet() if needed in the future.
Bu işleme şunda yer alıyor:
@@ -64,7 +64,9 @@ extra_scripts =
|
||||
build_flags = ${arduino_base.build_flags}
|
||||
-D ESP32_PLATFORM
|
||||
; -D ESP32_CPU_FREQ=80 ; change it to your need
|
||||
-Wl,--wrap=xTaskCreatePinnedToCore
|
||||
build_src_filter = ${arduino_base.build_src_filter}
|
||||
+<../arch/esp32/task_pinning.c>
|
||||
|
||||
[esp32_ota]
|
||||
lib_deps =
|
||||
|
||||
Yeni konuda referans
Bir kullanıcı engelle