lvgl运行机制分析

news2025/7/10 23:53:18
  • lv_timer_handler() 是 LVGL 的“心脏”:这个函数会依次做以下事情:

    1. 处理定时器(如动画、延迟回调)。

    2. 读取输入设备(如触摸屏、按键的状态)。

    3. 刷新脏区域(仅重绘屏幕上发生变化的区域)。

    4. 执行用户注册的回调函数(如按钮点击事件)。

  • 开发者需要手动调用它:通常在一个 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();      // 驱动 LVGL
            vTaskDelay(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() 中处理这些状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2308679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

8 SpringBoot进阶(上):AOP(面向切面编程技术)、AOP案例之统一操作日志

文章目录 前言1. AOP基础1.1 AOP概述: 什么是AOP?1.2 AOP快速入门1.3 Spring AOP核心中的相关术语(面试)2. AOP进阶2.1 通知类型2.1.1 @Around:环绕通知,此注解标注的通知方法在目标方法前、后都被执行(通知的代码在业务方法之前和之后都有)2.1.2 @Before:前置通知,此…

day01_Java基础

文章目录 day01_Java基础一、今日课程内容二、Java语言概述(了解)1、Java语言概述2、为什么要学习Java语言3、Java平台版本说明4、Java特点 三、Java环境搭建(操作)1、JDK和JRE的概述2、JDK的下载和安装3、IDEA的安装4、IDEA的启动…

cursor 弹出在签出前,请清理仓库工作树 窗口

问题出现的背景:是因为我有两台电脑开发,提交后,另一个电脑的代码是旧的,这个时候我想拉取最新的代码,就会出现如下弹窗,因为这个代码暂存区有记录或者工作区有代码的修改,所以有冲突&#xff0…

详解直方图均衡化

直方图均衡化(Histogram Equalization) 是图像处理中一种常用的对比度增强技术,通过调整图像的灰度分布,使得图像的直方图尽可能均匀分布,从而提高图像的对比度和细节表现。以下是直方图均衡化的原理详解: …

Kibana:Spotify Wrapped 第二部分:深入挖掘数据

作者:来自 Elastic Philipp Kahr 我们将比以往更深入地探究你的 Spotify 数据并探索你甚至不知道存在的联系。 在由 Iulia Feroli 撰写的本系列的第一部分中,我们讨论了如何获取 Spotify Wrapped 数据并在 Kibana 中对其进行可视化。在第 2 部分中&#…

C++—类与对象(中)

目录 1、类的6个默认成员函数 2、构造函数 构造函数的特性 3、初始化列表 4、析构函数 概念 5、拷贝构造函数 6、运算符重载 7、赋值运算符重载 赋值运算符重载格式 8、前置和后置重载 9、const修饰的成员 10、取地址及const取地址重载 1、类的6个默认成员函数 一…

MySQL 事务笔记

MySQL 事务笔记 目录 事务简介事务操作事务四大特性并发事务问题事务隔离级别总结 事务简介 事务(Transaction)是数据库操作的逻辑单元,由一组不可分割的SQL操作组成。主要用于保证: 多个操作的原子性(要么全部成功…

网络空间安全(7)攻防环境搭建

一、搭建前的准备 硬件资源:至少需要两台计算机,一台作为攻击机,用于执行攻击操作;另一台作为靶机,作为被攻击的目标。 软件资源: 操作系统:如Windows、Linux等,用于安装在攻击机和…

HarmonyOS学习第11天:布局秘籍RelativeLayout进阶之路

布局基础:RelativeLayout 初印象 在 HarmonyOS 的界面开发中,布局是构建用户界面的关键环节,它决定了各个组件在屏幕上的位置和排列方式。而 RelativeLayout(相对布局)则是其中一种功能强大且灵活的布局方式&#xff0…

【2025年2月28日稳定版】小米路由器4C刷机Immortalwrt 23.05.4系统搭载mentohust 0.3.1插件全记录

小米路由器4C刷机Immortalwrt系统搭载mentohust插件全记录 首先将路由器按住后面的reset,用一个针插进去然后等待5s左右,松开,即可重置路由器。 然后要用物理网线物理连接路由器Lan口和电脑,并将路由器WAN口连接至网口。确保电脑…

【SpringBoot+Vue】博客项目开发二:用户登录注册模块

后端用户模块开发 制定参数交互约束 当前,我们使用MybatisX工具快速生成的代码中,包含了一个实体类,这个类中包含我们数据表中的所有字段。 但因为有些字段,是不应该返回到前端的,比如用户密码,或者前端传…

idea + Docker + 阿里镜像服务打包部署

一、下载docker desktop软件 官网下载docker desktop,需要结合wsl使用 启动成功的画面(如果不是这个画面例如一直处理start或者是stop需要重新启动,不行就重启电脑) 打包成功的镜像在这里,如果频繁打包会导致磁盘空间被占满,需…

ubuntu 20.04 安装labelmg

1. 下载安装包 下载链接:下载链接 2. 安装启动 # 创建labelImg的环境 conda create -n labelImg# 激活labelImg环境 source activate labelImg安装依赖 pip install pyqt5-dev-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/cd requirements/pip install -…

Redis版本的EOL策略与升级路径(刷到别划走)

各位看官,刷到就点进来,大数据已经抓到你喽~😊 前言 在软件行业做服务端开发的我们,多多少少都会接触到Redis,用它来缓存数据、实现分布式锁等,相关八股文烂熟于心,但是往往会忽略具…

ExpMoveFreeHandles函数分析和备用空闲表的关系

第一部分:ExpMoveFreeHandles和备用空闲表的关系 ULONG ExpMoveFreeHandles ( IN PHANDLE_TABLE HandleTable ) { ULONG OldValue, NewValue; ULONG Index, OldIndex, NewIndex, FreeSize; PHANDLE_TABLE_ENTRY Entry, FirstEntry; EXHAND…

java项目之基于ssm的学籍管理系统(源码+文档)

项目简介 基于ssm的学籍管理系统实现了以下功能: 学生信息管理: 学生信息新增 学生信息修改 学籍异动管理: 学籍异动添加 学籍异动删除 学籍异动修改 学生学业管理: 学生学业添加 学生学业修改 学生学业删除 学院信息管理&am…

SpringBoot+Redis+Mybatis-plus黑马点评

短信登录 基于Session实现登录 流程: 发送短信验证码-->短信验证码注册登录-->校验登录状态(保存用户到ThreadLocal,方便后续使用) 不能每次请求服务都要进行登录状态校验,解决办法:拦截器 在Sp…

[STM32]从零开始的STM32 BSRR、BRR、ODR寄存器讲解

一、前言 学习STM32一阵子以后,相信大家对STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及库函数控制STM32的引脚从而点亮一个LED,之前的寄存器只是作为一个引入,并没有深层次的讲解,在教…

DeepSeek-V3关键技术之一:DeepSeekMoE

DeepSeekMoE 是一种创新的大规模语言模型架构,旨在通过高效的计算流程和优化设计,在保持高性能的同时显著降低计算成本。 1. 架构设计 DeepSeekMoE 基于 Transformer 架构,融合了以下核心技术: 专家混合系统(Mixture…

Android Activity启动流程详解

目录 Activity 启动流程详细解析 1. 应用层发起启动请求 1.1 调用 startActivity() 1.2 通过 Instrumentation 转发请求 2. 系统服务处理(AMS 阶段) 2.1 Binder IPC 通信 2.2 AMS 处理流程 2.3 跨进程回调 ApplicationThread 3. 目标进程初始化…