Skip to content

Commit

Permalink
Merge branch 'bugfix/psram_fallback_in_wifi_osi_v5.3' into 'release/v…
Browse files Browse the repository at this point in the history
…5.3'

fix(wifi): Add PSRAM failure fallback in WiFi Queue API's (backport v5.3)

See merge request espressif/esp-idf!33345
  • Loading branch information
jack0c committed Sep 9, 2024
2 parents 4a3ca7f + cfbb9c0 commit 0c7e957
Show file tree
Hide file tree
Showing 5 changed files with 120 additions and 76 deletions.
46 changes: 22 additions & 24 deletions components/esp_wifi/esp32/esp_adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@
#include "esp_rom_sys.h"
#include "esp32/rom/ets_sys.h"
#include "private/esp_modem_wrapper.h"
#if __has_include("esp_psram.h")
#include "esp_psram.h"
#endif

#define TAG "esp_adapter"

Expand Down Expand Up @@ -260,36 +263,31 @@ 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
StaticQueue_t *queue_buffer = heap_caps_malloc_prefer(sizeof(StaticQueue_t) + (queue_len * item_size), 2,
MALLOC_CAP_DEFAULT | MALLOC_CAP_SPIRAM,
MALLOC_CAP_DEFAULT | MALLOC_CAP_INTERNAL);
if (!queue_buffer) {
return NULL;
}
QueueHandle_t queue_handle = xQueueCreateStatic(queue_len, item_size, (uint8_t *)queue_buffer + sizeof(StaticQueue_t),
queue_buffer);
if (!queue_handle) {
free(queue_buffer);
return NULL;
}

return (void *)queue_handle;
}

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
StaticQueue_t *queue_buffer = NULL;
xQueueGetStaticBuffers(queue, NULL, &queue_buffer);
vQueueDelete(queue);
#endif
#else
vQueueDelete(queue);
#endif
if (queue_buffer) {
free(queue_buffer);
}
}
}

Expand Down
29 changes: 27 additions & 2 deletions components/esp_wifi/esp32c5/esp_adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,32 @@ static int32_t IRAM_ATTR mutex_unlock_wrapper(void *mutex)

static void *queue_create_wrapper(uint32_t queue_len, uint32_t item_size)
{
return (void *)xQueueCreate(queue_len, item_size);
StaticQueue_t *queue_buffer = heap_caps_malloc_prefer(sizeof(StaticQueue_t) + (queue_len * item_size), 2,
MALLOC_CAP_DEFAULT | MALLOC_CAP_SPIRAM,
MALLOC_CAP_DEFAULT | MALLOC_CAP_INTERNAL);
if (!queue_buffer) {
return NULL;
}
QueueHandle_t queue_handle = xQueueCreateStatic(queue_len, item_size, (uint8_t *)queue_buffer + sizeof(StaticQueue_t),
queue_buffer);
if (!queue_handle) {
free(queue_buffer);
return NULL;
}

return (void *)queue_handle;
}

static void queue_delete_wrapper(void *queue)
{
if (queue) {
StaticQueue_t *queue_buffer = NULL;
xQueueGetStaticBuffers(queue, NULL, &queue_buffer);
vQueueDelete(queue);
if (queue_buffer) {
free(queue_buffer);
}
}
}

static int32_t queue_send_wrapper(void *queue, void *item, uint32_t block_time_tick)
Expand Down Expand Up @@ -587,7 +612,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
29 changes: 27 additions & 2 deletions components/esp_wifi/esp32p4/esp_adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,32 @@ static int32_t IRAM_ATTR mutex_unlock_wrapper(void *mutex)

static void *queue_create_wrapper(uint32_t queue_len, uint32_t item_size)
{
return (void *)xQueueCreate(queue_len, item_size);
StaticQueue_t *queue_buffer = heap_caps_malloc_prefer(sizeof(StaticQueue_t) + (queue_len * item_size), 2,
MALLOC_CAP_DEFAULT | MALLOC_CAP_SPIRAM,
MALLOC_CAP_DEFAULT | MALLOC_CAP_INTERNAL);
if (!queue_buffer) {
return NULL;
}
QueueHandle_t queue_handle = xQueueCreateStatic(queue_len, item_size, (uint8_t *)queue_buffer + sizeof(StaticQueue_t),
queue_buffer);
if (!queue_handle) {
free(queue_buffer);
return NULL;
}

return (void *)queue_handle;
}

static void queue_delete_wrapper(void *queue)
{
if (queue) {
StaticQueue_t *queue_buffer = NULL;
xQueueGetStaticBuffers(queue, NULL, &queue_buffer);
vQueueDelete(queue);
if (queue_buffer) {
free(queue_buffer);
}
}
}

static int32_t queue_send_wrapper(void *queue, void *item, uint32_t block_time_tick)
Expand Down Expand Up @@ -668,7 +693,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
46 changes: 22 additions & 24 deletions components/esp_wifi/esp32s2/esp_adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@
#include "esp_rom_sys.h"
#include "esp32s2/rom/ets_sys.h"
#include "private/esp_modem_wrapper.h"
#if __has_include("esp_psram.h")
#include "esp_psram.h"
#endif

#define TAG "esp_adapter"

Expand Down Expand Up @@ -251,36 +254,31 @@ 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
StaticQueue_t *queue_buffer = heap_caps_malloc_prefer(sizeof(StaticQueue_t) + (queue_len * item_size), 2,
MALLOC_CAP_DEFAULT | MALLOC_CAP_SPIRAM,
MALLOC_CAP_DEFAULT | MALLOC_CAP_INTERNAL);
if (!queue_buffer) {
return NULL;
}
QueueHandle_t queue_handle = xQueueCreateStatic(queue_len, item_size, (uint8_t *)queue_buffer + sizeof(StaticQueue_t),
queue_buffer);
if (!queue_handle) {
free(queue_buffer);
return NULL;
}

return (void *)queue_handle;
}

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
StaticQueue_t *queue_buffer = NULL;
xQueueGetStaticBuffers(queue, NULL, &queue_buffer);
vQueueDelete(queue);
#endif
#else
vQueueDelete(queue);
#endif
if (queue_buffer) {
free(queue_buffer);
}
}
}

Expand Down
46 changes: 22 additions & 24 deletions components/esp_wifi/esp32s3/esp_adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@
#include "esp_rom_sys.h"
#include "esp32s3/rom/ets_sys.h"
#include "private/esp_modem_wrapper.h"
#if __has_include("esp_psram.h")
#include "esp_psram.h"
#endif

#define TAG "esp_adapter"

Expand Down Expand Up @@ -254,36 +257,31 @@ 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
StaticQueue_t *queue_buffer = heap_caps_malloc_prefer(sizeof(StaticQueue_t) + (queue_len * item_size), 2,
MALLOC_CAP_DEFAULT | MALLOC_CAP_SPIRAM,
MALLOC_CAP_DEFAULT | MALLOC_CAP_INTERNAL);
if (!queue_buffer) {
return NULL;
}
QueueHandle_t queue_handle = xQueueCreateStatic(queue_len, item_size, (uint8_t *)queue_buffer + sizeof(StaticQueue_t),
queue_buffer);
if (!queue_handle) {
free(queue_buffer);
return NULL;
}

return (void *)queue_handle;
}

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
StaticQueue_t *queue_buffer = NULL;
xQueueGetStaticBuffers(queue, NULL, &queue_buffer);
vQueueDelete(queue);
#endif
#else
vQueueDelete(queue);
#endif
if (queue_buffer) {
free(queue_buffer);
}
}
}

Expand Down

0 comments on commit 0c7e957

Please sign in to comment.