一、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)
{
看时钟判断: 对比上次喂饭的时间, 到了该喂饭的时间了
喂一口饭();
记下这次喂饭的时间
看时钟判断: 对比上次回信息的时间, 到了该回信息的时间了
回一个信息();
记下这次回信息的时间
}
}这样这位妈妈会根据时间办事:先看⼀下时钟,如果现在的时间和上⼀次操作的时间⽐较,到了该进⾏处理的时间就进⾏处理,然后记录这次处理的时间,下次再进⾏对⽐。


