LVGL 任务

任务(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 *);原型。

范例:

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);



准备并重置

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时会将其传递给函数。 请注意,仅保存了数据的指针,因此您需要确保在调用函数时变量将为“有效”。您可以使用静态,全局或动态分配的数据。

例如:

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_cleanup中的任何内容,则可以使用lv_obj_del_async,它将在下一次调用lv_task_handler时删除该对象。

赞(0)
未经允许不得转载:极客笔记 » LVGL 任务
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址