From c4e72db390279c409fc58853b36690114df5e443 Mon Sep 17 00:00:00 2001 From: liu zhifu Date: Fri, 26 Apr 2019 13:50:06 +0800 Subject: [PATCH] esp32: fix some WiFi bugs Fix following WiFi bugs: 1. Make smartconfig thread-safe 2. Fix WiFi stop/deinit memory leak 3. Refactor for WiFi init/deinit/ioctl etc 4. Fix the bug that WiFi stop leads to task watchdog --- .../esp32/include/esp_wifi_os_adapter.h | 1 + components/esp32/lib | 2 +- components/esp32/wifi_os_adapter.c | 39 +++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/components/esp32/include/esp_wifi_os_adapter.h b/components/esp32/include/esp_wifi_os_adapter.h index 1dd522c49..ba7c2d06a 100644 --- a/components/esp32/include/esp_wifi_os_adapter.h +++ b/components/esp32/include/esp_wifi_os_adapter.h @@ -47,6 +47,7 @@ typedef struct { int32_t (*_semphr_give_from_isr)(void *semphr, void *hptw); int32_t (*_semphr_take)(void *semphr, uint32_t block_time_tick); int32_t (*_semphr_give)(void *semphr); + void *(*_wifi_thread_semphr_get)(void); void *(*_mutex_create)(void); void *(*_recursive_mutex_create)(void); void (*_mutex_delete)(void *mutex); diff --git a/components/esp32/lib b/components/esp32/lib index 7def1ca81..d4fc472cb 160000 --- a/components/esp32/lib +++ b/components/esp32/lib @@ -1 +1 @@ -Subproject commit 7def1ca81715689275e401b7e1d674b552738ea8 +Subproject commit d4fc472cb423e18067623ffbf572e789429fcd57 diff --git a/components/esp32/wifi_os_adapter.c b/components/esp32/wifi_os_adapter.c index e63b0135f..cfe3d2923 100644 --- a/components/esp32/wifi_os_adapter.c +++ b/components/esp32/wifi_os_adapter.c @@ -17,6 +17,7 @@ #include #include #include +#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -51,6 +52,8 @@ extern void esp_dport_access_stall_other_cpu_start_wrap(void); extern void esp_dport_access_stall_other_cpu_end_wrap(void); +#define TAG "esp_adapter" + /* If CONFIG_WIFI_LWIP_ALLOCATION_FROM_SPIRAM_FIRST is enabled. Prefer to allocate a chunk of memory in SPIRAM firstly. If failed, try to allocate it in internal memory then. @@ -216,6 +219,41 @@ static void IRAM_ATTR semphr_delete_wrapper(void *semphr) vSemaphoreDelete(semphr); } +static void wifi_thread_semphr_free(void* data) +{ + xSemaphoreHandle *sem = (xSemaphoreHandle*)(data); + + if (sem) { + vSemaphoreDelete(sem); + } +} + +static void * wifi_thread_semphr_get_wrapper(void) +{ + static bool s_wifi_thread_sem_key_init = false; + static pthread_key_t s_wifi_thread_sem_key; + xSemaphoreHandle sem = NULL; + + if (s_wifi_thread_sem_key_init == false) { + if (0 != pthread_key_create(&s_wifi_thread_sem_key, wifi_thread_semphr_free)) { + return NULL; + } + s_wifi_thread_sem_key_init = true; + } + + sem = pthread_getspecific(s_wifi_thread_sem_key); + if (!sem) { + sem = xSemaphoreCreateCounting(1, 0); + if (sem) { + pthread_setspecific(s_wifi_thread_sem_key, sem); + ESP_LOGV(TAG, "thread sem create: sem=%p", sem); + } + } + + ESP_LOGV(TAG, "thread sem get: sem=%p", sem); + return (void*)sem; +} + static int32_t IRAM_ATTR semphr_take_from_isr_wrapper(void *semphr, void *hptw) { return (int32_t)xSemaphoreTakeFromISR(semphr, hptw); @@ -414,6 +452,7 @@ wifi_osi_funcs_t g_wifi_osi_funcs = { ._semphr_give_from_isr = semphr_give_from_isr_wrapper, ._semphr_take = semphr_take_wrapper, ._semphr_give = semphr_give_wrapper, + ._wifi_thread_semphr_get = wifi_thread_semphr_get_wrapper, ._mutex_create = mutex_create_wrapper, ._recursive_mutex_create = recursive_mutex_create_wrapper, ._mutex_delete = mutex_delete_wrapper,