From: p15692025051 <846603105@qq.com> Date: Fri, 12 May 2023 11:41:46 +0000 (+0800) Subject: lvgl缓存优化,解决抛异常问题 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=e337ba89eeb477d03324fc03ecc6965d037deed7;p=mirrors%2FASR1603_G5.git lvgl缓存优化,解决抛异常问题 --- diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/libs/png/lodepng.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/libs/png/lodepng.c index b8d3ff25..d4420250 100644 --- a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/libs/png/lodepng.c +++ b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/libs/png/lodepng.c @@ -93,79 +93,161 @@ static void lodepng_free(void* ptr) { } #else /*LODEPNG_COMPILE_ALLOCATORS*/ /* TODO: support giving additional void* payload to the custom allocators */ -#include "lvgl/lvgl.h" +/*------------------------------------start----------------------------------------*/ + +typedef struct node { + void* ptr; + struct node* next; +} node_t; -/* 结构体用于保存每个已分配的内存块的信息 */ typedef struct { - void * ptr; -} malloc_info_t; + node_t* head; +} linked_list_t; + +linked_list_t *lvgl_my_malloc_linklist = NULL; -static lv_ll_t malloc_ll; -static char is_first = 1; -static void my_mem_init(void) { - _lv_ll_init(&malloc_ll, sizeof(malloc_info_t)); +linked_list_t* create_list() { + linked_list_t* list = (linked_list_t*)malloc(sizeof(linked_list_t)); + if(list == NULL){ + return NULL; + } + list->head = NULL; + return list; } -static void * my_lv_mem_alloc(size_t size) { - if(is_first) { - is_first = 0; - my_mem_init(); - } - void * ptr = malloc(size); - if (ptr) { - malloc_info_t * info = (malloc_info_t *)_lv_ll_ins_tail(&malloc_ll); - info->ptr = ptr; - } - return ptr; -} - -static void * my_lv_mem_realloc(void * ptr, size_t new_size) { - void * new_ptr = realloc(ptr, new_size); - if (new_ptr && new_ptr != ptr) { - malloc_info_t * info; - _LV_LL_READ(&malloc_ll, info) { - if (info->ptr == ptr) { - info->ptr = new_ptr; - break; - } - } +void add_node(linked_list_t* list, void* ptr) { + if(list && ptr){ + node_t* new_node = (node_t*)malloc(sizeof(node_t)); + if(new_node) { + new_node->ptr = ptr; + new_node->next = list->head; + list->head = new_node; } - return new_ptr; + } } -static void my_lv_mem_free(void * ptr) { - malloc_info_t * info; - _LV_LL_READ(&malloc_ll, info) { - if (info->ptr == ptr) { - _lv_ll_remove(&malloc_ll, info); - return; - } +void remove_node(linked_list_t* list, void* ptr) { + if(list && ptr){ + node_t* temp = list->head; + node_t* prev = NULL; + + if (temp != NULL && temp->ptr == ptr) { + list->head = temp->next; + if(temp->ptr) { + free(temp->ptr); + } + free(temp); + temp = NULL; + return; + } + + while (temp != NULL && temp->ptr != ptr) { + prev = temp; + temp = temp->next; + } + + if (temp == NULL) return; + if(temp->ptr) { + free(temp->ptr); + } + + + prev->next = temp->next; + free(temp); + temp = NULL; + } +} + + +void remove_node1(linked_list_t* list, void* ptr) { + if(list && ptr){ + node_t* temp = list->head; + node_t* prev = NULL; + + if (temp != NULL && temp->ptr == ptr) { + list->head = temp->next; + free(temp); + temp = NULL; + return; + } + + while (temp != NULL && temp->ptr != ptr) { + prev = temp; + temp = temp->next; + } + + if (temp == NULL) return; + + prev->next = temp->next; + free(temp); + temp = NULL; } - free(ptr); } -void my_lodpng_lv_free_all(void) { - malloc_info_t * info; - _LV_LL_READ(&malloc_ll, info) { - free(info->ptr); +void lvlg_my_free_all() { + if(lvgl_my_malloc_linklist) { + node_t* current = lvgl_my_malloc_linklist->head; + node_t* next; + while (current != NULL) { + next = current->next; + if(current->ptr) + free(current->ptr); // 释放节点所指向的内存 + if(current) + free(current); // 释放节点本身 + current = next; } - _lv_ll_clear(&malloc_ll); + + lvgl_my_malloc_linklist->head = NULL; // 将链表头设置为 NULL + // free(lvgl_my_malloc_linklist); // 释放链表本身 + // lvgl_my_malloc_linklist = NULL; + } } +void* lvgl_my_malloc(size_t size){ + if(lvgl_my_malloc_linklist == NULL) { + lvgl_my_malloc_linklist = create_list(); + } + void* ret = malloc(size); + if(ret) { + add_node(lvgl_my_malloc_linklist, ret); + } + return ret; +} + +void* lvgl_my_realloc(void* ptr, size_t new_size) { + void* new_ptr = realloc(ptr, new_size); + if (new_ptr) { + remove_node1(lvgl_my_malloc_linklist, ptr); // 删除旧的节点 + add_node(lvgl_my_malloc_linklist, new_ptr); // 添加一个新的节点 + } + return new_ptr; +} +void lvgl_my_free(void* ptr) { + if(ptr) { + remove_node(lvgl_my_malloc_linklist, ptr); + ptr = NULL; + } + +} +/*------------------------------------end----------------------------------------*/ void* lodepng_malloc(size_t size) { - return my_lv_mem_alloc(size); + return lvgl_my_malloc(size); } void* lodepng_realloc(void* ptr, size_t new_size) { - return my_lv_mem_realloc(ptr, new_size); + return lvgl_my_realloc(ptr, new_size); } void lodepng_free(void* ptr) { - if(ptr) - my_lv_mem_free(ptr); + if(ptr) { + lvgl_my_free(ptr); + ptr = NULL; + } + } + #endif /*LODEPNG_COMPILE_ALLOCATORS*/ /* convince the compiler to inline a function, for use when this measurably improves performance */ diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/libs/png/lv_png.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/libs/png/lv_png.c index 581ab458..8f578c5f 100644 --- a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/libs/png/lv_png.c +++ b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/libs/png/lv_png.c @@ -14,71 +14,19 @@ #include #include "lv_ll.h" -typedef struct { - void * ptr; -} malloc_info_t; +extern void* lvgl_my_malloc(size_t size); +extern void* lvgl_my_realloc(void* ptr, size_t new_size); +extern void lvgl_my_free(void* ptr); -static lv_ll_t malloc_ll; -static char is_first = 1; - -static void my_mem_init(void) { - _lv_ll_init(&malloc_ll, sizeof(malloc_info_t)); -} - -static void * my_lv_mem_alloc(size_t size) { - if(is_first) { - is_first = 0; - my_mem_init(); - } - void * ptr = malloc(size); - if (ptr) { - malloc_info_t * info = (malloc_info_t *)_lv_ll_ins_tail(&malloc_ll); - info->ptr = ptr; - } - return ptr; -} - -static void * my_lv_mem_realloc(void * ptr, size_t new_size) { - void * new_ptr = realloc(ptr, new_size); - if (new_ptr && new_ptr != ptr) { - malloc_info_t * info; - _LV_LL_READ(&malloc_ll, info) { - if (info->ptr == ptr) { - info->ptr = new_ptr; - break; - } - } - } - return new_ptr; -} - -static void my_lv_mem_free(void * ptr) { - malloc_info_t * info; - _LV_LL_READ(&malloc_ll, info) { - if (info->ptr == ptr) { - _lv_ll_remove(&malloc_ll, info); - return; - } - } - free(ptr); -} - -void my_png_lv_free_all(void) { - malloc_info_t * info; - _LV_LL_READ(&malloc_ll, info) { - free(info->ptr); - } - _lv_ll_clear(&malloc_ll); -} #undef lv_mem_alloc -#define lv_mem_alloc my_lv_mem_alloc +#define lv_mem_alloc lvgl_my_malloc #undef lv_mem_realloc -#define lv_mem_realloc my_lv_mem_realloc +#define lv_mem_realloc lvgl_my_realloc @@ -86,11 +34,12 @@ void my_png_lv_free_all(void) { static void png_free(void *ptr) { if(ptr) { - my_lv_mem_free(ptr); + lvgl_my_free(ptr); ptr = NULL; } } + #undef lv_mem_free #define lv_mem_free png_free diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/libs/sjpg/lv_sjpg.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/libs/sjpg/lv_sjpg.c index 7ece4585..ce45b70e 100644 --- a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/libs/sjpg/lv_sjpg.c +++ b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/libs/sjpg/lv_sjpg.c @@ -70,76 +70,22 @@ **********************/ #include - -typedef struct { - void * ptr; -} malloc_info_t; - -static lv_ll_t malloc_ll; -static char is_first = 1; - -static void my_mem_init(void) { - _lv_ll_init(&malloc_ll, sizeof(malloc_info_t)); -} - -static void * my_lv_mem_alloc(size_t size) { - if(is_first) { - is_first = 0; - my_mem_init(); - } - void * ptr = malloc(size); - if (ptr) { - malloc_info_t * info = (malloc_info_t *)_lv_ll_ins_tail(&malloc_ll); - info->ptr = ptr; - } - return ptr; -} - -static void * my_lv_mem_realloc(void * ptr, size_t new_size) { - void * new_ptr = realloc(ptr, new_size); - if (new_ptr && new_ptr != ptr) { - malloc_info_t * info; - _LV_LL_READ(&malloc_ll, info) { - if (info->ptr == ptr) { - info->ptr = new_ptr; - break; - } - } - } - return new_ptr; -} - -static void my_lv_mem_free(void * ptr) { - malloc_info_t * info; - _LV_LL_READ(&malloc_ll, info) { - if (info->ptr == ptr) { - _lv_ll_remove(&malloc_ll, info); - return; - } - } - free(ptr); -} - -void my_sjpg_lv_free_all(void) { - malloc_info_t * info; - _LV_LL_READ(&malloc_ll, info) { - free(info->ptr); - } - _lv_ll_clear(&malloc_ll); -} +extern void* lvgl_my_malloc(size_t size); +extern void* lvgl_my_realloc(void* ptr, size_t new_size); +extern void lvgl_my_free(void* ptr); #undef lv_mem_alloc -#define lv_mem_alloc my_lv_mem_alloc +#define lv_mem_alloc lvgl_my_malloc #undef lv_mem_realloc -#define lv_mem_realloc my_lv_mem_realloc +#define lv_mem_realloc lvgl_my_realloc static void png_free(void *ptr) { if(ptr) { - my_lv_mem_free(ptr); + lvgl_my_free(ptr); ptr = NULL; } } diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modlvgl.c b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modlvgl.c index f4d112fb..2b1645fa 100644 --- a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modlvgl.c +++ b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modlvgl.c @@ -29822,9 +29822,7 @@ STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_lv_dpx_obj, 1, mp_lv_pct, lv_dpx */ // args contains, eg: arg0 arg1 key0 value0 key1 value1 -extern void my_sjpg_lv_free_all(void); -extern void my_png_lv_free_all(void); -extern void my_lodpng_lv_free_all(void); +extern void lvlg_my_free_all(); static void helios_lv_handler_task(void) { @@ -29882,9 +29880,7 @@ extern void my_lodpng_lv_free_all(void); } nlr_pop(); } else { - my_sjpg_lv_free_all(); - my_png_lv_free_all(); - my_lodpng_lv_free_all(); + lvlg_my_free_all(); mp_obj_print_exception(&mp_plat_print, MP_OBJ_FROM_PTR(nlr.ret_val)); } MP_THREAD_GIL_EXIT();