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

LVGL 启动流程全解析:RT-Thread 下的界面渲染链路

LVGL 整体启动链路(你这个工程)

RT-Thread 自动初始化 + 独立 LVGL 线程模式。
从上电到界面显示,完整流程如下:

  1. 系统启动进入 RT-Thread 主流程(rtthread_startup
  2. 创建并运行main线程(main_thread_entry
  3. main_thread_entry里先执行rt_components_init()
  4. rt_components_init()执行各级INIT_*_EXPORT注册函数
  5. 命中INIT_ENV_EXPORT(lvgl_thread_init),调用lvgl_thread_init
  6. lvgl_thread_init创建并启动LVGL线程
  7. LVGL线程入口lvgl_thread_entry顺序执行:
    • lv_init()
    • lv_port_disp_init()
    • lv_port_indev_init()
    • lv_user_gui_init()
  8. lv_user_gui_init()调用lv_demo_music()创建 demo UI
  9. 线程进入循环:lv_task_handler()+rt_thread_mdelay(...)
  10. 界面持续刷新、动画运行、输入事件生效

每个关键点在干什么

  • lvgl_thread_init
    只负责“拉起线程”:rt_thread_init+rt_thread_startup

  • lv_init
    初始化 LVGL 内核(对象系统、样式、动画、timer 等基础设施)。

  • lv_port_disp_init
    把 LCD 注册给 LVGL:打开lcd设备、拿 framebuffer 信息、建 draw buffer、注册flush_cb

  • lv_port_indev_init
    把输入设备注册给 LVGL:配置read_cb,让 LVGL 能取到触摸/指针状态。

  • lv_user_gui_init
    你的 UI 入口;当前实现是跑lv_demo_music()

  • lv_task_handler
    LVGL 主调度器:处理输入、事件、动画、重绘;没有它界面就“死的”。


你当前涉及文件职责

  • packages/LVGL-v8.3.11/env_support/rt-thread/lv_rt_thread_port.c
    LVGL 与 RT-Thread 的线程/初始化胶水层(核心启动文件)

  • applications/lvgl/lv_port_disp.c
    显示驱动适配(LCD + flush)

  • applications/lvgl/lv_port_indev.c
    输入驱动适配(pointer read callback)

  • applications/lvgl/demo/lv_demo.c
    用户 GUI 入口(当前接到 music demo)

  • applications/main.c
    普通用户main()(不是直接启动 LVGL 的地方)


运行时时序(可当心智模型)

RT-Thread调度->LVGL线程唤醒->lv_task_handler->
需要重绘则调用flush_cb写fb+读取输入并分发事件->线程delay-> 下一个周期


常见调试抓手(最实用)

  • 屏不亮:先查lv_port_disp_init()rt_device_find("lcd")GET_INFO、buffer 分配是否失败。
  • 能显示但不能点:查lv_port_indev_input()是否被底层事件持续喂数据。
  • 界面卡顿:调小/调大LV_DISP_DEF_REFR_PERIOD找平衡。
  • 异常重启/HardFault:优先看PKG_LVGL_THREAD_STACK_SIZE是否太小。
  • API 调用异常:确认 LVGL API 是否在 LVGL 线程上下文调用(跨线程需同步)。
http://www.jsqmd.com/news/717163/

相关文章:

  • Flux1.1 Pro Ultra图像生成API开发实战指南
  • RimWorld模组管理终极指南:跨平台智能管理器完整教程
  • MacroClaw宏录制工具:原理、实现与自动化效率提升实战
  • Kaggle在机器学习项目中的实战价值与工业应用
  • 如何把控 AI 生成代码的质量和安全?
  • 开源向量化记忆库OpenClaw:模块化RAG系统构建与实战指南
  • Rust的#[derive(Default)]初始化策略
  • 微服务化爬虫框架hey-clawd:模块化设计、配置驱动与实战部署指南
  • 第16集:统一监控大盘!Grafana 高级面板 + AI 异常标注实战
  • Python代码质量优化:从基础到进阶的工程实践
  • 如何通过DellFanManagement实现戴尔笔记本风扇的精准控制
  • 技术概念解析与代码重构的工程实践指南
  • 如何用OpCore Simplify在30分钟内完成黑苹果OpenCore EFI自动化配置
  • php内核 Swoole/Hyperf 改造PHP内核的底层改动点
  • 一键部署Z-Image-Turbo极速创作室,打造你的专属AI画室
  • 富梦项目:基于知识图谱与语义分析的梦境灵感管理工具实践
  • Dive into LLMs:手把手教你,中文系统教程让AI学习不再难!
  • 3分钟搞定Dell G15散热控制:开源神器Thermal Control Center完全指南
  • 告别点灯!用ST7789V2 TFT屏在STM32上玩点高级的:动态刷新与GUI框架入门
  • CUDA内存安全:Compute Sanitizer与编译时插桩技术解析
  • BetterNCM插件管理器:用Rust技术栈重构网易云音乐插件生态
  • 为AI Agent构建长期记忆:Orca Memory架构解析与集成实践
  • 完全掌握高效远程连接:专业SSH工具中文版实战应用指南
  • 告别枯燥理论!用一张时序图+实战代码,带你彻底搞懂SA8155上QNX的启动流程(附IFS构建脚本)
  • 别让好药“卡”在第一步:用Python和RDKit快速预测药物水溶性(logS)与脂溶性(logP)
  • 终极SVG导入指南:如何用InlineSVGToAI脚本一键粘贴SVG代码到Illustrator
  • Python代码质量提升:从规范到优化的实践指南
  • 命令行翻译工具gt:为开发者打造的高效翻译解决方案
  • 开源酷狗音乐客户端MoeKoeMusic:二次元风格的全平台免费音乐解决方案
  • 仿生灵巧手技术特点解析,盘点优质仿生灵巧手品牌实用指南 - 品牌2026