Skip to content

Commit

Permalink
Merge branch 'bugfix/fix_the_spiram_malloc_issue_in_wifi_mesh_v5.1' i…
Browse files Browse the repository at this point in the history
…nto 'release/v5.1'

fix(wifi): fixed the spiram malloc issue in wifi mesh (v5.1)

See merge request espressif/esp-idf!29630
  • Loading branch information
jack0c committed Mar 15, 2024
2 parents 089113c + 7f2dfdb commit 8af8f58
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 6 deletions.
36 changes: 34 additions & 2 deletions components/esp_wifi/esp32/esp_adapter.c
Original file line number Diff line number Diff line change
@@ -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
*/
Expand All @@ -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"
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand Down
36 changes: 34 additions & 2 deletions components/esp_wifi/esp32s2/esp_adapter.c
Original file line number Diff line number Diff line change
@@ -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
*/
Expand All @@ -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"
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand Down
36 changes: 34 additions & 2 deletions components/esp_wifi/esp32s3/esp_adapter.c
Original file line number Diff line number Diff line change
@@ -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
*/
Expand All @@ -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"
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit 8af8f58

Please sign in to comment.