diff --git a/components/freertos/Kconfig b/components/freertos/Kconfig index f32f81a1c..72a0fe55c 100644 --- a/components/freertos/Kconfig +++ b/components/freertos/Kconfig @@ -10,6 +10,12 @@ config FREERTOS_UNICORE This is needed when e.g. another process needs complete control over the second core. +# This invisible config value sets the value of tskNO_AFFINITY in task.h. +# Intended to be used as a constant from other Kconfig files. +# Value is (32-bit) INT_MAX. +config FREERTOS_NO_AFFINITY + hex + default 0x7FFFFFFF choice FREERTOS_CORETIMER prompt "Xtensa timer to use as the FreeRTOS tick source" diff --git a/components/freertos/include/freertos/task.h b/components/freertos/include/freertos/task.h index 31df0bdd1..441ed9081 100644 --- a/components/freertos/include/freertos/task.h +++ b/components/freertos/include/freertos/task.h @@ -93,6 +93,9 @@ extern "C" { #define tskKERNEL_VERSION_MINOR 2 #define tskKERNEL_VERSION_BUILD 0 +/** + * @brief Argument of xTaskCreatePinnedToCore indicating that task has no affinity + */ #define tskNO_AFFINITY INT_MAX /** diff --git a/components/freertos/port.c b/components/freertos/port.c index 3f6d11d11..58b12338d 100644 --- a/components/freertos/port.c +++ b/components/freertos/port.c @@ -124,6 +124,8 @@ extern void _xt_coproc_init(void); #define SYSTICK_INTR_ID (ETS_INTERNAL_TIMER1_INTR_SOURCE+ETS_INTERNAL_INTR_SOURCE_OFF) #endif +_Static_assert(tskNO_AFFINITY == CONFIG_FREERTOS_NO_AFFINITY, "incorrect tskNO_AFFINITY value"); + /*-----------------------------------------------------------*/ unsigned port_xSchedulerRunning[portNUM_PROCESSORS] = {0}; // Duplicate of inaccessible xSchedulerRunning; needed at startup to avoid counting nesting diff --git a/components/lwip/Kconfig b/components/lwip/Kconfig index f8802d117..f4b048351 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 2c56969ad..07830c35a 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; } /*-----------------------------------------------------------------------------------*/