在 RT-Thread RTOS 上运行 LVGL:软件包集成与移植源码解析(X-TRACK 内嵌 LVGL v8.3 实践)

发布时间:2026/10/4 1:48:51
在 RT-Thread RTOS 上运行 LVGL:软件包集成与移植源码解析(X-TRACK 内嵌 LVGL v8.3 实践) 智能硬件嵌入式硬件开发【免费下载链接】X-TRACKA GPS bicycle speedometer that supports offline maps and track recording项目地址https://gitcode.com/gh_mirrors/xt/X-TRACK点击查看免费下载本篇技术指南以 LVGL 官方文档《RT-Thread RTOS》为核心系统讲解 RT-Thread 实时操作系统的定位与特性、如何通过软件包机制在 RT-Thread 项目中接入 LVGL并结合 X-TRACK 仓库内嵌的 LVGL v8.3.0 源码深入剖析env_support/rt-thread移植层的线程模型、内存与时钟适配实现。读完本文你将掌握在 RT-Thread 上启用、编译和二次定制 LVGL 的完整方法并能读懂官方 BSP 移植背后的底层原理。一、RT-Thread 是什么RT-Thread 是一个开源、中立、社区驱动的实时操作系统RTOS其官方文档在 LVGL 文档体系中被列为受支持的操作系统之一。RT-Thread 提供Standard标准版与Nano精简版两种形态Nano 版面向资源受限的 MCU 系统最小内核仅需约3 KB Flash 与 1.2 KB RAM可通过易用的工具快速裁剪定制适合以最小资源占用运行图形界面或业务逻辑的场合。Standard 版面向资源丰富的物联网设备可借助在线软件包管理工具与系统配置工具实现直观、快速的模块化裁剪无缝导入丰富软件包从而实现类似 Android 的图形界面与触摸滑动效果、智能语音交互等复杂功能。在 X-TRACK 仓库中这份文档随 LVGL 源码一起被收录在 rt-thread.md与freertos.md、zephyr.md、nuttx.md共同构成 LVGL 官方 OS 集成指南索引见 os/index.md是了解在 RTOS 环境中运行 LVGL 的标准入口。关键特性原文档明确列出的 RT-Thread 关键特性如下专为资源受限设备设计最小内核仅需1.2 KB RAM 与 3 KB Flash提供多种标准接口如 POSIX、CMSIS、C 应用环境拥有丰富的组件与蓬勃发展的软件包生态代码风格优雅易于使用、阅读与掌握高可扩展性架构松耦合、模块化易于裁剪与扩展支持高性能应用支持 GCC、Keil、IAR 等主流编译工具支持广泛的芯片架构与开发板。二、如何在 RT-Thread 上运行 LVGLLVGL 已注册为 RT-Thread 的官方软件包。RT-Thread 用户可以通过Env 工具或RT-Thread Studio IDE一键下载 LVGL 源码并将其组合进 RT-Thread 工程。RT-Thread 社区已官方移植 LVGL 到以下 BSP开发板支持包BSP说明QEMU 模拟器qemu-vexpress-a9无硬件依赖的快速验证环境Visual Studio 模拟器simulator在 Windows 桌面端运行 LVGLNuvoton numaker-iot-m487新唐 IoT 开发板Nuvoton numaker-pfm-m487新唐 PFM 开发板Nuvoton nk-980iot新唐 980 IoT 开发板Nuvoton numaker-m2354新唐 M2354 安全 MCU 开发板Nuvoton nk-n9h30新唐 N9H30 开发板Nuvoton numaker-m032ki新唐 M032KI 开发板NXP imxrt1060-evkNXP i.MX RT1060 评估板STM32L475 pandora正点原子潘多拉 IoT 开发板STM32F407 explorer正点原子探索者开发板STM32F469 DiscoveryST 官方 Discovery 开发板Raspberry PICO树莓派 Pico 开发板2.1 在 RT-Thread 工程中启用 LVGL 软件包从仓库内的构建脚本可以确认 LVGL 在 RT-Thread 工程中的启用方式。LVGL 的 RT-Thread 集成构建脚本位于 env_support/rt-thread/SConscript其关键逻辑为移植层文件通过DefineGroup(LVGL-port, port_src, depend [PKG_USING_LVGL], ...)加入构建即软件包宏PKG_USING_LVGL决定移植层是否参与编译LVGL 全部src/目录下的.c文件通过递归Glob收集同样以PKG_USING_LVGL为依赖条件编译若启用PKG_USING_LVGL_EXAMPLES则额外编译examples/目录若启用PKG_USING_LVGL_DEMOS则额外编译demos/目录脚本会根据编译器平台自动追加 C 标准参数GCC / Keil AC6armclang追加-stdc99Keil AC5armcc追加--c99 --gnu。因此在 Env 工具或 RT-Thread Studio 中通常的启用流程为通过menuconfig或 Studio 的软件包管理界面选择 LVGL 软件包勾选PKG_USING_LVGL以及可选的PKG_USING_LVGL_EXAMPLES/PKG_USING_LVGL_DEMOS保存配置后执行scons构建脚本便会自动完成源码收集与编译。2.2 启用 LVGL 日志移植层配置头文件 lv_rt_thread_conf.h 中日志开关由软件包宏PKG_LVGL_ENABLE_LOG驱动#ifdef PKG_LVGL_ENABLE_LOG # define LV_USE_LOG 1 #else # define LV_USE_LOG 0 #endif启用后LVGL 内部日志会经由移植层注册的回调输出到 RT-Thread 的日志系统见下文lv_rt_log。三、RT-Thread 移植层源码解析X-TRACK 仓库内嵌的 LVGL 为v8.3.0见 lvgl.h 中的LVGL_VERSION_MAJOR 8、LVGL_VERSION_MINOR 3、LVGL_VERSION_PATCH 0。其 RT-Thread 移植层共三个文件本节逐一拆解。3.1 移植入口lv_rt_thread_port.cenv_support/rt-thread/lv_rt_thread_port.c 是 LVGL 在 RT-Thread 中的线程化移植实现整体受__RTTHREAD__宏保护仅在 RT-Thread 环境编译。线程参数默认值#ifndef LVGL_THREAD_STACK_SIZE #define LVGL_THREAD_STACK_SIZE 4096 #endif #ifndef LVGL_THREAD_PRIO #define LVGL_THREAD_PRIO (RT_THREAD_PRIORITY_MAX*2/3) #endifLVGL_THREAD_STACK_SIZELVGL 专用线程的栈大小默认4096 字节可按界面复杂度与可用 RAM 调整LVGL_THREAD_PRIO线程优先级默认取RT_THREAD_PRIORITY_MAX*2/3即中等偏低的优先级避免 LVGL 刷新任务抢占关键实时业务。线程入口函数lvgl_thread_entry完整展示了 LVGL 在 RTOS 中的标准启动与任务调度流程static void lvgl_thread_entry(void *parameter) { #if LV_USE_LOG lv_log_register_print_cb(lv_rt_log); #endif lv_init(); lv_port_disp_init(); lv_port_indev_init(); lv_user_gui_init(); /* handle the tasks of LVGL */ while(1) { lv_task_handler(); rt_thread_mdelay(10); } }对应四个要点若LV_USE_LOG开启先通过lv_log_register_print_cb(lv_rt_log)将 LVGL 日志回调指向 RT-Thread 的LOG_I输出依次调用lv_init()初始化 LVGL 核心、lv_port_disp_init()初始化显示驱动、lv_port_indev_init()初始化输入设备驱动、lv_user_gui_init()用户自定义 GUI 初始化主循环中反复调用lv_task_handler()——这是 LVGL 的周期性任务处理入口负责定时器、动画、刷新等全部后台工作每次任务处理后rt_thread_mdelay(10)休眠 10 ms将 CPU 让给其他线程这也是 LVGL 在裸机while(1)中常见的lv_tick节拍在 RTOS 下的等价做法。线程创建与自动启动static int lvgl_thread_init(void) { rt_err_t err; err rt_thread_init(lvgl_thread, LVGL, lvgl_thread_entry, RT_NULL, lvgl_thread_stack[0], sizeof(lvgl_thread_stack), LVGL_THREAD_PRIO, 0); if(err ! RT_EOK) { LOG_E(Failed to create LVGL thread); return -1; } rt_thread_startup(lvgl_thread); return 0; } INIT_ENV_EXPORT(lvgl_thread_init);移植层使用静态线程对象lvgl_thread与静态栈数组lvgl_thread_stack不依赖动态内存分配即可创建线程创建失败时通过LOG_E输出错误。最后以INIT_ENV_EXPORT(lvgl_thread_init)将初始化函数注册到 RT-Thread 的自动初始化机制INIT_ENV阶段系统启动后会自动完成 LVGL 线程的创建与启动无需用户手动调用。3.2 配置适配lv_rt_thread_conf.henv_support/rt-thread/lv_rt_thread_conf.h 是 LVGL 在 RT-Thread 环境下的配置头文件它通过重定义 LVGL 的若干LV_*宏把 LVGL 的底层依赖全部桥接到 RT-Thread 内核配置宏桥接内容说明LV_MEM_CUSTOM/LV_MEM_CUSTOM_ALLOC/LV_MEM_CUSTOM_FREE/LV_MEM_CUSTOM_REALLOCrt_malloc/rt_free/rt_realloc开启RT_USING_HEAP后LVGL 动态内存直接使用 RT-Thread 堆管理器LV_TICK_CUSTOMrt_tick_get_millisecond()LVGL 的 ms 时钟源取自 RT-Thread 系统节拍无需单独提供lv_tick_incLV_USE_LOGPKG_LVGL_ENABLE_LOG软件包宏控制 LVGL 日志开关LV_ASSERT_HANDLERRT_ASSERT(0)LVGL 断言失败时触发 RT-Thread 断言处理LV_SPRINTF_CUSTOMrt_snprintf/rt_vsnprintfLVGL 的格式化输出复用到 RT-Thread 的 printf 实现避免额外引入浮点 printfLV_BIG_ENDIAN_SYSTEMARCH_CPU_BIG_ENDIAN大小端随 RT-Thread 平台配置自动切换LV_ATTRIBUTE_MEM_ALIGNALIGN(4)内存对齐方式采用 RT-Thread 的 4 字节对齐LV_BUILD_EXAMPLESPKG_USING_LVGL_EXAMPLES软件包宏控制是否编译官方示例其中内存与时钟两项是整个移植的关键内存适配LV_MEM_CUSTOM 1让 LVGL 完全改用 RT-Thread 的堆内存分配器与 RT-Thread 的其他组件共享堆空间避免 LVGL 自带内存池与 RTOS 堆互相割裂时钟适配LV_TICK_CUSTOM_SYS_TIME_EXPR (rt_tick_get_millisecond())使 LVGL 内部所有基于lv_tick_get()的超时、动画与闪烁逻辑直接以 RT-Thread 的毫秒节拍为准无需再为 LVGL 单独维护 tick 中断。3.3 配置头文件的自动引入机制LVGL 的 Kconfig 桥接头文件 src/lv_conf_kconfig.h 专门处理 LVGL 与 Kconfig 配合使用时的特殊配置# ifdef __NuttX__ # include nuttx/config.h # elif defined(__RTTHREAD__) # define LV_CONF_INCLUDE_SIMPLE # include lv_rt_thread_conf.h # endif当编译环境定义了__RTTHREAD__时LVGL 会自动展开LV_CONF_INCLUDE_SIMPLE并引入lv_rt_thread_conf.h。也就是说RT-Thread 用户无需手动指定LV_CONF_PATH或修改lv_conf.h包含路径只要工程定义__RTTHREAD__上述全部适配配置即自动生效。这也解释了为何该配置头文件内部大量使用#ifdef __RTTHREAD__保护。四、在 X-TRACK 项目语境下理解这份文档X-TRACK 是一个支持离线地图与轨迹记录的 GPS 自行车码表开源项目。其桌面模拟器工程 Simulator/LVGL.Simulator 内嵌了完整的 LVGL v8.3.0 源码、官方文档与各环境移植层本指南所依赖的 rt-thread.md 正是其中之一。需要说明的是从仓库结构看X-TRACK 固件本身USER 与 MDK-ARM_F435、MDK-ARM_F403A采用裸机 Arduino API 架构其模拟器基于 SDL/桌面窗口见 LVGL.Simulator.cpp并未实际使用 RT-Thread但rt-thread.md与env_support/rt-thread/移植层随 LVGL 一并被收录为需要在 RT-Thread RTOS 上复用同版本 LVGL如基于 QEMU 模拟器或 RT-Thread Studio 快速验证码表 UI的开发者提供了完整、可直接编译的参考实现。五、小结与排查建议在 RT-Thread 上运行 LVGL 的要点可归纳为选型资源极紧张Flash 3 KB / RAM 1.2 KB 量级选 Nano 版功能丰富、需要软件包生态的选 Standard 版接入通过 Env 或 RT-Thread Studio 启用 LVGL 软件包PKG_USING_LVGL构建脚本 SConscript 会自动收集源码运行模型移植层自动创建优先级为RT_THREAD_PRIORITY_MAX*2/3、栈 4096 字节的 LVGL 线程循环执行lv_task_handler()并每 10 ms 让出 CPU见 lv_rt_thread_port.c底层适配内存、时钟、日志、断言、sprintf 均自动桥接到 RT-Thread见 lv_rt_thread_conf.h。若界面刷新卡顿或任务异常优先检查三处LVGL_THREAD_STACK_SIZE是否满足复杂 UI 的栈需求、LVGL_THREAD_PRIO是否被更高优先级业务长期抢占、以及RT_USING_HEAP是否开启决定LV_MEM_CUSTOM是否生效。这三项均可在上述两个移植文件中直接定位与修改兼顾了 RTOS 实时性与图形渲染效率的平衡。赞分享智能硬件嵌入式硬件开发【免费下载链接】X-TRACKA GPS bicycle speedometer that supports offline maps and track recording项目地址https://gitcode.com/gh_mirrors/xt/X-TRACK点击查看免费下载相关推荐Teleport Access List Scopes 完全指南Scope 标识符格式与嵌套层级规则解析Teleport Access List Scopes 完全指南Scope 标识符格式与嵌套层级规则解析 Access List访问列表是 Telepor智能硬件嵌入式硬件开发flame_3d 路线图全解析从 Flutter GPU 抽象到熟悉的 Flame 3D 组件 APIflame_3d 路线图全解析从 Flutter GPU 抽象到熟悉的 Flame 3D 组件 API 本文以 packages/flame_3d/ROADM智能硬件嵌入式硬件开发基于 RT-Thread 的 Raspberry Pi Pico 运行 LVGL 图形界面ST7789 SPI 屏移植全指南基于 RT Thread 的 Raspberry Pi Pico 运行 LVGL 图形界面ST7789 SPI 屏移植全指南 本篇技术指南以 RT Threa操作系统嵌入式物联网嵌入式OSRTOS上一篇exif-js版本升级指南从v2.2.0到v2.3.0的新特性下一篇NVIDIA Profile Inspector终极指南解锁隐藏显卡优化功能与插件开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询