韦德斯 2024-10-16 18:27 采纳率: 42.9%
浏览 78
已结题

lvgl v8.2定时器提前到来

我使用arm linux开发板使用lvgl v8.2写了一个定时器,要定时两小时等到两小时再执行回调函数,为什么两小时还没到回调函数就先执行了,而且提前执行的时间也不是有规律性的,请问这可能是什么原因,怎么解决?
编写的代码如下

lv_timer_t *timer = lv_timer_create(timer_cb,2*60*60*1000,NULL);
lv_timer_set_repeat_count(timer,-1);

static void timer_cb(lv_timer_t *t)
{
    
    printf("stanby mode!\n");
    
}

  • 写回答

25条回答 默认 最新

  • 阿齐Archie 优质创作者: 嵌入式与硬件开发技术领域 2024-10-16 18:28
    关注

    以下参考免费微信小程序:皆我百晓生 作答,并由阿齐Archie整理回复,若还有疑问可评论或留言。

    在使用 LVGL 的定时器时,如果回调函数提前执行,可能的原因有以下几点:

    1. 系统的时钟精度:如果你的系统时钟精度不够,或者时钟在运行过程中有延迟,可能会导致定时器提前触发。

    2. 定时器调度问题:LVGL 的定时器是依赖于系统的时钟中断来调度的。如果系统的时钟中断处理有延迟,也可能导致定时器回调提前执行。

    3. 任务调度问题:如果你的系统中有多个任务在运行,并且这些任务的调度优先级高于定时器任务,可能会导致定时器任务被延迟执行。

    4. 定时器创建时的初始时间:在创建定时器时,如果系统的时间已经接近下一个触发点,定时器可能会在创建后不久就触发。

    5. 系统负载:如果系统负载很高,CPU 忙于处理其他任务,可能会导致定时器回调函数的执行延迟,但是由于回调函数执行时间的不确定性,可能会在某个时刻突然执行。

    为了解决这个问题,你可以尝试以下方法:

    • 检查系统时钟:确保你的系统时钟是准确的,并且有适当的时钟源。

    • 优化系统中断处理:检查系统的时钟中断处理代码,确保没有延迟。

    • 调整任务优先级:如果你的系统中有多个任务,确保定时器任务的优先级足够高。

    • 避免在高负载时创建定时器:如果可能,尝试在系统负载较低时创建定时器。

    • 使用系统定时器:如果 LVGL 的定时器不满足需求,可以考虑使用系统的定时器,例如 Linux 的 timerfd 或者 setitimer

    • 增加调试信息:在回调函数中添加更多的调试信息,比如打印出当前的系统时间,这样可以帮助你确定回调函数是否提前执行。

    • 检查定时器设置:确保 lv_timer_create 函数的参数设置正确,特别是时间间隔参数。

    • 检查回调函数执行时间:确保回调函数执行时间非常短,不会影响下一次定时器的触发。

    如果你已经尝试了上述方法,但问题仍然存在,可能需要更深入地检查系统的时钟和任务调度机制,或者考虑升级到 LVGL 的最新版本,看看是否有相关的修复。

    此外,你的代码中使用了 -1 作为重复计数,这意味着定时器将无限次重复。如果你的目的是让定时器只执行一次,应该将重复计数设置为 1。如果确实需要无限次重复,那么代码是正确的,但可能需要考虑上述的其他因素。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月23日
  • 创建了问题 10月16日