目录

一、前言

我是 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;
}

从代码框架可清晰梳理启动流程:

  1. 初始化阶段lv_init()完成 LVGL 核心库初始化,lv_windows_create_display()初始化显示硬件抽象层(HAL),完成显示设备与输入设备的绑定;
  2. Demo 运行阶段:通过lv_demo_widgets()lv_demos_create()运行示例程序(学习阶段需注释该部分);
  3. 主循环阶段:进入无限循环,周期性调用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文件中进行裁剪:

  1. 裁剪方式:将lv_conf.h中无需使用的功能对应的宏定义改为 0,例如关闭 WIDGETS(控件)、THEMES(主题)的部分功能;
  2. 注意事项:部分宏定义修改后可能导致编译报错,需仅针对确认不用的功能进行修改,避免影响核心逻辑编译。

验证建议:可先尝试关闭少量非核心的 WIDGETS 或 THEMES 功能宏定义,编译验证无报错后,再逐步裁剪更多非必要功能,确保裁剪过程可控。

五、总结

  1. LVGL 启动流程核心是lv_task_handler()驱动的定时器任务系统,需注意定时器非抢占式的特性;
  2. WinMain 函数框架分为初始化、Demo 运行、主循环三部分,学习阶段需注释 Demo 运行代码;
  3. LVGL 裁剪通过修改lv_conf.h中的宏定义实现,需注意避免因修改导致编译报错。

六、结尾

本次拆解了 LVGL 的核心启动逻辑与源码裁剪方法,掌握这些内容能让你根据硬件资源灵活适配 LVGL,为后续嵌入式 GUI 开发打下基础。我是 Hello_Embed,期待你的关注,后续将持续分享 LVGL 控件开发、界面设计的实战技巧!

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐