任务(Task)¶
LVGL具有内置的任务系统。您可以注册一个函数以使其定期被调用。在lv_task_handler()中处理和调用任务,该任务需要每几毫秒定期调用一次。有关更多信息,请参见移植。
任务是非抢占式的,这意味着一个任务无法中断另一个任务。因此,您可以在任务中调用任何与LVGL相关的功能。
创建一个任务¶
要创建新任务,请使用 lv_task_create(task_cb, period_ms, LV_TASK_PRIO_OFF/LOWEST/LOW/MID/HIGH/HIGHEST, user_data)
。它将创建一个lv_task_t *变量,以后可用于修改任务的参数。 lv_task_create_basic()也可以使用。它允许您创建新任务而无需指定任何参数。
任务回调应具有void(* lv_task_cb_t)(lv_task_t *);原型。
范例:
1 void my_task(lv_task_t * task)
2 {
3 /*Use the user_data*/
4 uint32_t * user_data = task->user_data;
5 printf("my_task called with user data: %d\n", *user_data);
6
7 /*Do something with LVGL*/
8 if(something_happened) {
9 something_happened = false;
10 lv_btn_create(lv_scr_act(), NULL);
11 }
12 }
13
14 ...
15
16 static uint32_t user_data = 10;
17 lv_task_t * task = lv_task_create(my_task, 500, LV_TASK_PRIO_MID, &user_data);
准备并重置¶
lv_task_ready(task)使任务在lv_task_handler()的下一次调用上运行。
lv_task_reset(task)重置任务的周期。在定义的毫秒周期过去后,它将再次调用。
设定参数¶
您可以稍后修改任务的一些参数:
lv_task_set_cb(task, new_cb)
lv_task_set_period(task, new_period)
lv_task_set_prio(task, new_priority)
一次行的任务¶
通过调用lv_task_once(task),可以使任务仅运行一次。首次调用该任务后,该任务将自动删除。
测量空闲时间¶
您可以使用lv_task_get_idle()获得空闲百分比时间lv_task_handler。请注意,它不会衡量整个系统的空闲时间,只会衡量lv_task_handler。如果您使用操作系统并在任务中调用lv_task_handler,可能会产生误导,因为它实际上无法衡量OS在空闲线程中花费的时间。
异步调用¶
在某些情况下,无法立即执行某些操作。例如,您不能立即删除对象,因为其他对象仍在使用它,或者您不想立即阻止执行。 对于这些情况,可以使用lv_async_call(my_function,data_p)在下一次调用lv_task_handler时调用my_function。调用data_p时会将其传递给函数。 请注意,仅保存了数据的指针,因此您需要确保在调用函数时变量将为“有效”。您可以使用静态,全局或动态分配的数据。
例如:
1 void my_screen_clean_up(void * scr)
2 {
3 /*Free some resources related to `scr`*/
4
5 /*Finally delete the screen*/
6 lv_obj_del(scr);
7 }
8
9 ...
10
11 /*Do somethings with the object on the current screen*/
12
13 /*Delete screen on next call of `lv_task_handler`. So not now.*/
14 lv_async_call(my_screen_clean_up, lv_scr_act());
15
16 /*The screen is still valid so you can do other things with it*/
如果只想删除一个对象,而无需清除my_screen_cleanup中的任何内容,则可以使用lv_obj_del_async,它将在下一次调用lv_task_handler时删除该对象。
相关API¶
TODO