优化lvgl减小内存降低

百问网Introduction(介绍) — LVGL 文档 (100ask.net)里写最低占用64kbflash,16kram,但是这只能说是理论,实际因为项目需求基本是不可能达到的

因为项目用着是一颗stm32g071rb的芯片,这颗芯片只有128kflag,32kram加一颗外置flash芯片w25q实现项目,这不是为难我吗

目前项目优化到110k左右的flag,30k的ram,加大概1.5M的图片存储在w25q,下面介绍一下优化方法

flash的优化

第一步优化就是把不用的组件关掉,可以对照下面翻译查看是否要关闭


/*==================
 *  小组件使用
 *================*/

/*小组件文档: https://docs.lvgl.io/latest/en/html/widgets/index.html*/

#define LV_USE_ARC        1  /* 使用弧形小组件 */

#define LV_USE_BAR        1  /* 使用条形小组件 */

#define LV_USE_BTN        0  /* 使用按钮小组件 */

#define LV_USE_BTNMATRIX  0  /* 使用按钮矩阵小组件 */

#define LV_USE_CANVAS     0  /* 使用画布小组件 */

#define LV_USE_CHECKBOX   0  /* 使用复选框小组件 */

#define LV_USE_DROPDOWN   0  /* 使用下拉菜单小组件,要求:lv_label */

#define LV_USE_IMG        0  /* 使用图片小组件,要求:lv_label */

#define LV_USE_LABEL      1  /* 使用标签小组件 */
#if LV_USE_LABEL
    #define LV_LABEL_TEXT_SELECTION 1 /* 启用标签文本选择 */
    #define LV_LABEL_LONG_TXT_HINT 0  /* 在标签中存储一些额外信息以加速绘制很长的文本 */
#endif

#define LV_USE_LINE       0  /* 使用线条小组件 */

#define LV_USE_ROLLER     0  /* 使用滚轮小组件,要求:lv_label */
#if LV_USE_ROLLER
    #define LV_ROLLER_INF_PAGES 7 /* 当滚轮是无限的时,额外的“页面”数量 */
#endif

#define LV_USE_SLIDER     1  /* 使用滑块小组件,要求:lv_bar */

#define LV_USE_SWITCH     0  /* 使用开关小组件 */

#define LV_USE_TEXTAREA   0  /* 使用文本区域小组件,要求:lv_label */
#if LV_USE_TEXTAREA != 0
    #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /* 默认密码显示时间,单位:毫秒 */
#endif

#define LV_USE_TABLE      0  /* 使用表格小组件 */

/*==================
 * 额外组件
 *==================*/

/*-----------
 * 小组件
 *----------*/
#define LV_USE_ANIMIMG    0  /* 使用动画图片小组件 */

#define LV_USE_CALENDAR   0  /* 使用日历小组件 */
#if LV_USE_CALENDAR
    #define LV_CALENDAR_WEEK_STARTS_MONDAY 0  /* 周起始于星期一 */
    #if LV_CALENDAR_WEEK_STARTS_MONDAY
        #define LV_CALENDAR_DEFAULT_DAY_NAMES {"一", "二", "三", "四", "五", "六", "日"}
    #else
        #define LV_CALENDAR_DEFAULT_DAY_NAMES {"日", "一", "二", "三", "四", "五", "六"}
    #endif

    #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"}
    #define LV_USE_CALENDAR_HEADER_ARROW 1  /* 使用日历头部箭头 */
    #define LV_USE_CALENDAR_HEADER_DROPDOWN 1  /* 使用日历头部下拉菜单 */
#endif  /*LV_USE_CALENDAR*/

#define LV_USE_CHART      0  /* 使用图表小组件 */

#define LV_USE_COLORWHEEL 0  /* 使用色轮小组件 */

#define LV_USE_IMGBTN     0  /* 使用图像按钮小组件 */

#define LV_USE_KEYBOARD   0  /* 使用键盘小组件 */

#define LV_USE_LED        0  /* 使用LED小组件 */

#define LV_USE_LIST       0  /* 使用列表小组件 */

#define LV_USE_MENU       0  /* 使用菜单小组件 */

#define LV_USE_METER      0  /* 使用仪表小组件 */

#define LV_USE_MSGBOX     0  /* 使用消息框小组件 */

#define LV_USE_SPAN       0  /* 使用跨度小组件 */
#if LV_USE_SPAN
    /* 一行文本可以包含的最大跨度描述符数量 */
    #define LV_SPAN_SNIPPET_STACK_SIZE 64
#endif

#define LV_USE_SPINBOX    0  /* 使用数字框小组件 */

#define LV_USE_SPINNER    0  /* 使用旋转器小组件 */

#define LV_USE_TABVIEW    0  /* 使用标签视图小组件 */

#define LV_USE_TILEVIEW   0  /* 使用瓦片视图小组件 */

#define LV_USE_WIN        0  /* 使用窗口小组件 */
```

第二部降优化等级调到最高

实测图像功能是没问题的,但是本人在其他项目中遇到过float类型的数据在while()的判断中无法更新,但是可以尝试对变量添加Volatile禁止编译器优化

优化等级调到最高能大大降低flash的大小

第三步关闭lvgl内置的字库,使用自己生成的字库

生成字库可以在Font Converter — LVGL生成,教程网上很多,我自己生成的22大小的大小写字母加数字才3k,lvgl内置的14大小的就要15k

减小ram

第一步降低堆

将下面的内存减小

第第二步减小刷新范围

刷新的buff区可以减小

使用w25q来刷新图片

网上有使用文件管理系统加bmp来实现但是我的项目硬件不支持,没有所以就没弄,使用的是额外开辟一块buff缓冲区通过DMA一边读一遍发送给屏幕,手动写发送等待函数实现,这种方法很不好,但是资源不支持没办法

分享我在网上看到的使用w25q来实现的内容,本人未实验,以后有机会来实现

先要支持将w25q模拟成U盘支持读写,方便存储图片

基于stm32的USB虚拟U盘+FATFS+W25Q64_stm32虚拟u盘-CSDN博客

然后是移植lvgl的文件管理系统

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值