lvgl缓存优化,解决抛异常问题
authorp15692025051 <846603105@qq.com>
Fri, 12 May 2023 11:41:46 +0000 (19:41 +0800)
committerp15692025051 <846603105@qq.com>
Fri, 12 May 2023 11:41:46 +0000 (19:41 +0800)
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/libs/png/lodepng.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/libs/png/lv_png.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/libs/sjpg/lv_sjpg.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modlvgl.c

index b8d3ff2..d442025 100644 (file)
@@ -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 */
index 581ab45..8f578c5 100644 (file)
 #include <stdlib.h>
 #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
 
index 7ece458..ce45b70 100644 (file)
  **********************/
 #include <stdlib.h>
 
-
-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;
        }
 }
index f4d112f..2b1645f 100644 (file)
@@ -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();