LVGL的内部机制初步了解
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));
}
}
return 0;
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(不一直占用系统资源)*
可以看到,在循环中不断调用定时器处理程序,管理并调度各种任务。
LVGL的定时器处理程序是一个内置的任务系统,允许开发者注册函数,使其可以定期被调用,它帮助管理时间敏感的操作(毫秒级别)和周期性的活动。
LVGL中的定时器是非抢占式的。也就是说一旦一个定时器任务开始执行,他会运行直到函数退出,期间不会被其他定时器任务中断。所以我们要确保注册的定时器任务不会运行太长时间,否则会影响整个系统的相应性能
LVGL的定时器任务调度机制
一、定时器触发方式
- 基于事件驱动:
其内部维护一个定时器列表,在==lv_task_handler()==中通过计算时间差来检测定时器是否到期。每次主循环迭代时,会检查所有定时器,执行已到期的回调函数,属于非阻塞的延迟执行机制
二、任务执行模式
- LVGL采协作式但线程调度,任务(定时器回调、动画、事件处理)按以下规则运行:
- 顺序执行:每个到期定时器的回调函数会一次性完整执行,完成后才会处理下一个任务
- 优先级控制:定时器可设置优先级,但仅影响执行顺序
因为没有时间片划分,每次任务都要执行完成才会执行下一个任务,所以任务必须快速结束,否则会影响其他任务的执行
裁剪LVGL
LVGL的裁剪在lv_conf.h文件中进行
我们可以尝试关闭lv_conf.h文件中的WIDGETS和TIEMES部分功能来验证