任务(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