优化lvgl减小内存降低

优化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的文件管理系统

相关手记

365提款一直在审核 倒车入库如何修方向?会修方向者必过科目二!
bet体育365官网安全吗 法定的13种公文,上行.下行.平行分别是哪些 , 行政公文类别13种名称是什么
365bet手机在线 Genius Bar 預約及 Apple 支援服務選項
365提款一直在审核 网吧电脑的淘汰原因 网吧电脑多久淘汰一批
bet体育365官网安全吗 杜鹃的国籍,杜鹃是哪里人
365bet手机在线 足球u20是什么意思

足球u20是什么意思

10-04 👁️ 2352