From 7f2dfdb38e98bc7eb891c970957029cc3b02e43a Mon Sep 17 00:00:00 2001 From: zhangyanjiao Date: Thu, 7 Mar 2024 16:01:06 +0800 Subject: [PATCH] fix(wifi): fixed the spiram malloc issue in wifi mesh Closes https://github.com/espressif/esp-idf/issues/13285 --- components/esp_wifi/esp32/esp_adapter.c | 36 +++++++++++++++++++++-- components/esp_wifi/esp32s2/esp_adapter.c | 36 +++++++++++++++++++++-- components/esp_wifi/esp32s3/esp_adapter.c | 36 +++++++++++++++++++++-- 3 files changed, 102 insertions(+), 6 deletions(-) diff --git a/components/esp_wifi/esp32/esp_adapter.c b/components/esp_wifi/esp32/esp_adapter.c index a1d6914a87..81c4fee6be 100644 --- a/components/esp_wifi/esp32/esp_adapter.c +++ b/components/esp_wifi/esp32/esp_adapter.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -18,6 +18,7 @@ #include "freertos/event_groups.h" #include "freertos/portmacro.h" #include "freertos/xtensa_api.h" +#include "freertos/idf_additions.h" #include "esp_types.h" #include "esp_random.h" #include "esp_mac.h" @@ -117,6 +118,7 @@ wifi_static_queue_t* wifi_create_queue( int queue_len, int item_size) } #if CONFIG_SPIRAM_USE_MALLOC + /* Wi-Fi still use internal RAM */ queue->storage = heap_caps_calloc(1, sizeof(StaticQueue_t) + (queue_len*item_size), MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT); if (!queue->storage) { @@ -254,7 +256,37 @@ static int32_t IRAM_ATTR mutex_unlock_wrapper(void *mutex) static void * queue_create_wrapper(uint32_t queue_len, uint32_t item_size) { +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0) + /* + * Since release/v5.1, FreeRTOS has been updated to always use internal memory (i.e., DRAM) + * for dynamic memory allocation. Calling FreeRTOS creation functions (e.g., xTaskCreate(), xQueueCreate()) + * will guarantee that the memory allocated for those tasks/objects is from internal memory. + * For more details, please refer to the Migration Guide in release/v5.1. + */ +#if CONFIG_SPIRAM_USE_MALLOC + /* Use xQueueCreateWithCaps() to allocate from SPIRAM */ + return (void *)xQueueCreateWithCaps(queue_len, item_size, MALLOC_CAP_SPIRAM); +#else return (void *)xQueueCreate(queue_len, item_size); +#endif +#else + return (void *)xQueueCreate(queue_len, item_size); +#endif +} + +static void queue_delete_wrapper(void *queue) +{ + if (queue) { +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0) +#if CONFIG_SPIRAM_USE_MALLOC + vQueueDeleteWithCaps(queue); +#else + vQueueDelete(queue); +#endif +#else + vQueueDelete(queue); +#endif + } } static int32_t queue_send_wrapper(void *queue, void *item, uint32_t block_time_tick) @@ -584,7 +616,7 @@ wifi_osi_funcs_t g_wifi_osi_funcs = { ._mutex_lock = mutex_lock_wrapper, ._mutex_unlock = mutex_unlock_wrapper, ._queue_create = queue_create_wrapper, - ._queue_delete = (void(*)(void *))vQueueDelete, + ._queue_delete = queue_delete_wrapper, ._queue_send = queue_send_wrapper, ._queue_send_from_isr = queue_send_from_isr_wrapper, ._queue_send_to_back = queue_send_to_back_wrapper, diff --git a/components/esp_wifi/esp32s2/esp_adapter.c b/components/esp_wifi/esp32s2/esp_adapter.c index b0672498cc..adc6bef8a5 100644 --- a/components/esp_wifi/esp32s2/esp_adapter.c +++ b/components/esp_wifi/esp32s2/esp_adapter.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -18,6 +18,7 @@ #include "freertos/event_groups.h" #include "freertos/portmacro.h" #include "freertos/xtensa_api.h" +#include "freertos/idf_additions.h" #include "esp_types.h" #include "esp_random.h" #include "esp_mac.h" @@ -108,6 +109,7 @@ wifi_static_queue_t* wifi_create_queue( int queue_len, int item_size) } #if CONFIG_SPIRAM_USE_MALLOC + /* Wi-Fi still use internal RAM */ queue->storage = heap_caps_calloc(1, sizeof(StaticQueue_t) + (queue_len*item_size), MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT); if (!queue->storage) { @@ -245,7 +247,37 @@ static int32_t IRAM_ATTR mutex_unlock_wrapper(void *mutex) static void * queue_create_wrapper(uint32_t queue_len, uint32_t item_size) { +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0) + /* + * Since release/v5.1, FreeRTOS has been updated to always use internal memory (i.e., DRAM) + * for dynamic memory allocation. Calling FreeRTOS creation functions (e.g., xTaskCreate(), xQueueCreate()) + * will guarantee that the memory allocated for those tasks/objects is from internal memory. + * For more details, please refer to the Migration Guide in release/v5.1. + */ +#if CONFIG_SPIRAM_USE_MALLOC + /* Use xQueueCreateWithCaps() to allocate from SPIRAM */ + return (void *)xQueueCreateWithCaps(queue_len, item_size, MALLOC_CAP_SPIRAM); +#else return (void *)xQueueCreate(queue_len, item_size); +#endif +#else + return (void *)xQueueCreate(queue_len, item_size); +#endif +} + +static void queue_delete_wrapper(void *queue) +{ + if (queue) { +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0) +#if CONFIG_SPIRAM_USE_MALLOC + vQueueDeleteWithCaps(queue); +#else + vQueueDelete(queue); +#endif +#else + vQueueDelete(queue); +#endif + } } static int32_t queue_send_wrapper(void *queue, void *item, uint32_t block_time_tick) @@ -577,7 +609,7 @@ wifi_osi_funcs_t g_wifi_osi_funcs = { ._mutex_lock = mutex_lock_wrapper, ._mutex_unlock = mutex_unlock_wrapper, ._queue_create = queue_create_wrapper, - ._queue_delete = (void(*)(void *))vQueueDelete, + ._queue_delete = queue_delete_wrapper, ._queue_send = queue_send_wrapper, ._queue_send_from_isr = queue_send_from_isr_wrapper, ._queue_send_to_back = queue_send_to_back_wrapper, diff --git a/components/esp_wifi/esp32s3/esp_adapter.c b/components/esp_wifi/esp32s3/esp_adapter.c index e6ca995af7..a981aa014a 100644 --- a/components/esp_wifi/esp32s3/esp_adapter.c +++ b/components/esp_wifi/esp32s3/esp_adapter.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -18,6 +18,7 @@ #include "freertos/event_groups.h" #include "freertos/portmacro.h" #include "freertos/xtensa_api.h" +#include "freertos/idf_additions.h" #include "esp_types.h" #include "esp_random.h" #include "esp_mac.h" @@ -111,6 +112,7 @@ wifi_static_queue_t* wifi_create_queue( int queue_len, int item_size) } #if CONFIG_SPIRAM_USE_MALLOC + /* Wi-Fi still use internal RAM */ queue->storage = heap_caps_calloc(1, sizeof(StaticQueue_t) + (queue_len*item_size), MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT); if (!queue->storage) { @@ -248,7 +250,37 @@ static int32_t IRAM_ATTR mutex_unlock_wrapper(void *mutex) static void * queue_create_wrapper(uint32_t queue_len, uint32_t item_size) { +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0) + /* + * Since release/v5.1, FreeRTOS has been updated to always use internal memory (i.e., DRAM) + * for dynamic memory allocation. Calling FreeRTOS creation functions (e.g., xTaskCreate(), xQueueCreate()) + * will guarantee that the memory allocated for those tasks/objects is from internal memory. + * For more details, please refer to the Migration Guide in release/v5.1. + */ +#if CONFIG_SPIRAM_USE_MALLOC + /* Use xQueueCreateWithCaps() to allocate from SPIRAM */ + return (void *)xQueueCreateWithCaps(queue_len, item_size, MALLOC_CAP_SPIRAM); +#else return (void *)xQueueCreate(queue_len, item_size); +#endif +#else + return (void *)xQueueCreate(queue_len, item_size); +#endif +} + +static void queue_delete_wrapper(void *queue) +{ + if (queue) { +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0) +#if CONFIG_SPIRAM_USE_MALLOC + vQueueDeleteWithCaps(queue); +#else + vQueueDelete(queue); +#endif +#else + vQueueDelete(queue); +#endif + } } static int32_t queue_send_wrapper(void *queue, void *item, uint32_t block_time_tick) @@ -597,7 +629,7 @@ wifi_osi_funcs_t g_wifi_osi_funcs = { ._mutex_lock = mutex_lock_wrapper, ._mutex_unlock = mutex_unlock_wrapper, ._queue_create = queue_create_wrapper, - ._queue_delete = (void(*)(void *))vQueueDelete, + ._queue_delete = queue_delete_wrapper, ._queue_send = queue_send_wrapper, ._queue_send_from_isr = queue_send_from_isr_wrapper, ._queue_send_to_back = queue_send_to_back_wrapper,