当前位置: 首页 > ds >正文

【LVGL】Linux LVGL程序几十分钟后UI卡死

问题现象

Linux上开发LVGL程序时出现一个问题,ui界面在运行了数十分钟到一小时后UI界面卡死,无任何响应。

根因

custom_tick_get()函数实现有问题:

uint32_t custom_tick_get(void)
{static uint64_t start_ms = 0;if(start_ms == 0) {struct timeval tv_start;gettimeofday(&tv_start, NULL);start_ms = (tv_start.tv_sec * 1000000 + tv_start.tv_usec) / 1000;}struct timeval tv_now;gettimeofday(&tv_now, NULL);uint64_t now_ms;now_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000;uint32_t time_ms = now_ms - start_ms;return time_ms;
}

32位系统中,sizeof(tv_now.tv_sec)结果是4,tv_now.tv_sec * 1000000的运算结果会返回int,这个tv_now.tv_sec代表时间戳,即自1970.1.1起的秒数,已经达到十位数,这个计算必然会发生溢出。修改为:

now_ms = (tv_now.tv_sec * 1000000ULL + tv_now.tv_usec) / 1000;

或者

now_ms = ((uint64_t)tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000;

都可以避免计算溢出,这样会使结果返回uint64_t从而避免计算溢出。

分析

为什么故障会在数十分钟内固定复现,当使用修改前的代码时,计算得到的start_msnow_ms实际都是模2^32的结果。当start_ms实际结果的高32位和now_ms的高32位相同时,用模2^32的值计算出来的差值与正确的值相同,随着秒数增加,now_ms的高32位发生进位时,计算结果会出错。所以该问题复现的时间与start_ms有关,start_ms低32位值越大复现时间越短,最长2^32 / 1000000 = 4295秒会复现一次问题(71分钟)

http://www.xdnf.cn/news/15814.html

相关文章:

  • effective python 条款11 学会对序列做切片
  • Onload 用户指南 (UG1586)-笔记
  • 【机器学习】安装Jupyter及基本操作
  • 内存泄漏系列专题分析之二十九:高通相机CamX--Android通用GPU内存分配和释放原理
  • 虚拟商品自动化实践:闲鱼订单防漏发与模板化管理的技术解析
  • JVM常用运行时参数说明
  • 【C# in .NET】17. 探秘类成员-构造函数与析构函数:对象生命周期管理
  • [3-02-01].第01章:框架概述 - Spring生态
  • 基于Spring Boot的农村农产品销售系统设计与实现
  • 【Python】DRF核心组件详解:Mixin与Generic视图
  • ARINC818航空总线机载视频处理系统设计
  • 第二篇 html5和css3开发基础与应用
  • 28、鸿蒙Harmony Next开发:不依赖UI组件的全局气泡提示 (openPopup)和不依赖UI组件的全局菜单 (openMenu)、Toast
  • 数据结构入门:像整理收纳一样简单!
  • Jmeter系列(6)-测试计划
  • 李超线段树模板
  • Vue3 中使用 Element Plus 实现自定义按钮的 ElNotification 提示框
  • 「源力觉醒 创作者计划」_巅峰对话:文心 4.5 vs. DeepSeek / Qwen 3.0 深度解析(实战优化版)
  • Matlab打开慢、加载慢的解决办法
  • 构建直播平台大体的流程
  • 后端参数校验
  • Docker部署前后端分离项目——多项目共享环境部署
  • AI进入自动驾驶时代:OpenAI发布革命性ChatGPT Agent
  • 关于在VScode中使用git的一些步骤常用命令及其常见问题:
  • 从 C# 到 Python:6 天极速入门(第二天)
  • 【PTA数据结构 | C语言版】二叉堆的快速建堆操作
  • 数据结构:顺序表和链表
  • LeetCode1047删除字符串中的所有相邻重复项
  • Jenkins+Docker+Git实现自动化CI/CD
  • 谈进程间通信