一、LVGL源码的目录结构

demos:存放的是LVGL⼀些综合的内置⽰例,部分⽰例可以在https://lvgl.io/demos 体验。
docs:存放LVGL的开发⽂档,阅读时⼀般不在这⾥直接阅读,⽽是在LVGL的⽂档站点阅读。

env_support:⼀些环境或者平台的⽀持,⽐如我们所使⽤的RT-Thread就在其中。
examples:存放LVGL的内置⽰例 。

src:存放LVGL实际的源码,我们使⽤LVGL进⾏开发时,都是使⽤这⾥⾯的代码⽂件。

二、启动流程初探

int main(int argc, char *argv[])
{
    /*Initialize LVGL (初始化LVGL库) */
    lv_init();
    /*Initialize the HAL for LVGL (初始化LVGL的硬件抽象层(显示、 触摸) ) */
    lv_display_t * display = lv_windows_create_display(title, 800, 480, 100, FALSE, FALSE);
    lv_windows_acquire_pointer_indev(display);
    /*Output prompt information to the console, you can also use printf() to print directly
    (将提示信息输出到控制台, 也可以使用printf函数直接打印) */
    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处理(定时器) 程序。
        * 它也可以在定时器中断或操作系统任务中完成。 */
        lv_task_handler();
        usleep(5000); /*Just to let the system breath(不一直占用系统资源) */
    }
    return 0;
}

LVGL的定时器处理程序是其内部的⼀个重要组件,负责管理并调度各种任务,以确保界⾯的流畅运⾏和响应性能,可以说LVGL是由定时器处理程序驱动起来的。定时器处理程序是⼀个内置的任务系统,允许开发者注册函数,使其可以定期被调⽤,它帮助管理时间敏感的操作(毫秒级别)和周期性的活动。要注意⼀点,LVGL中的定时器是⾮抢占式的。也就是说⼀旦⼀个定时器任务开始执⾏,它会运⾏直到函数退出,期间不会被其他定时器任务中断。所以我们要确保注册的定时器任务不会运⾏太⻓时间,否则会影响整个系统的响应性。

三、LVGL任务管理器的通俗理解

假设⼀位职场妈妈需要同时解决2个问题:给⼩孩喂饭、回复⼯作信息,场景如图所⽰:

这个妈妈的状态就像是⼀个典型的c语⾔轮询程序:

void main()
{
    while (1)
    {
        喂一口饭();
        回一个信息();
    }
}

在main函数中是⼀个while循环,⾥⾯依次调⽤2个函数,这两个函数相互之间有影响:如果 喂⼀⼝饭 太花时间,就会导致迟迟⽆法回⼀个信息 ;如果 回⼀个信息 太花时间,就会导致迟迟⽆法 喂下⼀⼝饭。

使⽤轮询模式编写程序看起来很简单,但是要求while循环⾥调⽤到的函数要执⾏得⾮常快,否则会影响到其他函数的执⾏。

LVGL的任务管理器本质上和上述的情况差不多,只不过LVGL的任务管理器是时间观念⾮常强,也就是说假如这位妈妈的时间观念⾮常强,她会这样处理:

void main()
{
    制定两个时间规划: 每隔1分钟喂一口饭; 每隔1分钟回复一次信息
    while (1)
    {
        看时钟判断: 对比上次喂饭的时间, 到了该喂饭的时间了
        喂一口饭();
        记下这次喂饭的时间
        看时钟判断: 对比上次回信息的时间, 到了该回信息的时间了
        回一个信息();
        记下这次回信息的时间
    }
}

这样这位妈妈会根据时间办事:先看⼀下时钟,如果现在的时间和上⼀次操作的时间⽐较,到了该进⾏处理的时间就进⾏处理,然后记录这次处理的时间,下次再进⾏对⽐。