fix(independent_heap): add independent heap enable option (#6953)

Signed-off-by: lijianjun <lijianjun@xiaomi.com>
Co-authored-by: lijianjun <lijianjun@xiaomi.com>
This commit is contained in:
lion2tomato
2024-10-14 17:08:46 +08:00
committed by GitHub
parent 0efa5f3758
commit 5081fbcc71
7 changed files with 57 additions and 8 deletions

View File

@@ -1768,6 +1768,11 @@ menu "LVGL configuration"
bool "Use Nuttx to open window and handle touchscreen" bool "Use Nuttx to open window and handle touchscreen"
default n default n
config LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP
bool "Use independent image heap"
depends on LV_USE_NUTTX
default n
config LV_USE_NUTTX_LIBUV config LV_USE_NUTTX_LIBUV
bool "Use uv loop to replace default timer loop and other fb/indev timers" bool "Use uv loop to replace default timer loop and other fb/indev timers"
depends on LV_USE_NUTTX depends on LV_USE_NUTTX

View File

@@ -137,6 +137,14 @@ Reset the board and using the 'NSH>' terminal start the LVGL demo:
nsh> lvgldemo nsh> lvgldemo
Configurations
--------------
Here are some configurations that you can use to customize your NuttX and LVGL setup:
- **LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP** - You can enable or disable the
LVGL image heap in NuttX. By default, it is disabled. If you enable
it, LVGL will use the NuttX heap instead.
Where can I find more information? Where can I find more information?
---------------------------------- ----------------------------------

View File

@@ -1105,6 +1105,8 @@
#define LV_USE_NUTTX 0 #define LV_USE_NUTTX 0
#if LV_USE_NUTTX #if LV_USE_NUTTX
#define LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP 0
#define LV_USE_NUTTX_LIBUV 0 #define LV_USE_NUTTX_LIBUV 0
/** Use Nuttx custom init API to open window and handle touchscreen */ /** Use Nuttx custom init API to open window and handle touchscreen */

View File

@@ -122,7 +122,7 @@ void lv_nuttx_init(const lv_nuttx_dsc_t * dsc, lv_nuttx_result_t * result)
lv_nuttx_cache_init(); lv_nuttx_cache_init();
lv_nuttx_image_cache_init(); lv_nuttx_image_cache_init(LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP);
#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN #if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN
lv_nuttx_profiler_init(); lv_nuttx_profiler_init();

View File

@@ -40,6 +40,10 @@ typedef struct {
uint32_t heap_size; uint32_t heap_size;
bool initialized; bool initialized;
bool independent_image_heap;
lv_draw_buf_malloc_cb malloc_cb;
lv_draw_buf_free_cb free_cb;
} lv_nuttx_ctx_image_cache_t; } lv_nuttx_ctx_image_cache_t;
/********************** /**********************
* STATIC PROTOTYPES * STATIC PROTOTYPES
@@ -60,7 +64,7 @@ static void free_cb(void * draw_buf);
* GLOBAL FUNCTIONS * GLOBAL FUNCTIONS
**********************/ **********************/
void lv_nuttx_image_cache_init(void) void lv_nuttx_image_cache_init(bool use_independent_image_heap)
{ {
lv_draw_buf_handlers_t * handlers = image_cache_draw_buf_handlers; lv_draw_buf_handlers_t * handlers = image_cache_draw_buf_handlers;
handlers->buf_malloc_cb = malloc_cb; handlers->buf_malloc_cb = malloc_cb;
@@ -69,17 +73,28 @@ void lv_nuttx_image_cache_init(void)
ctx = lv_malloc_zeroed(sizeof(lv_nuttx_ctx_image_cache_t)); ctx = lv_malloc_zeroed(sizeof(lv_nuttx_ctx_image_cache_t));
LV_ASSERT_MALLOC(ctx); LV_ASSERT_MALLOC(ctx);
ctx->malloc_cb = handlers->buf_malloc_cb;
ctx->free_cb = handlers->buf_free_cb;
handlers->buf_malloc_cb = malloc_cb;
handlers->buf_free_cb = free_cb;
ctx->initialized = false; ctx->initialized = false;
ctx->independent_image_heap = use_independent_image_heap;
} }
void lv_nuttx_image_cache_deinit(void) void lv_nuttx_image_cache_deinit(void)
{ {
if(ctx->independent_image_heap == false) goto FREE_CONTEXT;
if(ctx->initialized == false) goto FREE_CONTEXT; if(ctx->initialized == false) goto FREE_CONTEXT;
mm_uninitialize(ctx->heap); mm_uninitialize(ctx->heap);
free(ctx->mem); free(ctx->mem);
FREE_CONTEXT: FREE_CONTEXT:
lv_draw_buf_handlers_t * handlers = image_cache_draw_buf_handlers;
handlers->buf_malloc_cb = ctx->malloc_cb;
handlers->buf_free_cb = ctx->free_cb;
lv_free(ctx); lv_free(ctx);
ctx = NULL; ctx = NULL;
@@ -152,8 +167,7 @@ static void heap_memdump(struct mm_heap_s * heap)
static void * malloc_cb(size_t size_bytes, lv_color_format_t color_format) static void * malloc_cb(size_t size_bytes, lv_color_format_t color_format)
{ {
LV_UNUSED(color_format); LV_UNUSED(color_format);
if(ctx->independent_image_heap == true && ctx->initialized == false) {
if(ctx->initialized == false) {
if(defer_init() == false) return NULL; if(defer_init() == false) return NULL;
} }
@@ -161,7 +175,7 @@ static void * malloc_cb(size_t size_bytes, lv_color_format_t color_format)
size_bytes += LV_DRAW_BUF_ALIGN - 1; size_bytes += LV_DRAW_BUF_ALIGN - 1;
uint32_t cache_max_size = lv_cache_get_max_size(img_cache_p, NULL); uint32_t cache_max_size = lv_cache_get_max_size(img_cache_p, NULL);
if(size_bytes > cache_max_size) { if(lv_cache_is_enabled(img_cache_p) && size_bytes > cache_max_size) {
LV_LOG_ERROR("data size (%" LV_PRIu32 ") is larger than max size (%" LV_PRIu32 ")", LV_LOG_ERROR("data size (%" LV_PRIu32 ") is larger than max size (%" LV_PRIu32 ")",
(uint32_t)size_bytes, (uint32_t)size_bytes,
cache_max_size); cache_max_size);
@@ -169,7 +183,13 @@ static void * malloc_cb(size_t size_bytes, lv_color_format_t color_format)
} }
while(1) { while(1) {
void * mem = mm_malloc(ctx->heap, size_bytes); void * mem = NULL;
if(ctx->independent_image_heap) {
mem = mm_malloc(ctx->heap, size_bytes);
}
else if((!lv_cache_is_enabled(img_cache_p)) || (lv_cache_get_size(img_cache_p, NULL) + size_bytes < cache_max_size)) {
mem = ctx->malloc_cb(size_bytes, color_format);
}
if(mem) return mem; if(mem) return mem;
LV_LOG_INFO("appears to be out of memory. attempting to evict one cache entry. with allocated size %" LV_PRIu32, LV_LOG_INFO("appears to be out of memory. attempting to evict one cache entry. with allocated size %" LV_PRIu32,
(uint32_t)size_bytes); (uint32_t)size_bytes);
@@ -184,7 +204,12 @@ static void * malloc_cb(size_t size_bytes, lv_color_format_t color_format)
static void free_cb(void * draw_buf) static void free_cb(void * draw_buf)
{ {
mm_free(ctx->heap, draw_buf); if(ctx->independent_image_heap == true) {
mm_free(ctx->heap, draw_buf);
}
else {
ctx->free_cb(draw_buf);
}
} }
#endif /* LV_USE_NUTTX */ #endif /* LV_USE_NUTTX */

View File

@@ -15,6 +15,7 @@ extern "C" {
*********************/ *********************/
#include "../../lv_conf_internal.h" #include "../../lv_conf_internal.h"
#include LV_STDBOOL_INCLUDE
/********************* /*********************
* DEFINES * DEFINES
@@ -28,7 +29,7 @@ extern "C" {
* GLOBAL PROTOTYPES * GLOBAL PROTOTYPES
**********************/ **********************/
void lv_nuttx_image_cache_init(void); void lv_nuttx_image_cache_init(bool use_independent_image_heap);
void lv_nuttx_image_cache_deinit(void); void lv_nuttx_image_cache_deinit(void);

View File

@@ -3574,6 +3574,14 @@
#endif #endif
#if LV_USE_NUTTX #if LV_USE_NUTTX
#ifndef LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP
#ifdef CONFIG_LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP
#define LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP CONFIG_LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP
#else
#define LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP 0
#endif
#endif
#ifndef LV_USE_NUTTX_LIBUV #ifndef LV_USE_NUTTX_LIBUV
#ifdef CONFIG_LV_USE_NUTTX_LIBUV #ifdef CONFIG_LV_USE_NUTTX_LIBUV
#define LV_USE_NUTTX_LIBUV CONFIG_LV_USE_NUTTX_LIBUV #define LV_USE_NUTTX_LIBUV CONFIG_LV_USE_NUTTX_LIBUV