lvgl运行机制分析
-
lv_timer_handler()
是 LVGL 的“心脏”:这个函数会依次做以下事情:-
处理定时器(如动画、延迟回调)。
-
读取输入设备(如触摸屏、按键的状态)。
-
刷新脏区域(仅重绘屏幕上发生变化的区域)。
-
执行用户注册的回调函数(如按钮点击事件)。
-
-
开发者需要手动调用它:通常在一个
while(1)
循环或 FreeRTOS 任务中定期调用,例如每 5~50ms 调用一次。例如:c
复制
while (1) {lv_timer_handler(); // 驱动 LVGL 的核心逻辑vTaskDelay(5); // FreeRTOS 中延时 5ms }
-
如果没有调用
lv_timer_handler()
:LVGL 的定时器不会触发,输入设备状态不会被读取,UI 也不会更新,导致“死机”。
2. 为什么 LVGL 不依赖硬件中断?
-
跨平台兼容性:LVGL 需要支持从低端单片机到 Linux 的各种平台,硬件中断机制差异较大,轮询更通用。
-
可控性:轮询允许开发者自由控制 LVGL 的调用频率,避免中断抢占导致实时系统的不确定性(尤其是在 FreeRTOS 中)。
-
资源效率:中断处理需要上下文切换,频繁的中断可能占用过多 CPU 资源,而轮询可以通过调整调用间隔平衡性能与功耗。
3. LVGL 如何与 FreeRTOS 协同工作?
-
典型场景:在 FreeRTOS 中创建一个专用任务(如
lvgl_task
),负责定期调用lv_timer_handler()
。例如:c
复制
void lvgl_task(void *pvParameters) {while (1) {lv_timer_handler(); // 驱动 LVGLvTaskDelay(pdMS_TO_TICKS(5)); // 5ms 周期} }
-
输入设备的读取:触摸屏或按键的状态通常也需要通过轮询或中断获取,但 LVGL 不强制要求使用中断。例如:
-
轮询方式:在
lv_timer_handler()
中调用lv_indev_read()
。 -
中断方式:在触摸屏中断中标记事件,然后在
lv_timer_handler()
中处理。
-
因为需要用到systicks作为lvgl时基函数的基本盘,所以你freertos配置systicks时最好为1ms也就是时间片长短哪里的配置综合结果要为每1ms systicks触发一次
4. LVGL 的优化:减少轮询开销
-
脏区域机制(Dirty Area):LVGL 只会重绘屏幕上发生变化的区域,而不是全屏刷新,大幅降低 CPU 负载。
-
事件驱动回调:用户可以为 UI 元素(如按钮)注册回调函数,仅在事件发生时触发逻辑,避免不必要的轮询计算。
-
定时器精度控制:通过调整
lv_timer_handler()
的调用频率,平衡响应速度和 CPU 占用率。
5. 对比 FreeRTOS 的任务调度
-
FreeRTOS 的任务:基于优先级抢占,依赖调度器(如 PendSV 中断)切换任务。
-
LVGL 的轮询:依赖开发者主动调用
lv_timer_handler()
,本质上是一个“协作式”任务。 -
关键区别:LVGL 不直接依赖硬件中断,而是通过任务调度间接实现“伪实时性”。
6. 你的推测是否正确?
-
正确部分:
-
LVGL 确实依赖轮询(
lv_timer_handler()
),而非硬件中断。 -
不调用
lv_timer_handler()
会导致 LVGL 无法工作。
-
-
需要补充的细节:
-
LVGL 的轮询是协作式的,需要开发者将
lv_timer_handler()
嵌入到主循环或任务中。 -
FreeRTOS 的任务调度和 LVGL 的轮询是互补的,前者管理多任务,后者管理 UI 逻辑。
-
7. 实际项目中的建议
-
调用频率:根据 UI 复杂度调整
lv_timer_handler()
的调用间隔(通常 5~50ms)。 -
任务优先级:在 FreeRTOS 中,为 LVGL 任务分配中低优先级,避免阻塞关键任务。
-
输入设备优化:如果使用触摸屏,可以在硬件中断中标记触摸事件,然后在
lv_timer_handler()
中批量处理,减少响应延迟。
1. LVGL 的定时器机制
-
LVGL 内部有一个定时器系统,
lv_timer_handler()
是这个系统的核心函数。它负责处理所有与时间相关的任务,比如动画、屏幕刷新、输入设备的状态检测等。 -
lv_timer_handler()
函数必须定期调用,否则 LVGL 的定时器系统将无法正常工作,导致动画停止、输入设备无响应等问题。这是因为 LVGL 的定时器系统是基于轮询的,而不是基于中断的。 -
在 FreeRTOS 中,你可以在一个任务中定期调用
lv_timer_handler()
,比如每隔几毫秒调用一次。这个任务可以是一个低优先级的任务,确保它不会影响其他高优先级任务的执行。
2. LVGL 的输入设备处理
-
LVGL 通过
lv_indev_read()
函数来读取输入设备(如触摸屏、按键等)的状态。这个函数通常会在lv_timer_handler()
中被调用。 -
“持续监测触摸屏有没有被按下”实际上是通过定期调用
lv_indev_read()
来实现的。LVGL 并不会像 FreeRTOS 的任务调度那样实时监测输入设备,而是通过轮询的方式来获取输入设备的状态。 -
当
lv_timer_handler()
被调用时,它会检查输入设备的状态,并根据这些状态更新 UI。例如,如果检测到触摸屏被按下,LVGL 会更新相应的 UI 元素(如按钮的状态)。
3. LVGL 与 FreeRTOS 的协同工作
-
FreeRTOS 的任务调度是基于优先级的,高优先级的任务会抢占低优先级的任务。LVGL 的
lv_timer_handler()
通常在一个低优先级的任务中运行,确保它不会影响其他高优先级任务的执行。 -
你提到的“类似 PendSV 的机制”在 LVGL 中并不存在。LVGL 的定时器系统和输入设备处理是基于轮询的,而不是基于中断的。PendSV 是 FreeRTOS 用于任务切换的中断,而 LVGL 的定时器系统是通过定期调用
lv_timer_handler()
来实现的。
4. LVGL 的 UI 更新机制
-
当你添加 UI 部件(如按钮、标签等)时,LVGL 会将这些部件添加到显示列表中。
lv_timer_handler()
会定期检查这些部件的状态,并根据需要更新显示。 -
如果触摸屏被按下,LVGL 会检测到这个事件,并更新相应的 UI 部件(如改变按钮的颜色、触发回调函数等)。这些更新操作通常是在
lv_timer_handler()
中完成的。
5. 总结
-
LVGL 的运行机制是基于轮询的,而不是基于中断的。它通过定期调用
lv_timer_handler()
来处理定时器、输入设备和 UI 更新。 -
FreeRTOS 的任务调度机制与 LVGL 的定时器系统可以协同工作。你可以在 FreeRTOS 的一个任务中定期调用
lv_timer_handler()
,确保 LVGL 的正常运行。 -
LVGL 并不会像 FreeRTOS 的任务调度那样实时监测输入设备,而是通过轮询的方式来获取输入设备的状态,并在
lv_timer_handler()
中处理这些状态。
相关文章:
lvgl运行机制分析
lv_timer_handler() 是 LVGL 的“心脏”:这个函数会依次做以下事情: 处理定时器(如动画、延迟回调)。 读取输入设备(如触摸屏、按键的状态)。 刷新脏区域(仅重绘屏幕上发生变化的区域…...
紧跟潮流,将 DeepSeek 集成到 VSCode
Visual Studio Code(简称 VSCode)是一款由微软开发的免费开源代码编辑器,自 2015 年发布以来,凭借其轻便、强大、且拥有丰富扩展生态的特点,迅速成为了全球开发者的首选工具。VSCode 支持多平台操作系统,包…...
Apache Tomcat RCE 稳定复现 保姆级!(CVE-2024-50379)附视频+POC
原文链接 Apache Tomcat 最新RCE 稳定复现分析 保姆级!!!附复现视频POC 前言 最近爆出 Apache Tomcat条件竞争导致的RCE,影响范围当然是巨大的,公司也及时收到了相关情报,于是老大让我复现,以…...
【文献阅读】A Survey on Model Compression for Large Language Models
大语言模型模型压缩综述 摘要 大语言模型(LLMs)已成功变革了自然语言处理任务。然而,其庞大的规模和高昂的计算需求给实际应用带来了挑战,尤其是在资源受限的环境中。模型压缩已成为应对这些挑战的关键研究领域。本文对大语言模…...
利用shardingsphere-proxy对mysql分片
本文介绍利用shardingsphere-proxy分库分表的配置过程。shardingsphere-proxy是一个中间件,启动后会模拟成一个实际的mysql服务,我们可以通过可视化工具或jdbc操作,实际执行的sql会通过shardingsphere-proxy转换,进而在具体的mysq…...
AI智能体与大语言模型:重塑SaaS系统的未来航向
在数字化转型的浪潮中,软件即服务(SaaS)系统一直是企业提升效率、优化业务流程的重要工具。随着AI智能体和大语言模型(LLMs)的迅速发展,SaaS系统正迎来前所未有的变革契机。本文将从AI智能体和大语言模型对…...
mapbox基础,使用geojson加载heatmap热力图层
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️heatmap热力图层样式二、🍀使用geojs…...
python环境打包2 pytorch和cuda的安装逻辑
基本逻辑 理一理安装pytorch的一列逻辑,以及他的依赖。(看完这小节再实践) 配置pytorch,安装步骤为:显卡驱动-->python-->cuda--->pytorch。 pytorch是依赖conda的,conda是依赖python的。 &am…...
hot100-矩阵
240.搜索二维矩阵② 编写一个高效的算法来搜索 mxn 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 思路: 输入矩阵: 从标准输入读取矩阵的行数 n 和列数 m。 按…...
扩散模型基本概念
1. 核心思想 从最原始的DDPM来讲,扩散模型是用变分估计训练的马尔可夫链,相当于VAE+流模型。与标准化流相比,扩散模型的正向过程为预先定义的加噪过程,负责将图像 x ∼ p ( x ) x\sim{p(x)} x∼...
【Python 入门基础】—— 人工智能“超级引擎”,AI界的“瑞士军刀”,
欢迎来到ZyyOvO的博客✨,一个关于探索技术的角落,记录学习的点滴📖,分享实用的技巧🛠️,偶尔还有一些奇思妙想💡 本文由ZyyOvO原创✍️,感谢支持❤️!请尊重原创…...
网络协议 HTTP、HTTPS、HTTP/1.1、HTTP/2 对比分析
1. 基本定义 HTTP(HyperText Transfer Protocol) 应用层协议,用于客户端与服务器之间的数据传输(默认端口 80)。 HTTP/1.0:早期版本,每个请求需单独建立 TCP 连接,效率低。HTTP/1.1&…...
Mysql COUNT() 函数详解
简介 COUNT()函数定义 COUNT()函数是SQL中常用的 聚合函数 ,用于统计满足特定条件的记录数。它可以灵活地应用于各种查询场景,帮助用户快速获取所需的数据统计信息。该函数不仅能够计算所有行的数量,还能针对特定列进行计数,并支…...
Redis缓存一致性难题:如何让数据库和缓存不“打架”?
标题:Redis缓存一致性难题:如何让数据库和缓存不“打架”?(附程序员脱发指南) 导言:当数据库和缓存成了“异地恋” 想象一下:你刚在美团下单了一份麻辣小龙虾,付款后刷新页面&#…...
WIn32 笔记:本专栏课件
专栏导航 上一篇:在VS2019里面,调整代码字体大小 回到目录 下一篇:计算机基础:二进制基础01,比特与字节 本节前言 在之前的讲解里面,我讲解了 Visual Studio 软件的一些个基础操作步骤。从本节开始&am…...
设置同一个局域网内远程桌面Ubuntu
1、安装xrdp: 打开终端,运行以下命令来安装xrdp: sudo apt update sudo apt install xrdp 2、启动 XRDP 并设置开机自启 sudo systemctl start xrdp sudo systemctl enable xrdp 3、验证 XRDP 运行状态 sudo systemctl status xrdp 如果显示 active (ru…...
Spring Boot 自定义 Starter 完整实战手册
Spring Boot 自定义 Starter 完整实战手册 一、核心概念与项目结构 1. 什么是 Starter? 本质:预配置模块 依赖集合 自动配置类 默认实现核心价值: 统一技术栈:团队快速复用标准组件简化配置:隐藏复杂实现细节&…...
C++ 红黑树万字详解(含模拟实现(两种版本))
目录 红黑树的概念 红黑树的性质 红黑树的删除 红黑树与AVL树的比较 红黑树的应用 红黑树的模拟实现 红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶…...
使用 Spring Boot 和 Keycloak 的 OAuth2 快速指南
1. 概述 本教程是关于使用 Spring Boot 和 Keycloak 通过 OAuth2 配置后端的。 我们将使用 Keycloak 作为 OpenID 提供程序。我们可以将其视为负责身份验证和用户数据(角色、配置文件、联系信息等)的用户服务。它是最完整的 OpenID Connect ࿰…...
4个小时开发DeepSeek+baiduNaotu一键生成思维导图
一、引言 最近发现AI生成思维导图的解决方案普遍存在两个断层:用户需手动复制模型输出的JSON数据到脑图软件,且缺乏实时可视化反馈。基于日常使用的BaiduNaotu框架(其轻量级架构与简洁的UI设计已满足基础需求),我决定…...
DeepSeek 开源狂欢周(一)FlashMLA:高效推理加速新时代
上周末,DeepSeek在X平台(Twitter)宣布将开启连续一周的开源,整个开源社区为之沸腾,全球AI爱好者纷纷为关注。没错,这是一场由DeepSeek引领的开源盛宴,推翻了传统推理加速的种种限制。这周一&…...
视频批量分段工具
参考原文:视频批量分段工具 选择视频文件 当您启动这款视频批量分段工具程序后,有两种便捷的方式来选择要处理的视频文件。其一,您可以点击程序界面中的 “文件” 菜单,在下拉选项里找到 “选择视频文件” 按钮并点击;…...
【OMCI实践】ONT上线过程的omci消息(五)
引言 在前四篇文章中,主要介绍了ONT上线过程的OMCI交互的第一、二、三个阶段omci消息,本篇介绍第四个阶段,OLT下发配置到ONT。前三个阶段,每个厂商OLT和ONT都遵循相同标准,OMCI的交换过程大同小异。但第四个阶段&…...
git从零学起
从事了多年java开发,一直在用svn进行版本控制,如今更换了公司,使用的是git进行版本控制,所以打算记录一下git学习的点滴,和大家一起分享。 百度百科: Git(读音为/gɪt/)是一个开源…...
服务器间迁移conda环境
注意:可使用迁移miniconda文件 or 迁移yaml文件两种方式,推荐前者,基本无bug! 一、迁移miniconda文件: 拷贝旧机器的miniconda文件文件到新机器: 内网拷贝:scp -r mazhf192.168.1.233:~/miniconda3 ~/ 外…...
计算机毕业设计SpringBoot+Vue.js精准扶贫管理系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
[RH342]tcpdump
[RH342]tcpdump 1. 题目2. 解题 1. 题目 服务器serverc 和 servera 之间有进程定期发送一个明文密码,找出它2. 解题 找出通信端口 抓包分析 tcpdump -X -vv port 6644红框中就是密码,所以密码是root123...
LeetCode-Hot100-001两数之和
给出个人解答,不懂的可以在评论区问 代码 使用的手写的hash函数 class Hash{ public:static const int MAXN 10007;int num;struct Data{int key;int v; int nxt;};vector<Data> data;vector<int> head;Hash(): num(0), data(3*MAXN), head(3*MAXN)…...
(2.26 “详细分析示例“ 暴力+位运算 最长优雅子数组)leetcode 2401
a&b0说明a和b的每一位都是一个0和一个1 不存在两个均为1的位次 a|0a 0与任何数|都等于它本身 (mask)的作用: 担心两数的1在用一位导致mask覆盖了? 答:出现这种情况说明mask与nums j后就直接break 由:…...
【Go】十六、protobuf构建基础服务信息、grpc服务启动的基础信息
商品服务 服务结构 创建 goods 服务,将之前 user 服务的基本结构迁移到 goods 服务上,完整目录是: mxshop_srvs user_srv … tmp … goods_srv config config.go 配置的读取表 global global.go 数据库、日志初始化、全局变量定义 handler …...
ONNX转RKNN的环境搭建
将ONNX模型转换为RKNN模型的过程记录 工具准备 rknn-toolkit:https://github.com/rockchip-linux/rknn-toolkit rknn-toolkit2:https://github.com/airockchip/rknn-toolkit2 rknn_model_zoo:https://github.com/airockchip/rknn_model_zoo ultralytics_yolov8:https://github…...
解决npm run dev报错
解决:Node.js 版本更新后与 OpenSSL 不兼容导致的npm报错“Error: error:0308010C:digital envelope routines::unsupported” 方法一:更改系统环境变量方法二:更改项目环境变量方法三:更换 Node.js 版本方法四:升级依…...
【Kubernetes】对资源进行PATCH
文章目录 1 更新资源的方式2 PATCH的三种方式2.1 JSON Patch2.2 Merge Patch2.3 Strategic Merge Patch 3 kubectl中的patch命令4 PATCH的优势和问题5 参考文档 1 更新资源的方式 K8S的核心就是各种资源以及针对资源的控制器,为了能够操作资源对象,apis…...
打破关节动力桎梏!杭州宇树科技如何用“一体化设计”重塑四足机器人性能?
核心价值:通过集成电机与行星减速器、创新双联齿轮结构,实现机器人关节动力单元体积缩小50%,力矩控制精度提升30%。(申请人:杭州宇树科技有限公司,申请号:201821267397.0) 一、技术解…...
一劳永逸解决vsocde模块import引用问题
这里写目录标题 原因解决方案 原因解决方案 原因: VSCode中需要显式地声明PYTHONPATH,不然根本找不到本项目内的模块和包的路径。 解决方法,加入到setting。json里当前Project路径,以后运行就自动添加了: 打开设置 …...
在 Vue 组件中,如何确认父组件在 add 模式下传入 value 的情况及其对子组件 getProducts() 方法的触发影响?
文章目录 父组件中 <ave-form> 的使用add 模式下触发逻辑value 的传入情况是否触发 getProducts()? 验证 add 模式下 getProducts() 是否触发结论: 检查父组件传入 value 的完整情况如何明确知道父组件传入的 value最终回答 父组件 index.vue子组件…...
Unity XR-XR Interaction Toolkit开发使用方法(十)组件介绍(XR Interaction Group)
目录 一、插件介绍 二、主要组件 XR Interaction Manager XR Controller XR Interactor XR Direct Interactor XR Ray Interactor XR Socket Interactor XR Gaze Interactor 三、XR Interaction Group 1、组件介绍 2、核心功能与特点 优先级与冲突管理 动态交互切…...
docker简介-学习与参考
docker Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱…...
3dtiles平移旋转工具制作
3dtiles平移旋转缩放原理及可视化工具实现 背景 平时工作中,通过cesium平台来搭建一个演示场景是很常见的事情。一般来说,演示场景不需要多完善的功能,但是需要一批三维模型搭建,如厂房、电力设备、园区等。在实际搭建过程中&…...
【第十节】C++设计模式(结构型模式)-Flyweight( 享元)模式
目录 一、问题背景 二、模式选择 三、代码实现 四、总结讨论 一、问题背景 享元模式(Flyweight Pattern)在对象存储优化中的应用 在面向对象系统的设计与实现中,创建对象是最常见的操作之一。然而,如果一个应用程序使用了过多…...
VScode在windows10上使用clang-format
用途:自动调整代码格式,如缩进等。 clang-format官方文档:ClangFormat — Clang 21.0.0git documentation 前提:有一个.clang-format文件 下载LLVM:https://github.com/llvm/llvm-project/releases,将可…...
青少年编程与数学 02-010 C++程序设计基础 11课题、程序结构
青少年编程与数学 02-010 C程序设计基础 11课题、程序结构 一、C程序结构二、main函数1. main 函数的基本形式1.1 无参数形式1.2 带参数形式 2. 参数解释3. 示例3.1 无参数形式3.2 带参数形式 4. 编译和运行4.1 编译4.2 运行 5. main 函数的返回值6. 总结 三、预处理指令1. #in…...
Node.js与MySQL的深入探讨
Node.js与MySQL的深入探讨 引言 Node.js,一个基于Chrome V8引擎的JavaScript运行时环境,以其非阻塞、事件驱动的方式在服务器端应用中占据了一席之地。MySQL,作为一款广泛使用的开源关系型数据库管理系统,凭借其稳定性和高效性,成为了许多应用的数据库选择。本文将深入探…...
【洛谷贪心算法题】P2240部分背包问题
【解题思路】 贪心策略选择 对于部分背包问题,关键在于如何选择物品放入背包以达到最大价值。由于物品可以分割,遍历排序后的物品数组,根据物品重量和背包剩余容量的关系,决定是将整个物品放入背包还是分割物品放入背包ÿ…...
ArcGIS Pro技巧实战:高效矢量化天地图地表覆盖图
在地理信息系统(GIS)领域,地表覆盖图的矢量化是一项至关重要的任务。天地图作为中国国家级的地理信息服务平台,提供了丰富且详尽的地表覆盖数据。然而,这些数据通常以栅格格式存在,不利于进行空间分析和数据…...
AF3 pair_sequences函数解读
AlphaFold3 msa_pairing模块的pair_sequences函数的核心目标是基于 MSA(多序列比对)中的物种信息,在多条链之间建立 MSA 配对索引,从而帮助 AlphaFold3 捕捉共进化信息,提升蛋白复合物预测的准确性。函数pair_sequences 通过调用 _make_msa_df、 _create_species_dict 以…...
在VSCode 中使用通义灵码最新版详细教程
在 VSCode 中使用通义灵码:最新版详细教程与使用场景 Visual Studio Code(简称 VSCode)是一款由微软开发的轻量级、功能强大的开源代码编辑器,支持多种编程语言,深受开发者喜爱。而通义灵码(TONGYI Lingma…...
ssh和rdp踩坑
ssh和rdp(远程桌面)踩坑 使用微软账号登录windows的话,ssh的用户名是本地用户名(就是c盘用户文件夹下的用户名),rdp的用户名是微软账号用户名,但是密码都是微软账号的密码,跟登录密…...
Linux驱动学习(四)--字符设备注册
上一节讲到的字符设备注册与销毁是通过cdev_init、cdev_add、cdev_del等函数分步执行的,本小节用一种更简单的方式,来注册字符设备 register_chrdev 如果major为0,该函数将动态的分配一个主设备号并且返回对应的值如果major > 0ÿ…...
vue3 下载文件 responseType-blob 或者 a标签
在 Vue 3 中,你可以使用 axios 或 fetch 来下载文件,并将 responseType 设置为 blob 以处理二进制数据。以下是一个使用 axios 的示例: 使用 axios 下载文件 首先,确保你已经安装了 axios: npm install axios然后在你…...