ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LVGL官方文档-7.11.0-19-Overview-Tasks

2021-07-30 14:59:53  阅读:490  来源: 互联网

标签:Task 7.11 19 handler task lv Tasks my data


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。

标签:Task,7.11,19,handler,task,lv,Tasks,my,data
来源: https://blog.csdn.net/wtianok/article/details/119247588

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有