Tasks任务系统介绍

  littleVGL 自带了一个任务管理系统,此任务系统除了给 littleVGL 内部使用外,还开放出来给我们用户使用,这给我们的应用程序设计带来了极大的便利,它支持6个任务优先级,高优先级的任务可以抢占低优先级的任务,注意,此任务管理系统是非实时的,因为任务的时效性是取决于 lv_task_handler()函数的调用,而 lv_task_handler()函数一般放在 main 函数主循环中进行调用,所以你也要确保 main 函数主循环中不能有其他过大的延时存在,满足上述要求之后,对于一般的应用来说,此任务系统的时效性误差可以忽略不计.对于我们用户而言,littleVGL 的任务管理系统主要是由 3 个数据类型和 13 个 API 接口组成的,下面我们来详细介绍。

1.主要数据类型

1.1 任务回调函数数据类型
申明去定义一种函数指针数据类型,此数据类型就是用来约束任务回调函数的申明,保证我们写的任务回调函数只能有一个 struct _lv_task_t *形参和返回值必须是 void 的。

typedef void (*lv_task_cb_t)(struct _lv_task_t *);

1.2 任务优先级数据类型

enum {LV_TASK_PRIO_OFF = 0,
LV_TASK_PRIO_LOWEST,
LV_TASK_PRIO_LOW,
LV_TASK_PRIO_MID,
LV_TASK_PRIO_HIGH,
LV_TASK_PRIO_HIGHEST,
_LV_TASK_PRIO_NUM,
};
typedef uint8_t lv_task_prio_t;

  任务优先级数据类型的本质就是一个 enum 枚举体,这很简单,总共具有LV_TASK_PRIO_OFF 到 LV_TASK_PRIO_HIGHEST 之间的 6 个优先级,这里需要注意,_LV_TASK_PRIO_NUM(值为 6)对于我们来说没有实际意义,它是归 littleVGL 任务管理内部使用的,用来记录总共有 6 个优先级,然后还可以用作优先级形参的合法性判断。

1.3 任务管理句柄数据类型

typedef struct _lv_task_t
{uint32_t period; //任务的回调周期
uint32_t last_run; //最近一次的运行时间点
lv_task_cb_t task_cb; //任务回调函数
void * user_data; //用户自定义数据
uint8_t prio : 3; //任务的优先级,占 3 位
uint8_t once : 1; //记录此任务是否只运行一次
} lv_task_t;

2.API接口

2.1 核心初始化

void lv_task_core_init(void);

  想要使用 littleVGL 的任务管理系统,就必须得调用lv_task_core_init 进行初始化一下,但是好处在于不需要我们自己去手动调用了,littleVGL 内部已经帮我们完成了初始化调用,如下图所示:
  在 lv_init 函数中可以看到 lv_task_core_init 函数的调用,而我们又在 main 函数中调用了lv_init 函数,所以我们完全可以不用去理会 lv_task_core_init 这个 API 接口。

2.2 事务处理器

LV_ATTRIBUTE_TASK_HANDLER void lv_task_handler(void);

  LV_ATTRIBUTE_TASK_HANDLER 是在 lv_conf.h 配置文件中定义的一个宏,默认情况下是为空的,不用理会,lv_task_handler 这个 API 接口是非常重要的,littleVGL 内部的所有事务都是通过这个接口来处理的,所以我称它为事务处理器,它需要不断的被周期性调用,我们通常把它放到 main 函数的主循环中去。

2.3 创建最基本的任务

lv_task_t * lv_task_create_basic(void);

  这个函数是用来创建最基本的任务对象,创建完成之后,还需要通过其他的 API 接口来设置其属性,这个 API 接口归 littleVGL 内部使用。

2.4 创建任务

lv_task_t * lv_task_create(lv_task_cb_t task_xcb, uint32_t period, lv_task_prio_t prio, void *user_data);

  我们创建任务一般都是通过这个API接口来进行的,可以一步到位,其实 lv_task_create 的实现原理是先通过调用 lv_task_create_basic 来创建最基本的任务,然后再通过其他的 API 接口来对其进行属性设置。

2.5 删除任务

void lv_task_del(lv_task_t * task);

2.6 设置任务回调函数

void lv_task_set_cb(lv_task_t * task, lv_task_cb_t task_cb);

2.7 设置任务优先级

void lv_task_set_prio(lv_task_t * task, lv_task_prio_t prio);

2.8 设置任务回调周期

void lv_task_set_period(lv_task_t * task, uint32_t period);

2.9 使任务立即准备就绪

void lv_task_ready(lv_task_t * task);

  通过调用此 API 接口,我们可以使刚创建出来的任务立即处于就绪状态,然后在下一个lv_task_handler 调用时,使任务回调函数立即得到运行,而不用去等它的第一个运行周期,注意了这里说的是第一个周期不用等了,但是后面的周期还是要等的。

2.10 使任务回调函数只运行一次

void lv_task_once(lv_task_t * task);

  通过调用此 API 接口,我们可以让任务的回调函数只运行一次,而非周期性调用,在一次调用完成之后,littleVGL 内部会通过 lv_task_del 接口来自动删除此任务的。

2.11 复位任务

void lv_task_reset(lv_task_t * task);

2.12 是否使能任务管理系统

void lv_task_enable(bool en);

  按理来说,任务管理系统是必须得使能的,否则 littleVGL 的内部事务将会失效,比如界面就不会刷新了,控件的点击事件也会失效,所以千万不要使用这个 API 接口,除非你有特殊的需求。

2.13 获取任务的空闲百分比

uint8_t lv_task_get_idle(void);

  注意这个空闲百分比仅仅只能代表 littleVGL 任务管理系统的一个空闲情况,并不能代表我们整个应用的空闲情况。

littleVGL学习笔记4——Tasks任务系统相关推荐

  1. LittleVGL 学习笔记1-标签,风格,字体

    LittleVGL 学习笔记(一) 设置父类 建立显示屏scr为父类,显示屏一般父类为显示屏 lv_obj_t* scr = lv_scr_act(); 建立标签子类 声明标签子类 举例:lv_obj ...

  2. littleVGL学习笔记8——lv_cont 容器

    1. 介绍   所谓的容器就是一个载体,用来装东西的,在 littleVGL 中,可以用来存放各种各样的子对象,当子对象的数量越来越多时,子对象们在父容器中的排列方式就显得尤为重要,因此lv_cont ...

  3. littleVGL学习笔记5——lv_obj 基础对象

    1.介绍   littleVGL 是以对象为概念的,而其最核心的基础对象是 lv_obj 控件,其他的所有专用控件(比如按钮,标签,列表等)都是在此 lv_obj 对象的基础上衍生出来的,所有的控件对 ...

  4. littleVGL学习笔记14——lv_slider 滑块

    1. 介绍   lv_slider 滑块是由 lv_bar 进度条对象外加一个类似于旋钮的东西构成的,这个旋钮可以被拖拽来设置 lv_slider 滑块的值,和 lv_bar 进度条一样,lv_sli ...

  5. locust工具学习笔记(三)-Tasks属性、tag修饰符、TaskSet类

    locust工具学习笔记(三) 虚拟用户数分配和权重的关系 1.一个场景文件中如果定义多个用户类,用来对不同用户行为进行压测时,可以用weight属性来控制用户行为执行权重 2.当用户权重不足1人时, ...

  6. 学习笔记 - 5步理解Gradle. How build execution is controlled by gradle tasks?

    https://docs.gradle.org/current/userguide/tutorial_using_tasks.html#sec:projects_and_tasks https://d ...

  7. C# async await 学习笔记2

    C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html) 提到了ThreadId是一样的,突然想到在WinForm中,非UI线程 ...

  8. 一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述

    <繁凡的深度学习笔记>第 15 章 元学习详解 (上)万字中文综述(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net ...

  9. 影像组学视频学习笔记(34)-使用3D Slicer软件提取影像组学特征、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/afcd06221ea4 来源:简书,已获授权转载 RadiomicsWorld.com "影像组学世界" ...

最新文章

  1. 创建ACFS集群文件系统(命令方式)
  2. Java黑皮书课后题第3章:*3.30(当前时间)修改编程练习题2.8,以12小时时钟制显示小时数
  3. 【php7扩展开发二】全局变量
  4. Enterprise Blocks
  5. 【精】C语言之变量存储类型
  6. 数据库管理软件SQLPro for SQLite for Mac 2022.30
  7. 面向对象学习(1):认识软件系统的复杂性
  8. GEE学习总结(2)——点矢量绘制与坐标系问题
  9. paip.hibernate list 返回位null的解决
  10. PreferenceScreen 的使用
  11. 3ds Max 2014插件安装(插件无效的原因~)
  12. Dzzoffice 部署
  13. oracle的闪存_ORACLEFS1-2闪存存储系统.PDF
  14. IOS安全测试学习-DVIA-v2
  15. 服务器个别目录下不能新建文件夹,域服务器不能创建sysvol和netlogon共享文件夹...
  16. 英语四六级听力真题模拟题
  17. MATLAB画图中图形对象、文字标注、希腊字母显示等
  18. 社区使用人脸识别闸机有什么好处?
  19. Android 序列化 ---- Parcelable原理分析
  20. hijackthis日志祥解

热门文章

  1. 4.30王者荣耀服务器未响应是什么意思,王者荣耀:3.30体验服更新,下水道射手加强,瑶没登录就被削...
  2. android 获取程序,Android开发之获取所有软件信息
  3. idea中tomcat配置详解
  4. 瓜分20亿拿喵币攻略(30个喵铺)
  5. SPDK Vhost在线恢复:让I/O飞一会儿
  6. C语言求随机两个向量乘积,求一个“求向量内积”的C语言程序!
  7. 第六届蓝桥杯国赛 穿越雷区
  8. 金山-西山居2011实习生招聘笔试题目
  9. 三星s10支持html,三星s10支持5g吗
  10. 2021年塔式起重机司机考试题及塔式起重机司机找解析