mirror of
https://github.com/espressif/esp-idf.git
synced 2024-09-19 14:26:01 -04:00
fix(wifi): Add PSRAM failure fallback in WiFi Queue API's
This commit is contained in:
parent
b9c58c550c
commit
94a915fd5c
@ -49,6 +49,9 @@
|
|||||||
#include "esp_rom_sys.h"
|
#include "esp_rom_sys.h"
|
||||||
#include "esp32/rom/ets_sys.h"
|
#include "esp32/rom/ets_sys.h"
|
||||||
#include "private/esp_modem_wrapper.h"
|
#include "private/esp_modem_wrapper.h"
|
||||||
|
#if __has_include("esp_psram.h")
|
||||||
|
#include "esp_psram.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define TAG "esp_adapter"
|
#define TAG "esp_adapter"
|
||||||
|
|
||||||
@ -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)
|
static void * queue_create_wrapper(uint32_t queue_len, uint32_t item_size)
|
||||||
{
|
{
|
||||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0)
|
StaticQueue_t *queue_buffer = heap_caps_malloc_prefer(sizeof(StaticQueue_t) + (queue_len * item_size), 2,
|
||||||
/*
|
MALLOC_CAP_DEFAULT | MALLOC_CAP_SPIRAM,
|
||||||
* Since release/v5.1, FreeRTOS has been updated to always use internal memory (i.e., DRAM)
|
MALLOC_CAP_DEFAULT | MALLOC_CAP_INTERNAL);
|
||||||
* for dynamic memory allocation. Calling FreeRTOS creation functions (e.g., xTaskCreate(), xQueueCreate())
|
if (!queue_buffer) {
|
||||||
* will guarantee that the memory allocated for those tasks/objects is from internal memory.
|
return NULL;
|
||||||
* For more details, please refer to the Migration Guide in release/v5.1.
|
}
|
||||||
*/
|
QueueHandle_t queue_handle = xQueueCreateStatic(queue_len, item_size, (uint8_t *)queue_buffer + sizeof(StaticQueue_t),
|
||||||
#if CONFIG_SPIRAM_USE_MALLOC
|
queue_buffer);
|
||||||
/* Use xQueueCreateWithCaps() to allocate from SPIRAM */
|
if (!queue_handle) {
|
||||||
return (void *)xQueueCreateWithCaps(queue_len, item_size, MALLOC_CAP_SPIRAM);
|
free(queue_buffer);
|
||||||
#else
|
return NULL;
|
||||||
return (void *)xQueueCreate(queue_len, item_size);
|
}
|
||||||
#endif
|
|
||||||
#else
|
return (void *)queue_handle;
|
||||||
return (void *)xQueueCreate(queue_len, item_size);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void queue_delete_wrapper(void *queue)
|
static void queue_delete_wrapper(void *queue)
|
||||||
{
|
{
|
||||||
if (queue) {
|
if (queue) {
|
||||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0)
|
StaticQueue_t *queue_buffer = NULL;
|
||||||
#if CONFIG_SPIRAM_USE_MALLOC
|
xQueueGetStaticBuffers(queue, NULL, &queue_buffer);
|
||||||
vQueueDeleteWithCaps(queue);
|
|
||||||
#else
|
|
||||||
vQueueDelete(queue);
|
vQueueDelete(queue);
|
||||||
#endif
|
if (queue_buffer) {
|
||||||
#else
|
free(queue_buffer);
|
||||||
vQueueDelete(queue);
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,22 +252,31 @@ static int32_t IRAM_ATTR mutex_unlock_wrapper(void *mutex)
|
|||||||
|
|
||||||
static void *queue_create_wrapper(uint32_t queue_len, uint32_t item_size)
|
static void *queue_create_wrapper(uint32_t queue_len, uint32_t item_size)
|
||||||
{
|
{
|
||||||
#if CONFIG_SPIRAM_USE_MALLOC
|
StaticQueue_t *queue_buffer = heap_caps_malloc_prefer(sizeof(StaticQueue_t) + (queue_len * item_size), 2,
|
||||||
/* Use xQueueCreateWithCaps() to allocate from SPIRAM */
|
MALLOC_CAP_DEFAULT | MALLOC_CAP_SPIRAM,
|
||||||
return (void *)xQueueCreateWithCaps(queue_len, item_size, MALLOC_CAP_SPIRAM);
|
MALLOC_CAP_DEFAULT | MALLOC_CAP_INTERNAL);
|
||||||
#else
|
if (!queue_buffer) {
|
||||||
return (void *)xQueueCreate(queue_len, item_size);
|
return NULL;
|
||||||
#endif
|
}
|
||||||
|
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)
|
static void queue_delete_wrapper(void *queue)
|
||||||
{
|
{
|
||||||
if (queue) {
|
if (queue) {
|
||||||
#if CONFIG_SPIRAM_USE_MALLOC
|
StaticQueue_t *queue_buffer = NULL;
|
||||||
vQueueDeleteWithCaps(queue);
|
xQueueGetStaticBuffers(queue, NULL, &queue_buffer);
|
||||||
#else
|
|
||||||
vQueueDelete(queue);
|
vQueueDelete(queue);
|
||||||
#endif
|
if (queue_buffer) {
|
||||||
|
free(queue_buffer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,22 +252,31 @@ static int32_t IRAM_ATTR mutex_unlock_wrapper(void *mutex)
|
|||||||
|
|
||||||
static void *queue_create_wrapper(uint32_t queue_len, uint32_t item_size)
|
static void *queue_create_wrapper(uint32_t queue_len, uint32_t item_size)
|
||||||
{
|
{
|
||||||
#if CONFIG_SPIRAM_USE_MALLOC
|
StaticQueue_t *queue_buffer = heap_caps_malloc_prefer(sizeof(StaticQueue_t) + (queue_len * item_size), 2,
|
||||||
/* Use xQueueCreateWithCaps() to allocate from SPIRAM */
|
MALLOC_CAP_DEFAULT | MALLOC_CAP_SPIRAM,
|
||||||
return (void *)xQueueCreateWithCaps(queue_len, item_size, MALLOC_CAP_SPIRAM);
|
MALLOC_CAP_DEFAULT | MALLOC_CAP_INTERNAL);
|
||||||
#else
|
if (!queue_buffer) {
|
||||||
return (void *)xQueueCreate(queue_len, item_size);
|
return NULL;
|
||||||
#endif
|
}
|
||||||
|
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)
|
static void queue_delete_wrapper(void *queue)
|
||||||
{
|
{
|
||||||
if (queue) {
|
if (queue) {
|
||||||
#if CONFIG_SPIRAM_USE_MALLOC
|
StaticQueue_t *queue_buffer = NULL;
|
||||||
vQueueDeleteWithCaps(queue);
|
xQueueGetStaticBuffers(queue, NULL, &queue_buffer);
|
||||||
#else
|
|
||||||
vQueueDelete(queue);
|
vQueueDelete(queue);
|
||||||
#endif
|
if (queue_buffer) {
|
||||||
|
free(queue_buffer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -257,7 +257,32 @@ static int32_t IRAM_ATTR mutex_unlock_wrapper(void *mutex)
|
|||||||
|
|
||||||
static void *queue_create_wrapper(uint32_t queue_len, uint32_t item_size)
|
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)
|
static int32_t queue_send_wrapper(void *queue, void *item, uint32_t block_time_tick)
|
||||||
@ -691,7 +716,7 @@ wifi_osi_funcs_t g_wifi_osi_funcs = {
|
|||||||
._mutex_lock = mutex_lock_wrapper,
|
._mutex_lock = mutex_lock_wrapper,
|
||||||
._mutex_unlock = mutex_unlock_wrapper,
|
._mutex_unlock = mutex_unlock_wrapper,
|
||||||
._queue_create = queue_create_wrapper,
|
._queue_create = queue_create_wrapper,
|
||||||
._queue_delete = (void(*)(void *))vQueueDelete,
|
._queue_delete = queue_delete_wrapper,
|
||||||
._queue_send = queue_send_wrapper,
|
._queue_send = queue_send_wrapper,
|
||||||
._queue_send_from_isr = queue_send_from_isr_wrapper,
|
._queue_send_from_isr = queue_send_from_isr_wrapper,
|
||||||
._queue_send_to_back = queue_send_to_back_wrapper,
|
._queue_send_to_back = queue_send_to_back_wrapper,
|
||||||
|
@ -50,6 +50,9 @@
|
|||||||
#include "esp_rom_sys.h"
|
#include "esp_rom_sys.h"
|
||||||
#include "esp32s2/rom/ets_sys.h"
|
#include "esp32s2/rom/ets_sys.h"
|
||||||
#include "private/esp_modem_wrapper.h"
|
#include "private/esp_modem_wrapper.h"
|
||||||
|
#if __has_include("esp_psram.h")
|
||||||
|
#include "esp_psram.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define TAG "esp_adapter"
|
#define TAG "esp_adapter"
|
||||||
|
|
||||||
@ -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)
|
static void * queue_create_wrapper(uint32_t queue_len, uint32_t item_size)
|
||||||
{
|
{
|
||||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0)
|
StaticQueue_t *queue_buffer = heap_caps_malloc_prefer(sizeof(StaticQueue_t) + (queue_len * item_size), 2,
|
||||||
/*
|
MALLOC_CAP_DEFAULT | MALLOC_CAP_SPIRAM,
|
||||||
* Since release/v5.1, FreeRTOS has been updated to always use internal memory (i.e., DRAM)
|
MALLOC_CAP_DEFAULT | MALLOC_CAP_INTERNAL);
|
||||||
* for dynamic memory allocation. Calling FreeRTOS creation functions (e.g., xTaskCreate(), xQueueCreate())
|
if (!queue_buffer) {
|
||||||
* will guarantee that the memory allocated for those tasks/objects is from internal memory.
|
return NULL;
|
||||||
* For more details, please refer to the Migration Guide in release/v5.1.
|
}
|
||||||
*/
|
QueueHandle_t queue_handle = xQueueCreateStatic(queue_len, item_size, (uint8_t *)queue_buffer + sizeof(StaticQueue_t),
|
||||||
#if CONFIG_SPIRAM_USE_MALLOC
|
queue_buffer);
|
||||||
/* Use xQueueCreateWithCaps() to allocate from SPIRAM */
|
if (!queue_handle) {
|
||||||
return (void *)xQueueCreateWithCaps(queue_len, item_size, MALLOC_CAP_SPIRAM);
|
free(queue_buffer);
|
||||||
#else
|
return NULL;
|
||||||
return (void *)xQueueCreate(queue_len, item_size);
|
}
|
||||||
#endif
|
|
||||||
#else
|
return (void *)queue_handle;
|
||||||
return (void *)xQueueCreate(queue_len, item_size);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void queue_delete_wrapper(void *queue)
|
static void queue_delete_wrapper(void *queue)
|
||||||
{
|
{
|
||||||
if (queue) {
|
if (queue) {
|
||||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0)
|
StaticQueue_t *queue_buffer = NULL;
|
||||||
#if CONFIG_SPIRAM_USE_MALLOC
|
xQueueGetStaticBuffers(queue, NULL, &queue_buffer);
|
||||||
vQueueDeleteWithCaps(queue);
|
|
||||||
#else
|
|
||||||
vQueueDelete(queue);
|
vQueueDelete(queue);
|
||||||
#endif
|
if (queue_buffer) {
|
||||||
#else
|
free(queue_buffer);
|
||||||
vQueueDelete(queue);
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,6 +51,9 @@
|
|||||||
#include "esp_rom_sys.h"
|
#include "esp_rom_sys.h"
|
||||||
#include "esp32s3/rom/ets_sys.h"
|
#include "esp32s3/rom/ets_sys.h"
|
||||||
#include "private/esp_modem_wrapper.h"
|
#include "private/esp_modem_wrapper.h"
|
||||||
|
#if __has_include("esp_psram.h")
|
||||||
|
#include "esp_psram.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define TAG "esp_adapter"
|
#define TAG "esp_adapter"
|
||||||
|
|
||||||
@ -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)
|
static void * queue_create_wrapper(uint32_t queue_len, uint32_t item_size)
|
||||||
{
|
{
|
||||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0)
|
StaticQueue_t *queue_buffer = heap_caps_malloc_prefer(sizeof(StaticQueue_t) + (queue_len * item_size), 2,
|
||||||
/*
|
MALLOC_CAP_DEFAULT | MALLOC_CAP_SPIRAM,
|
||||||
* Since release/v5.1, FreeRTOS has been updated to always use internal memory (i.e., DRAM)
|
MALLOC_CAP_DEFAULT | MALLOC_CAP_INTERNAL);
|
||||||
* for dynamic memory allocation. Calling FreeRTOS creation functions (e.g., xTaskCreate(), xQueueCreate())
|
if (!queue_buffer) {
|
||||||
* will guarantee that the memory allocated for those tasks/objects is from internal memory.
|
return NULL;
|
||||||
* For more details, please refer to the Migration Guide in release/v5.1.
|
}
|
||||||
*/
|
QueueHandle_t queue_handle = xQueueCreateStatic(queue_len, item_size, (uint8_t *)queue_buffer + sizeof(StaticQueue_t),
|
||||||
#if CONFIG_SPIRAM_USE_MALLOC
|
queue_buffer);
|
||||||
/* Use xQueueCreateWithCaps() to allocate from SPIRAM */
|
if (!queue_handle) {
|
||||||
return (void *)xQueueCreateWithCaps(queue_len, item_size, MALLOC_CAP_SPIRAM);
|
free(queue_buffer);
|
||||||
#else
|
return NULL;
|
||||||
return (void *)xQueueCreate(queue_len, item_size);
|
}
|
||||||
#endif
|
|
||||||
#else
|
return (void *)queue_handle;
|
||||||
return (void *)xQueueCreate(queue_len, item_size);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void queue_delete_wrapper(void *queue)
|
static void queue_delete_wrapper(void *queue)
|
||||||
{
|
{
|
||||||
if (queue) {
|
if (queue) {
|
||||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0)
|
StaticQueue_t *queue_buffer = NULL;
|
||||||
#if CONFIG_SPIRAM_USE_MALLOC
|
xQueueGetStaticBuffers(queue, NULL, &queue_buffer);
|
||||||
vQueueDeleteWithCaps(queue);
|
|
||||||
#else
|
|
||||||
vQueueDelete(queue);
|
vQueueDelete(queue);
|
||||||
#endif
|
if (queue_buffer) {
|
||||||
#else
|
free(queue_buffer);
|
||||||
vQueueDelete(queue);
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user