From 19f8a92a04548b02abe7948d33e3682eb787357e Mon Sep 17 00:00:00 2001 From: Dong Heng Date: Mon, 21 May 2018 15:25:29 +0800 Subject: [PATCH] feat(esp8266): Add access align capacity to heap API --- .../esp8266/include/esp_wifi_os_adapter.h | 9 ++++- components/esp8266/include/esp_wifi_osi.h | 13 ++++++- .../esp8266/source/esp_wifi_os_adapter.c | 37 ++++++++++++++++++- 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/components/esp8266/include/esp_wifi_os_adapter.h b/components/esp8266/include/esp_wifi_os_adapter.h index a559de5d..a5c3f8c7 100644 --- a/components/esp8266/include/esp_wifi_os_adapter.h +++ b/components/esp8266/include/esp_wifi_os_adapter.h @@ -28,6 +28,10 @@ extern "C" { #define OSI_QUEUE_SEND_BACK 1 #define OSI_QUEUE_SEND_OVERWRITE 2 +#define OSI_MALLOC_CAP_32BIT (1 << 1) +#define OSI_MALLOC_CAP_8BIT (1 << 2) +#define OSI_MALLOC_CAP_DMA (1 << 3) + typedef struct { uint32_t (*enter_critical)(void); void (*exit_critical)(uint32_t tmp); @@ -74,7 +78,10 @@ typedef struct { bool (*timer_stop)(void *timer, uint32_t ticks); bool (*timer_delete)(void *timer, uint32_t ticks); - void *(*malloc)(uint32_t size); + void *(*malloc)(uint32_t size, uint32_t cap); + void *(*zalloc)(uint32_t size, uint32_t cap); + void *(*realloc)(void *ptr, uint32_t size, uint32_t cap); + void *(*calloc)(uint32_t cnt, uint32_t size, uint32_t cap); void (*free)(void *p); uint32_t (*get_free_heap_size)(void); diff --git a/components/esp8266/include/esp_wifi_osi.h b/components/esp8266/include/esp_wifi_osi.h index 11228320..961e3427 100644 --- a/components/esp8266/include/esp_wifi_osi.h +++ b/components/esp8266/include/esp_wifi_osi.h @@ -131,8 +131,17 @@ extern wifi_osi_funcs_t s_wifi_osi_funcs; #define wifi_timer_delete(t, tk) \ s_wifi_osi_funcs.timer_delete(t, tk) -#define wifi_malloc(s) \ - s_wifi_osi_funcs.malloc(s) +#define wifi_malloc(s, c) \ + s_wifi_osi_funcs.malloc(s, c) + +#define wifi_zalloc(s, c) \ + s_wifi_osi_funcs.zalloc(s, c) + +#define wifi_calloc(cnt, s, c) \ + s_wifi_osi_funcs.calloc(cnt, s, c) + +#define wifi_realloc(ptr, s, c) \ + s_wifi_osi_funcs.realloc(ptr, s, c) #define wifi_free(p) \ s_wifi_osi_funcs.free(p) diff --git a/components/esp8266/source/esp_wifi_os_adapter.c b/components/esp8266/source/esp_wifi_os_adapter.c index 1b24b44f..918781db 100644 --- a/components/esp8266/source/esp_wifi_os_adapter.c +++ b/components/esp8266/source/esp_wifi_os_adapter.c @@ -15,6 +15,8 @@ #include "esp_wifi_os_adapter.h" #include "esp_system.h" +#include "c_types.h" + #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" @@ -271,6 +273,34 @@ static bool timer_delete_wrapper(void *timer, uint32_t ticks) return xTimerDelete(timer, ticks); } +static void *malloc_wrapper(uint32_t s, uint32_t cap) +{ + if (cap & (OSI_MALLOC_CAP_8BIT | OSI_MALLOC_CAP_DMA)) + return os_malloc(s); + else + return os_malloc_iram(s); +} + +static void *zalloc_wrapper(uint32_t s, uint32_t cap) +{ + return os_zalloc(s); +} + +static void *realloc_wrapper(void *ptr, uint32_t s, uint32_t cap) +{ + return os_realloc(ptr, s); +} + +static void *calloc_wrapper(uint32_t cnt, uint32_t s, uint32_t cap) +{ + return os_calloc(cnt, s); +} + +static void free_wrapper(void *ptr) +{ + os_free(ptr); +} + static void srand_wrapper(uint32_t seed) { /* empty function */ @@ -327,8 +357,11 @@ wifi_osi_funcs_t s_wifi_osi_funcs = { .timer_stop = timer_stop_wrapper, .timer_delete = timer_delete_wrapper, - .malloc = malloc, - .free = free, + .malloc = malloc_wrapper, + .zalloc = zalloc_wrapper, + .realloc = realloc_wrapper, + .calloc = calloc_wrapper, + .free = free_wrapper, .get_free_heap_size = get_free_heap_size_wrapper, .srand = srand_wrapper,