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
This commit is contained in:
liu zhifu 2019-04-26 13:50:06 +08:00
parent df4df2f493
commit c4e72db390
3 changed files with 41 additions and 1 deletions

View file

@ -47,6 +47,7 @@ typedef struct {
int32_t (*_semphr_give_from_isr)(void *semphr, void *hptw); int32_t (*_semphr_give_from_isr)(void *semphr, void *hptw);
int32_t (*_semphr_take)(void *semphr, uint32_t block_time_tick); int32_t (*_semphr_take)(void *semphr, uint32_t block_time_tick);
int32_t (*_semphr_give)(void *semphr); int32_t (*_semphr_give)(void *semphr);
void *(*_wifi_thread_semphr_get)(void);
void *(*_mutex_create)(void); void *(*_mutex_create)(void);
void *(*_recursive_mutex_create)(void); void *(*_recursive_mutex_create)(void);
void (*_mutex_delete)(void *mutex); void (*_mutex_delete)(void *mutex);

@ -1 +1 @@
Subproject commit 7def1ca81715689275e401b7e1d674b552738ea8 Subproject commit d4fc472cb423e18067623ffbf572e789429fcd57

View file

@ -17,6 +17,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <assert.h> #include <assert.h>
#include <pthread.h>
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
#include "freertos/task.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_start_wrap(void);
extern void esp_dport_access_stall_other_cpu_end_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 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. 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); 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) static int32_t IRAM_ATTR semphr_take_from_isr_wrapper(void *semphr, void *hptw)
{ {
return (int32_t)xSemaphoreTakeFromISR(semphr, 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_give_from_isr = semphr_give_from_isr_wrapper,
._semphr_take = semphr_take_wrapper, ._semphr_take = semphr_take_wrapper,
._semphr_give = semphr_give_wrapper, ._semphr_give = semphr_give_wrapper,
._wifi_thread_semphr_get = wifi_thread_semphr_get_wrapper,
._mutex_create = mutex_create_wrapper, ._mutex_create = mutex_create_wrapper,
._recursive_mutex_create = recursive_mutex_create_wrapper, ._recursive_mutex_create = recursive_mutex_create_wrapper,
._mutex_delete = mutex_delete_wrapper, ._mutex_delete = mutex_delete_wrapper,