LVGL 入门(二):启动流程解析与源码裁剪技巧
本文介绍了LVGL图形库的核心运行机制与裁剪方法。主要内容包括:1) LVGL在Windows平台的启动流程,重点解析WinMain函数中的初始化、Demo运行和主循环三阶段;2) 核心定时器任务系统lv_task_handler的工作原理及注意事项;3) 基于lv_conf.h文件的源码裁剪方法,以适应不同硬件资源限制。文章还提供了LVGL在RAM和Flash上的资源占用参考值,并给出了裁剪时的
目录
- 一、前言
- 二、LVGL 核心启动流程(WinMain 函数拆解)
- 三、LVGL 定时器任务核心:lv_task_handler ()
- 四、LVGL 源码裁剪(基于 lv_conf.h)
- 五、总结
- 六、结尾
一、前言
我是 Hello_Embed,在上一篇笔记中我们完成了 LVGL 的基础环境搭建,本次将聚焦 LVGL 的核心运行逻辑 —— 启动流程,拆解 WinMain 函数的执行框架,明确 LVGL 的驱动核心;同时针对嵌入式开发中常见的资源限制问题,讲解 LVGL 源码的裁剪方法,帮助按需优化 RAM/Flash 占用,适配不同硬件场景。
二、LVGL 核心启动流程(WinMain 函数拆解)
LVGL 在 Windows 平台下的启动逻辑集中在 WinMain 函数中,其核心框架如下:
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nCmdShow)
{
/*Initialize LVGL*/
lv_init();
/*Initialize the HAL for LVGL*/
lv_display_t * display = lv_windows_create_display(title, 1024, 600, 100, FALSE, FALSE);
lv_windows_acquire_pointer_indev(display);
/*Output prompt information to the console, you can also use printf() to print directly*/
LV_LOG_USER("LVGL initialization completed!");
/*Run the demo*/
// 下面这三行是运行一个demo,第一行和后面两行的效果是一样的,只能同时去掉第一行或者后面两行,两者之一的注释
// 后续学习的时候要确保下面这三行都被注释掉
lv_demo_widgets();
//char * demo_str[] = {"widgets"};
//lv_demos_create(demo_str, strlen((char * )demo_str));
while(1) {
/* Periodically call the lv_task handler.
* It could be done in a timer interrupt or an OS task too.*/
lv_task_handler();
usleep(5000); /*Just to let the system breath*/
}
return 0;
}
从代码框架可清晰梳理启动流程:
- 初始化阶段:
lv_init()完成 LVGL 核心库初始化,lv_windows_create_display()初始化显示硬件抽象层(HAL),完成显示设备与输入设备的绑定; - Demo 运行阶段:通过
lv_demo_widgets()或lv_demos_create()运行示例程序(学习阶段需注释该部分); - 主循环阶段:进入无限循环,周期性调用
lv_task_handler()并短暂休眠,驱动 LVGL 界面运行。
三、LVGL 定时器任务核心:lv_task_handler ()
从启动流程可明确,LVGL 初始化完成后,真正的运行核心是lv_task_handler()(定时器处理程序):
- 核心作用:作为界面元素创建、布局、渲染的核心调度组件,管理并调度各类任务,保障界面流畅运行与响应性能,是驱动 LVGL 整体运行的核心;
- 任务系统特性:LVGL 内置的定时器任务系统支持开发者注册自定义函数,实现毫秒级时间敏感操作和周期性运动控制;
- 关键注意点:LVGL 定时器为非抢占式—— 一旦某个定时器任务开始执行,会运行至函数退出,期间不会被其他定时器任务中断。因此需确保注册的定时器任务执行时长不宜过长,避免阻塞整个界面响应。
补充:
lv_task_handler()的调用频率直接影响界面流畅度,示例中通过usleep(5000)(5ms 休眠)控制调用频率,也可通过定时器中断或操作系统任务实现更精准的调度。
四、LVGL 源码裁剪(基于 lv_conf.h)
LVGL 具备极强的资源适配性,其极限资源占用为:
- RAM:4kB + 150byte/widget(最低)~ 48kB;
- Flash:100kB。
实际开发中无需追求极限配置,LVGL 源码默认提供适中的配置方案,可根据硬件资源情况(充足 / 不足)在lv_conf.h文件中进行裁剪:
- 裁剪方式:将
lv_conf.h中无需使用的功能对应的宏定义改为 0,例如关闭 WIDGETS(控件)、THEMES(主题)的部分功能; - 注意事项:部分宏定义修改后可能导致编译报错,需仅针对确认不用的功能进行修改,避免影响核心逻辑编译。
验证建议:可先尝试关闭少量非核心的 WIDGETS 或 THEMES 功能宏定义,编译验证无报错后,再逐步裁剪更多非必要功能,确保裁剪过程可控。
五、总结
- LVGL 启动流程核心是
lv_task_handler()驱动的定时器任务系统,需注意定时器非抢占式的特性; - WinMain 函数框架分为初始化、Demo 运行、主循环三部分,学习阶段需注释 Demo 运行代码;
- LVGL 裁剪通过修改
lv_conf.h中的宏定义实现,需注意避免因修改导致编译报错。
六、结尾
本次拆解了 LVGL 的核心启动逻辑与源码裁剪方法,掌握这些内容能让你根据硬件资源灵活适配 LVGL,为后续嵌入式 GUI 开发打下基础。我是 Hello_Embed,期待你的关注,后续将持续分享 LVGL 控件开发、界面设计的实战技巧!
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐

所有评论(0)