LVGL内置了Task系统。可以通过注册一个函数来周期性执行它。Task是在lv_task_handler()中处理并调用的,而lv_task_handler()需要每隔几毫秒就周期性调用一次。前往Porting了解详情。
Task是非抢占式的,这表示一个Task不能打断另一个Task。因此在Task中可以*调用任何LVGL相关的函数。
Create a task
通过调用lv_task_create(task_cb, period_ms, LV_TASK_PRIO_OFF/LOWEST/LOW/MID/HIGH/HIGHEST, user_data)可创建新任务,它返回一个指向lv_task_t类型变量的指针,这个指针之后可用于修改Task的参数。也可以调用lv_task_create_basic()。这个函数可以创建没有指定任何参数的Task。
Task的回调的原型是:void (*lv_task_cb_t)(lv_task_t *)。
下面举例说明使用方法:
void my_task(lv_task_t * task)
{
/*Use the user_data*/
uint32_t * user_data = task->user_data;
printf("my_task called with user data: %d\n", *user_data);
/*Do something with LVGL*/
if(something_happened) {
something_happened = false;
lv_btn_create(lv_scr_act(), NULL);
}
}
...
static uint32_t user_data = 10;
lv_task_t * task = lv_task_create(my_task, 500, LV_TASK_PRIO_MID, &user_data);
Ready and reset
调用lv_task_ready(task)会让Task在下一次lv_task_handler()中调用。
lv_task_reset(task)重置了Task的period参数。在定义的period之后,Task会被再次调用。
Set parameters
可以在创建完Task之后,通过下面的函数修改其参数:
- lv_task_set_cb(task, new_cb)
- lv_task_set_period(task, new_period)
- lv_task_set_prio(task, new_priority)
One-shot tasks
可以通过调用lv_task_once(task)来设置Task只运行一次,在运行完之后Task会被自动删除。
Measure idle time
可以通过调用lv_task_get_idle()获取lv_task_handler()的空闲的时间百分比。注意,这并不会统计整个系统的空闲时间,只是lv_task_handler()。如果使用的是操作系统并且在Task中调用了lv_task_handler(),这可能会产生误导,因为它并不会真的统计OS在空闲线程中花费的时间。
Asynchronous calls
在某些情况下,某项操作可能不能立即执行。例如,如果Object仍然在使用就不能删除Object,或者是不想现在就阻塞执行。基于这些原因,可以使用lv_async_call(my_function, data_p)让my_function在下一次的lv_task_handler中执行。当my_function执行的时候,data_p会作为参数传递给它。注意,这里只保存了指针,所以需要确保函数执行的时候变量仍然是活跃的。应该设置变量为static,global或者是动态分配的。
void my_screen_clean_up(void * scr)
{
/*Free some resources related to `scr`*/
/*Finally delete the screen*/
lv_obj_del(scr);
}
...
/*Do somethings with the object on the current screen*/
/*Delete screen on next call of `lv_task_handler`. So not now.*/
lv_async_call(my_screen_clean_up, lv_scr_act());
/*The screen is still valid so you can do other things with it*/
如果在my_screen_clean_up()中只是想删除一个Object而不需要其他操作,也可以通过调用lv_obj_del_async()来实现,这会在下一次的lv_task_handler()中删除Object。