LVGL Timer:实时嵌入式图形库中任务调度的强大工具

文摘   2024-11-10 00:02   湖南  

引言

在嵌入式系统开发中,图形界面是提升用户体验的重要组成部分。LVGL(LittlevGL)是一个轻量级、可嵌入的开源图形库,被广泛应用于各种嵌入式平台上。LVGL提供了许多功能强大的工具,其中之一就是Timer(定时器)。

Timer在嵌入式系统中起到计时和调度的作用。它可以用于定时执行任务,控制动画、刷新屏幕等操作,以及处理周期性事件。通过使用Timer,我们可以实现精确的时间控制,提高系统的稳定性和可靠性。本文将详细介绍LVGL中的Timer工具及其使用方法。

LVGL Timer的应用场景

Timer在嵌入式系统开发中有广泛的应用场景。以下是一些常见的应用示例:

1 控制动画

通过使用Timer,我们可以实现平滑的动画效果。定时器周期决定了动画的速度,回调函数用于更新动画的状态。通过不断更新状态并刷新屏幕,我们可以创建出流畅的动画效果。

2 处理周期性事件

在一些实时应用中,需要定时执行特定的任务。例如,对于数据采集系统,我们可以使用Timer定时读取传感器数据并进行处理。通过合理设置定时器周期,可以确保数据的实时性和准确性。

3 控制屏幕刷新

在图形界面应用中,屏幕刷新是一个重要的操作。通过使用Timer,我们可以定期刷新屏幕,以确保界面的实时更新和响应性。

使用方法

创建定时器

要创建一个新的定时器,可以使用lv_timer_create(timer_cb, period_ms, user_data)函数。该函数将创建一个lv_timer_t *变量,稍后可以用来修改定时器的参数。也可以使用lv_timer_create_basic()函数创建一个没有指定任何参数的新定时器。

定时器回调函数应该具有void (*lv_timer_cb_t)(lv_timer_t *)原型。

例如:

void my_timer(lv_timer_t * timer)
{
/* 使用用户数据 */
uint32_t* user_data = timer->user_data;
printf("my_timer called with user data: %d\n",*user_data);

/* 使用LVGL做一些操作 */
if(something_happened){
    something_happened =false;
    lv_btn_create(lv_scr_act(),NULL);
}
}

...

staticuint32_t user_data =10;
lv_timer_t* timer = lv_timer_create(my_timer,500,&user_data);

准备和重置定时器

使用lv_timer_ready(timer)函数可以将定时器设置为在下一次调用lv_timer_handler()时运行。

使用lv_timer_reset(timer)函数可以重新设置定时器的周期。定时器将在定义的毫秒数过去后再次被调用。

设置参数

可以在以后修改定时器的一些参数:

  • • 使用lv_timer_set_cb(timer, new_cb)函数设置定时器的回调函数。

  • • 使用lv_timer_set_period(timer, new_period)函数设置定时器的周期。

重复次数

可以使用lv_timer_set_repeat_count(timer, count)函数使定时器只重复指定次数。定时器在被调用指定次数后会自动删除。将重复次数设置为-1可以无限重复。

测量空闲时间

可以使用lv_timer_get_idle()函数获取lv_timer_handler的空闲时间百分比。请注意,它不会测量整个系统的空闲时间,只会测量lv_timer_handler的空闲时间。如果在定时器中使用操作系统并调用了lv_timer_handler,这可能会导致误导,因为它实际上不会测量操作系统在空闲线程中花费的时间。

异步调用

在某些情况下,可能无法立即执行某个操作。例如,由于其他操作仍在使用某个对象,或者不希望立即阻塞执行。对于这些情况,可以使用lv_async_call(my_function, data_p)函数,在下一次调用lv_timer_handler()时调用my_function。当调用函数时,data_p参数将被传递给函数。请注意,只保存数据的指针,因此需要确保在调用函数时变量仍然有效(即“存在”)。可以使用静态变量、全局变量或动态分配的数据。

例如:

void my_screen_clean_up(void * scr)
{
/* 释放与`scr`相关的一些资源 */

/* 最后删除屏幕 */
  lv_obj_del(scr);
}

...

/* 对当前屏幕上的对象执行一些操作 */

/* 在下一次调用`lv_timer_handler`时删除屏幕,而不是现在。*/
lv_async_call(my_screen_clean_up, lv_scr_act());

/* 屏幕仍然有效,所以可以对其进行其他操作 */

如果只想删除一个对象,并且不需要在my_screen_cleanup函数中访问任何数据,可以使用lv_obj_del_async(obj)函数。此函数将在下一次调用lv_timer_handler()时删除对象。

删除定时器

如果不再需要定时器,可以使用lv_timer_del(timer)函数将其删除。这将释放与定时器相关的所有资源。

lv_timer_del(timer);

结论

LVGL中的Timer工具为嵌入式系统开发者提供了一个简单而强大的时间控制工具。通过合理应用Timer,我们可以实现定时执行任务、控制动画、处理周期性事件等功能。Timer的使用方法简单明了,使得开发者能够更加灵活地控制系统的行为。无论是控制屏幕刷新还是实现精确的时间调度,LVGL中的Timer都是一个值得信赖的工具。

相关代码地址:https://gitee.com/airooter/esp-lvgl


DIY太阳系
专注分享嵌入式系统、电子产品diy,iot、机器人等相关知识!
 最新文章