Lvgl 任务调度
Tick
Lvgl跟系统类似,外部只需调用其心跳计数函数,其内部控制相关任务的运行与控制。
lv_tick_inc(x) 控制Lvgl内部tick计数增加x
lv_task_handler 循环执行注册的任务
数据结构
基础数据结构是双向链表lv_ll_t,根据优先级高低将所有任务挂在链表上,通过运行周期以及上次的运行时间点判断是否达到运行时间,达到则执行任务回调函数。
//任务结构体
typedef struct _lv_task_t {
uint32_t period; /**< How often the task should run */
uint32_t last_run; /**< Last time the task ran */
lv_task_cb_t task_cb; /**< Task function */
void * user_data; /**< Custom user data */
int32_t repeat_count; /**< 1: Task times; -1 : infinity; 0 : stop ; n>0: residual times */
uint8_t prio : 3; /**< Task priority */
} lv_task_t;
//链表结构体
typedef struct {
uint32_t n_size;
lv_ll_node_t * head;
lv_ll_node_t * tail;
} lv_ll_t;
基础任务
刷新显示任务 _lv_disp_refr_task
输入读取任务 _lv_indev_read_task
动画任务 anim_task
- _lv_disp_refr_task
刷新分为全局刷新以及布局刷新,主要看显示驱动注册时,采用的是否是完整的双缓冲buf,lvgl的刷新显示都是在这个任务进行的,根据各个控件的显示区域进行去重、联合等处理,获取最终需要刷新的区域,最后再通过design_cb获取控件再对应区域需要显示的数据
lv_disp_buf_init(&disp_buf, disp_buf1, disp_buf2, LV_HOR_RES* LV_VER_RES);
- lv_indev_read_task
根据注册的输入设备类型以及读取返回的数据,进行事件的判断,并执行相应控件的回调函数