立即注册 找回密码

微雪课堂

搜索
微雪课堂 图形用户界面(GUI) 查看内容

STM32之littlevGL系列教程:任务系统

2020-3-29 13:26| 发布者: imliubo| 查看: 4140| 评论: 0|原作者: IAMLIUBO

摘要: Hi,大家好,欢迎来到STM32之littlevGL课堂,本节课带大家了解一下littleVGL的内置任务系统!一 什么是任务系统LittlevGL具有内置的任务系统。您可以注册一个函数以使其定期被调用。任务是在lv_task_handler()中处理 ...
Hi,大家好,欢迎来到STM32之littlevGL课堂,本节课带大家了解一下littleVGL的内置任务系统!

一 什么是任务系统
LittlevGL具有内置的任务系统。您可以注册一个函数以使其定期被调用。任务是在lv_task_handler()中处理和调用的,需要每隔几毫秒定期调用一次。
任务是非抢占式的,这意味着一个任务无法中断另一个任务,您可以在任务中调用任何与LittlevGL相关的功能。
其实就跟我们常用的定时任务差不多,我们需要定时调用这个lv_task_handler()函数,确保时间到了以后任务会被执行,其实也就是在这个handler里面是不断轮询哪些任务到期。
二 任务都有哪些API
void lv_task_core_init(void) //初始化任务系统模块
lv_task_t *lv_task_create_basic(void) //创建一个空任务,没有设置周期和回调函数的任务
lv_task_t *lv_task_create(lv_task_cb_ttask_xcb, uint32_t period, lv_task_prio_tprio, void *user_data) //创建一个任务,推荐大家使用这个API
void lv_task_del(lv_task_t *task)  //删除一个任务
void lv_task_set_prio(lv_task_t *task, lv_task_prio_tprio)  //设置优先级
void lv_task_set_period(lv_task_t *task, uint32_t period)   //设置周期
void lv_task_ready(lv_task_t *task)  //设置任务处于准备好的状态
void lv_task_once(lv_task_t *task)  //设置运行一次
void lv_task_reset(lv_task_t *task)  //重置任务
void lv_task_enable(bool en)  //使能或者关闭任务
API相对来说还是不算多的,每个函数的作用相信大家应该看函数名就能够知道什么作用了,不过这里方便大家理解,还是给大家简单注释了一下!
三 一个简单的例子
先看执行效果


代码:

static lv_obj_t *task_label;
static uint8_t count = 0;
void my_task(lv_task_t * task)
{
    char buffer[32];
    count++;
    
    sprintf(buffer, "task count: %d", count);
    lv_label_set_text(task_label, buffer);
}

void task_test(void){
    static uint32_t user_data = 10;
    
    task_label = lv_label_create(lv_scr_act(), NULL); /* 创建标签 */
    lv_obj_align(task_label, NULL, LV_ALIGN_CENTER, -40, 0);      /* 设置相对位置 */
    lv_label_set_text(task_label, " ");
    lv_task_t * task = lv_task_create(my_task, 500, LV_TASK_PRIO_MID, &user_data);
}

上面这个例子就是每隔500ms运行一次my_task这个任务,然后窗口不断打印任务执行次数,然后打印一下我们传进去的值,如果你只想运行一次,可以在创建完任务后,使用下面的函数进行设置:

lv_task_once(task);

这样就可以只运行一次了,比如你有时候需要延时执行,但是又不想使用delay这种阻塞的函数,就可以考虑使用这种方式来达到延时执行的效果。

那假如我们创建完了任务后又想修改周期时间怎么办?其实上面的列出的API列表中也都给大家给出了:
lv_task_set_period(task, 1000);
只需要一句函数我们就可以修改这个任务的执行周期了。
当然我们也可以修改任务的回调函数:
lv_task_set_cb(task, my_new_task);

OK,本节课就到这里,任务系统相对来说比较简单,它不依赖与任何控件,与控件的事件回调有一定区别,大家可以多多尝试并使用!

128

顶一下

刚表态过的朋友 (128 人)

相关阅读

最新评论

微雪官网|产品资料|手机版|小黑屋|微雪课堂. ( 粤ICP备05067009号 )

GMT+8, 2024-12-9 08:27 , Processed in 0.016829 second(s), 17 queries .

返回顶部