LittleVGL踩坑指南04:合理安排LVGL的时钟(lv

您所在的位置:网站首页 xss60帧显示屏不断重启 LittleVGL踩坑指南04:合理安排LVGL的时钟(lv

LittleVGL踩坑指南04:合理安排LVGL的时钟(lv

2024-04-10 05:55| 来源: 网络整理| 查看: 265

文章版本7.10,LVGL更新极快,不同版本配置方法可能存在差异

前言

踩坑指南03里说到LVGL有一个内部的tick,需要Arduino定期执行lv_tick_inc()告知LVGL过去了多少时间。就这都能有个大坑(尤其是用ESP32并且要用到wifi的小伙伴们),前后换了三种方式才保证了时间准确和运行稳定,这篇文章就按照前后尝试的顺序写吧。

一、最简单的方法 void loop() { /* 上边是其他语句 */ lv_tick_inc(5); delay(5); }

  这无疑是最简单的方式了,但是如此简单粗暴会导致LVGL的定时非常不准确;lv_tick_inc(5)这一语句执行的间隔是肯定大于5ms的,loop函数要是有别的事要干会更加严重。这样会导致运行时LVGL的画面卡顿,帧率完全上不去。

二、使用定时器 1、问题出现

  代码就不上了,Arduino使用定时器很方便,ESP32的定时器和其他开发板略有不同,想用百度即可。   用定时器每5ms触发一次中断执行lv_tick_inc(5),这种方法很完美啊,既精准又不影响其他函数的执行。没错,如果你没用到ESP32和Wifi库的话确实非常完美了。我一开始用了几天,那时候没上wifi,所以没有出现任何问题。后来加了WiFi库就出问题了:系统会随机重启。它可能在任何时间下突然白屏,然后反复重启,串口疯狂打印错误信息。

2、尝试解决

  上百度查了一下,当时没注意串口打印的错误代码,就直接百度ESP32反复重启问题。有一位博主有类似经历并表示是电源带不动了。为了排除问题我重新画了一块板子,直接堆上3A的DCDC电源方案。新板子跑起来以后白屏重启的频率确实少了一些,但没有彻底解决而是更加随机了,你完全猜不到它什么时候就会犯病。

3、问题解决

  这时候注意到串口打印的是错误是Cache disabled but cached memory region accessed,按描述是Cache锁定期间有函数进行了访问导致ESP32核心发生严重错误并重启,Cache在中断期间是锁定的,所以我感觉和定时器中断有些关系。删掉定时器代码后确实再也没有重启过了。个人推测是定时器中断执行lv_tick_inc()的时候,wifi库跑去访问Cache了,直接把ESP32搞懵了。因为中断执行时间极短所以这种错误会随机出现。   定时器也用不了了,接下来就上第三种方法。

三、用全局时间做减法

Arduino提供了一个神器:millis()函数,能够返回系统运行时间(ms)。 先上代码:

void loop() { long last_time = millis(); /* 中间是其他语句 */ delay(5); lv_tick_inc(int(millis() - last_time)); }

  使用millis函数,我们就可以在执行lv_tick_inc()前实时计算出过去了多少时间,再传给LVGL,尽可能保证给LVGL的时间是准确的。LVGL的理论最大帧率会受lv_tick_inc()执行间隔限制,所以尽量别让loop()执行地太慢吧。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3