LVGL8.3 对象和内存详解
·
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 算法的优缺点可自行了解。
更多推荐
已为社区贡献16条内容
所有评论(0)