LVGL简介
LVGL 是一个 C 语言编写的免费的开源图形库,提供了用于嵌入式 GUI 的各种元素。用户可以利用丰富的图形库资源,在消耗极低内存的情况下构建视觉效果丰富多彩的 GUI 。
配置项目config
打开上次实验创建好的测试工程,点击工具栏的Config,按下面几张图来进行配置


选用LVGL V9

这里我想跑个benchmark测一下性能,所以将LVGL demo选择为 LVGL demo benchmark,其他的保持默认即可

最后记得点击下面的save按钮保存,并关闭config页面
分析报错原因
如果修改好了上面的配置文件,直接编译,会报如下错误:

花了点时间,自己研究了下,大概弄明白了配置文件的运作逻辑。
在aic_ui.c中的 aic_ui_init() 函数内,定义了这三句:
lvgl_data_check();
extern void ui_init(void);
ui_init();
通过查找ui_init()的引用能发现,如果我们运行的LVGL demo是匠芯创官方写好的,那么会通过ui_init()调用packages\artinchip\lvgl-ui\aic_demo* 下特定demo的源代码。
例如elevate_ui中就有实现了ui_init()

当我们切换到LVGL官方的demo时,例如我们这里使用的是benchmark demo,那么在config中 CONFIG_AIC_LVGL_ELEVATOR_DEMO 就会被注释掉,而CONFIG_AIC_LVGL_DEMO_BENCHMARK被启用。

对应着在rtconfig.h中就没有定义 AIC_LVGL_ELEVATOR_DEMO ,取而代之的是AIC_LVGL_DEMO_BENCHMARK,如下图所示

问题来了,编译的时候是如何来进行条件编译的呢?
这里就用到了SConscript 文件,SCons 是一套由 Python 语言编写的开源构建系统,类似于 GNU Make
每个demo文件夹下都有SConscript,例如在elevator_demo目录下就能看到

对照着文件解释一下,
src += Glob('./elevator_ui.c')
这行把 elevator_ui.c 文件加入源码列表 src。

group = group + DefineGroup('LVGL-port', src, depend = ['AIC_LVGL_ELEVATOR_DEMO'], CPPPATH = CPPPATH, INSTALL = install) 这行用 DefineGroup 定义了一个源码组,名字叫 LVGL-port,包含 src 里的所有源码文件。
重点是 depend 参数:depend = ['AIC_LVGL_ELEVATOR_DEMO']

depend 的作用是:只有当 AIC_LVGL_ELEVATOR_DEMO 这个宏(或配置项)被打开时,这个源码组才会被编译。如果在 config 里把 AIC_LVGL_ELEVATOR_DEMO 关掉了,这个源码组就不会被加入编译流程,elevator_ui.c 也就不会被编译。
自然地,现在就能回答最开始的问题了,ui_init()找不到引用的原因正是没有任何一个aic_demo(即匠芯创官方写的LVGL demo)被编译进来。
修改aic_ui.c代码
将aic_ui_init()函数的下面这两行注释掉
新增一行
lv_demo_benchmark();
在aic_ui.c文件包含部分之后,新增代码
#ifdef AIC_LVGL_DEMO_BENCHMARK
#include "lvgl_v9/lvgl/demos/benchmark/lv_demo_benchmark.h"
#endif
启用CPU监视
要跑benchmark,需要给系统一个性能监视器,否则会在跑benchmark时,屏幕显示LV_USE_PERF_MONITOR is not enabled提示,结果页面也不会显示FPS和CPU占用率
在packages\artinchip\lvgl-ui\lvgl_v9\lv_conf.h 找到 LV_USE_PERF_MONITOR,将值改为1

实验结果
编译、下载,进入系统后就能看到正在运行的benchmark了


可以看到大部分场景稳定60FPS以上,而且CPU占用率都不高
完整的结果表单见视频