From 5d1ccb950191ebcdfccd06fe69cabdc6b9447ffe Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Wed, 1 Aug 2018 12:33:43 +0300 Subject: [PATCH] lwip: allow setting LwIP tasks affinity via sdkconfig In some cases applications need to ensure that WiFi/BT related tasks run on CPU1. This option can be used to set task affinity in such case. https://github.com/espressif/esp-idf/issues/2233#issuecomment-409220381 --- components/lwip/Kconfig | 25 +++++++++++++++++++ .../lwip/port/esp32/freertos/sys_arch.c | 11 ++++---- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/components/lwip/Kconfig b/components/lwip/Kconfig index f8802d1177..f4b0483516 100644 --- a/components/lwip/Kconfig +++ b/components/lwip/Kconfig @@ -443,6 +443,31 @@ config TCPIP_TASK_STACK_SIZE Configure TCP/IP task stack size, used by LWIP to process multi-threaded TCP/IP operations. Setting this stack too small will result in stack overflow crashes. +choice TCPIP_TASK_AFFINITY + prompt "TCP/IP task affinity" + default TCPIP_TASK_AFFINITY_NO_AFFINITY + help + Allows setting LwIP tasks affinity, i.e. whether the task is pinned to + CPU0, pinned to CPU1, or allowed to run on any CPU. + Currently this applies to "TCP/IP" task and "Ping" task. + +config TCPIP_TASK_AFFINITY_NO_AFFINITY + bool "No affinity" +config TCPIP_TASK_AFFINITY_CPU0 + bool "CPU0" +config TCPIP_TASK_AFFINITY_CPU1 + bool "CPU1" + depends on !FREERTOS_UNICORE + +endchoice + +config TCPIP_TASK_AFFINITY + hex + default FREERTOS_NO_AFFINITY if TCPIP_TASK_AFFINITY_NO_AFFINITY + default 0x0 if TCPIP_TASK_AFFINITY_CPU0 + default 0x1 if TCPIP_TASK_AFFINITY_CPU1 + + menuconfig PPP_SUPPORT bool "Enable PPP support (new/experimental)" default n diff --git a/components/lwip/port/esp32/freertos/sys_arch.c b/components/lwip/port/esp32/freertos/sys_arch.c index 2c56969ade..07830c35a8 100644 --- a/components/lwip/port/esp32/freertos/sys_arch.c +++ b/components/lwip/port/esp32/freertos/sys_arch.c @@ -426,16 +426,17 @@ sys_mbox_free(sys_mbox_t *mbox) sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio) { - xTaskHandle CreatedTask; + xTaskHandle created_task; portBASE_TYPE result; - result = xTaskCreate(thread, name, stacksize, arg, prio, &CreatedTask); + result = xTaskCreatePinnedToCore(thread, name, stacksize, arg, prio, &created_task, + CONFIG_TCPIP_TASK_AFFINITY); - if (result == pdPASS) { - return CreatedTask; - } else { + if (result != pdPASS) { return NULL; } + + return created_task; } /*-----------------------------------------------------------------------------------*/