LVGL8.3 对象和内存详解

申请空间

在创建 LVGL 的组件时,对应的创建组件的 create 函数会从 LVGL 的堆栈中分配一块内存去保存描述组件(位置,尺寸,颜色)样式信息的属性,属性的类型为 lv_obj_t 结构体,该结构体继承了 lv_obj_class_t 结构体的内容。

typedef struct _lv_obj_t {
    const lv_obj_class_t * class_p;
    struct _lv_obj_t * parent;
    _lv_obj_spec_attr_t * spec_attr;
    _lv_obj_style_t * styles;
#if LV_USE_USER_DATA
    void * user_data;
#endif
    lv_area_t coords;
    lv_obj_flag_t flags;
    lv_state_t state;
    uint16_t layout_inv : 1;
    uint16_t scr_layout_inv : 1;
    uint16_t skip_trans : 1;
    uint16_t style_cnt  : 6;
    uint16_t h_layout   : 1;
    uint16_t w_layout   : 1;
} lv_obj_t;

所以需要声明一个 lv_obj_t * 的指针指向保存组件样式属性这段内存的首地址,LVGL 的堆栈的大小在 lv_conf.h 文件中被定义:

/*1: use custom malloc/free, 0: use the built-in `lv_mem_alloc()` and `lv_mem_free()`*/
#define LV_MEM_CUSTOM 0
#if LV_MEM_CUSTOM == 0
    /*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/
    // --------------------- modify by zhbi -------------------------
    #define LV_MEM_SIZE (48U * 1024U)          /*[bytes]*/
    // --------------------------------------------------------------
    /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/
    #define LV_MEM_ADR 0     /*0: unused*/
    /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/
    #if LV_MEM_ADR == 0
        //#define LV_MEM_POOL_INCLUDE your_alloc_library  /* Uncomment if using an external allocator*/
        //#define LV_MEM_POOL_ALLOC   your_alloc          /* Uncomment if using an external allocator*/
    #endif

#else       /*LV_MEM_CUSTOM*/
    #define LV_MEM_CUSTOM_INCLUDE <stdlib.h>   /*Header for the dynamic memory function*/
    #define LV_MEM_CUSTOM_ALLOC   malloc
    #define LV_MEM_CUSTOM_FREE    free
    #define LV_MEM_CUSTOM_REALLOC realloc
#endif     /*LV_MEM_CUSTOM*/

释放空间

当对象不不再使用时,可以调用 lv_obj_del(obj) 将该对象申请的缓存释放,并且由于 lv_conf.h 中默认使用 “附近空闲存储自动回收功能”,在删除对象后,LVGL 能够自动把堆栈中释放出的碎片化小块内存连接为一个整体,为后面的程序申请内存提供便利。

空间问题

(1) 堆栈空间不足时导致组件无法被创建,并可能导致程序卡死问题,需要在配置文件中修改 LV_MEM_SIZE 宏的大小,由于每个组件创建时都需要向 LVGL 堆栈申请内存所以修改 LV_MEM_SIZE 的大小直接影响可以显示的组件数量(平均每个控件所占内存控件大致为 100-150 Byte 左右)。

(2) 注意对于 LVGL 来说每执行一次组件的 create 函数将生成一个相同类型的新组件,所以一个组件没有被删除时不能再调用 create 函数去创建该组件,否则会生成重复的组件消耗堆栈空间造成 MCU 因内存泄漏而卡死。

(3) 修改 LV_MEM_CUSTOM 的值为 1,则使用 C 语言支持的内存管理函数,此方式不再受 LV_MEN_SIZE 大小的限制,同时 LVGL 内置的内存管理策略TLSF 算法的也不再发生作用,TLSF 算法的优缺点可自行了解。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐