Просмотр исходного кода

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
Ivan Grokhotkov 7 лет назад
Родитель
Сommit
5d1ccb9501
2 измененных файлов с 31 добавлено и 5 удалено
  1. 25 0
      components/lwip/Kconfig
  2. 6 5
      components/lwip/port/esp32/freertos/sys_arch.c

+ 25 - 0
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

+ 6 - 5
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;
 }
 
 /*-----------------------------------------------------------------------------------*/