ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

在 NXP MIMXRT1170-EVKB 上运行 Slint 打印机 Demo:Zephyr 环境搭建、构建与烧录完整指南

在 NXP MIMXRT1170-EVKB 上运行 Slint 打印机 Demo:Zephyr 环境搭建、构建与烧录完整指南 在 NXP MIMXRT1170-EVKB 上运行 Slint 打印机 DemoZephyr 环境搭建、构建与烧录完整指南【免费下载链接】slintSlint is an open-source declarative GUI toolkit to build native user interfaces for Rust, C, JavaScript, or Python apps.项目地址: https://gitcode.com/GitHub_Trending/sl/slint本文以 demos/printerdemo/zephyr/README_NXP.md 为蓝本完整讲解如何在 Zephyr RTOS 上构建并运行 Slint 的打印机触摸屏示例从 Rust nightly 工具链、West 工作流、Zephyr SDK 的前置环境搭建到 native_sim 模拟器与 NXP MIMXRT1170-EVKB 真机搭配 RK055HDMIPI4MA0 MIPI 显示屏的构建与烧录命令并结合仓库源码解析板级 CMake 配置、Kconfig 设置与 C 应用初始化逻辑。读完本文你将能独立复现该 Demo 的完整构建链路并理解 Slint 软件渲染器在 Zephyr 上的集成方式。1. Demo 概览Slint × Rust × Zephyr 的打印机 HMI这是一个用 Slint 声明式 UI 语言与 Rust 实现的虚构打印机触摸屏界面展示了一台打印机设备的完整人机交互场景主页信息、墨水余量、打印任务队列、任务进度与取消等。它是 Slint 在嵌入式 MCU微控制器场景下的典型示例之一。该 Demo 的 Zephyr 移植版本位于仓库的 demos/printerdemo/zephyr 目录结构如下main.cppZephyr 应用入口负责初始化显示设备、创建 Slint 窗口、注入数据模型CMakeLists.txt按目标板选择 Rust 编译目标与 Slint 特性开关的构建脚本VERSION应用版本号由 Zephyr 的app_version.h机制读取README.md包含已知问题与 Renesas EK-RZ/A3M 板的补充说明README_NXP.md面向 NXP MIMXRT1170-EVKB 的专题指南本文主体。UI 定义位于 demos/printerdemo/ui/printerdemo.slint包含界面中所有全局对象如PrinterState、PrinterQueue的声明C 侧通过生成的printerdemo.h头文件与这些对象交互。共享的 Zephyr 平台集成代码位于 demos/zephyr-common 目录其中 slint-zephyr.cpp 提供了slint_zephyr_init()平台初始化函数声明见 slint-zephyr.h负责把 Zephyr 的显示设备与输入事件接入 Slint 运行时。2. 前置条件搭建 Zephyr 开发环境2.1 安装 Rust启用 nightly 通道Slint 的 Rust 编译目标依赖 nightly 工具链构建脚本中使用了-Zbuild-std等不稳定特性请先安装# Install via rustup # See https://www.rust-lang.org/tools/install # Enable the nightly channel rustup toolchain install nightly rustup default nightly2.2 安装 Zephyr 系统依赖与 West按 Zephyr 官方 Getting Started 指南安装系统级依赖然后将 WestZephyr 的多仓库管理工具装入 Python 虚拟环境避免污染系统 Python# 如果 Slint 源码已经检出 python3 -m venv ../.venv source ../.venv/bin/activate # 如果还没有 Slint 源码新建 slint-zephyr 目录 mkdir slint-zephyr python3 -m venv slint-zephyr/.venv source slint-zephyr/.venv/bin/activate # Install west pip install west2.3 获取 Zephyr 源码West ManifestSlint 仓库在 demos/zephyr-common/west.yaml 中声明了 Zephyr 版本清单当前锁定 Zephyr v4.4.1。根据你是否已有 Slint 源码二选一情况 ASlint 源码已检出Zephyr 源码将位于 Slint 源码的兄弟目录cd .. west init -l --mf demos/zephyr-common/west.yaml ./slint情况 B尚无 Slint 源码west init会同时拉取 Slint 的zephyr分支与 Zephyr 源码到slint-zephyr目录west init -m https://github.com/slint-ui/slint --mr zephyr --mf demos/zephyr-common/west.yaml slint-zephyr cd slint-zephyr随后检出清单中声明的所有仓库west update2.4 导出 Zephyr CMake 包执行以下命令生成 Zephyr 的 CMake 包使 CMake 能自动加载构建 Zephyr 应用所需的样板代码west zephyr-export2.5 安装 Zephyr 的 Python 依赖Zephyr 的scripts/requirements.txt声明了额外的 Python 依赖用 pip 安装pip install -r ~/zephyrproject/zephyr/scripts/requirements.txt2.6 安装 Zephyr SDK按 Zephyr 官方文档安装v0.16.8版本的 Zephyr SDK该版本与仓库 west.yaml 锁定的 Zephyr v4.4.1 配套。SDK 提供交叉编译工具链、QEMU 与调试工具是编译 ARM Cortex-M 目标所必需的。3. 硬件准备MIMXRT1170-EVKB 与 RK055HDMIPI4MA0本示例已在以下硬件组合上完成测试主控板NXP MIMXRT1170-EVKBCortex-M7 内核即mimxrt1170_evkB/mimxrt1176/cm7显示屏RK055HDMIPI4MA0 MIPI 触摸显示 Shield。注意板载调试探针可能需要按 Zephyr 文档的Configuring a debug probe一节进行配置后才能正常烧录与调试。该 Shield 的 MIPI 面板以原生端序native endian消费 RGB 565 像素数据这一点在构建配置中需要显式开启见第 6 节。4. 在模拟器中构建运行native_sim环境就绪后先在本机模拟器上验证 Demo无需连接硬件# Build west build -b native_sim/native/64 -p always slint/demos/printerdemo/zephyr # Run ./build/zephyr/zephyr.exe命令中的-p always强制进行 pristine build全新构建Zephyr 官方文档推荐新用户使用该选项以避免增量构建的缓存干扰。在模拟器模式下Demo 使用 SDL 后端渲染共享配置 native_sim_64.conf 中开启CONFIG_INPUT_SDL_TOUCHy使 SDL 窗口支持触摸模拟native_sim_64.overlay 将模拟显示面板的尺寸设置为 720×1280与真机 MIPI 面板分辨率一致。运行后会弹出 SDL 窗口可用鼠标模拟触摸交互。5. 在真实硬件上构建与烧录使用west build交叉编译并west flash烧录# Build west build -b mimxrt1170_evkB/mimxrt1176/cm7 -p always slint/demos/printerdemo/zephyr -- -DSHIELDrk055hdmipi4ma0 -DCMAKE_BUILD_TYPERelease # Flash west flash关键参数说明-b mimxrt1170_evkB/mimxrt1176/cm7指定板卡为 MIMXRT1170-EVK 的 B 版本、Cortex-M7 内核构建目标为thumbv7em-none-eabihf详见 CMakeLists.txt-- -DSHIELDrk055hdmipi4ma0挂载 RK055HDMIPI4MA0 MIPI 显示 Shield同时会触发 RGB 565 原生端序像素格式的自动配置-DCMAKE_BUILD_TYPERelease启用 Release 优化级别保证 MCU 上 UI 渲染性能。6. 深入构建配置板级 CMake 与 Kconfig6.1 CMakeLists.txt 的板级分支demos/printerdemo/zephyr/CMakeLists.txt 是整个构建的核心它按BOARD变量分别设置 Rust 交叉编译目标板卡Rust 目标关键附加配置native_sim/native/64x86_64-unknown-linux-gnu使用-Zbuild-stdcore,allocmimxrt1170_evkB/mimxrt1176/cm7thumbv7em-none-eabihf需启用硬件 FPU 与硬浮点 ABIrza3m_ekaarch64-unknown-none面板旋转 90°SLINT_ZEPHYR_PANEL_ROTATION90、RGB 565 原生端序未列出的板卡会触发FATAL_ERROR并提示在 Zephyr 板卡文档中寻找与 Rust 目标匹配的硬件。此外当SHIELD匹配rk055hdmipi4ma0时脚本会自动设置SLINT_ZEPHYR_RGB565_NATIVE_ENDIAN1因为该 MIPI 面板驱动消费原生端序的 RGB 565 数据。同一文件还强制启用了 MCU 场景所需的 Slint 特性set(SLINT_FEATURE_FREESTANDING ON CACHE BOOL FORCE) set(SLINT_FEATURE_RENDERER_SOFTWARE ON CACHE BOOL FORCE) set(SLINT_FEATURE_SDF_FONTS ON CACHE BOOL FORCE) set(DEFAULT_SLINT_EMBED_RESOURCES embed-for-software-renderer-with-sdf CACHE STRING ) set(BUILD_SHARED_LIBS OFF)其中SLINT_FEATURE_FREESTANDING无标准库no_std环境支持SLINT_FEATURE_RENDERER_SOFTWARE启用纯软件渲染器不依赖 GPUSLINT_FEATURE_SDF_FONTS启用 SDFSigned Distance Field字体渲染保证小字号字体在低分辨率屏上清晰资源以embed-for-software-renderer-with-sdf方式嵌入固件避免外部文件系统依赖。最后slint_target_sources(app ../ui/printerdemo.slint)将.slint文件交给 Slint 构建工具链在编译期生成 C 头文件并接入app目标。6.2 共享 Kconfigprj.confdemos/zephyr-common/prj.conf 是所有板卡共享的 Zephyr 配置CONFIG_CPPy CONFIG_STD_CPP20y CONFIG_REQUIRES_FULL_LIBCPPy CONFIG_POSIX_APIy CONFIG_LOGy CONFIG_ASSERTy CONFIG_DISPLAYy CONFIG_INPUTy CONFIG_INPUT_THREAD_PRIORITY_OVERRIDEy CONFIG_INPUT_THREAD_PRIORITY-1其中CONFIG_INPUT_THREAD_PRIORITY_OVERRIDE与CONFIG_INPUT_THREAD_PRIORITY-1的注释说明了设计动机让触摸事件在帧渲染期间也能及时送达——输入线程默认优先级最低若不提高优先级它要等当前帧渲染完成才能排空事件队列导致触摸响应迟钝。6.3 板级配置MIMXRT1170 专属mimxrt1170_evk_mimxrt1176_cm7.conf 针对该板补充了三类关键设置# 大栈空间避免 MPU FAULT: Stacking error CONFIG_MAIN_STACK_SIZE32768 # 硬件 FPU 硬浮点 ABIRust thumbv7em-none-eabihf 目标必需 CONFIG_FPUy CONFIG_FP_HARDABIy # 启用 PXP 与 DMA 加速显示 CONFIG_DMAy CONFIG_MCUX_ELCDIF_PXPy CONFIG_MCUX_ELCDIF_PXP_ROTATE_90y32 KB 主线程栈用于规避 MPU 压栈错误Stacking error这是 MCU 上启用浮点上下文切换时的常见陷阱必须同时开启CONFIG_FPU与CONFIG_FP_HARDABI否则与 Rust 的thumbv7em-none-eabihf硬浮点 ABI 不匹配PXP 是 NXP i.MX RT 系列内置的 2D 像素处理引擎CONFIG_MCUX_ELCDIF_PXP_ROTATE_90允许面板驱动做 90° 旋转。6.4 West ManifestZephyr 版本锁定demos/zephyr-common/west.yaml 将 Zephyr 锁定在v4.4.1并import: true导入其子清单。若面向 Renesas EK-RZ/A3M 板则改用 west-rza3m.yaml——它指向 Renesas 维护的 Zephyr forkwip_rz分支因为该板的板级支持与显示驱动只存在于 Renesas 的分支中详见 README.md 的 Renesas 小节。7. 应用代码解析C 侧如何驱动 UI7.1 初始化流程main.cpp 的main()遵循典型的 Slint-on-Zephyr 启动序列通过设备树节点DT_CHOSEN(zephyr_display)获取显示设备并检查device_is_ready()失败时在模拟器下调用posix_exit(1)退出调用slint_zephyr_init(display_dev)完成平台集成显示缓冲、输入事件注册MainWindow::create()构建由 printerdemo.slint 生成的 UI 组件注入数据模型与回调最后printer_demo-run()进入事件循环。7.2 模型与全局对象Demo 演示了 Slint C API 的Model扩展机制。InkLevelModel继承slint::ModelInkLevel用std::vector维护四种墨水颜色与余量黄 90%、青 50%、品红 80%、黑 10%并通过row_count()/row_data()两个重写方法提供给 UI 的 Repeater 使用struct InkLevelModel : slint::ModelInkLevel { size_t row_count() const override { return m_data.size(); } std::optionalInkLevel row_data(size_t i) const override { ... } std::vectorInkLevel m_data { { slint::Color::from_rgb_uint8(255, 255, 0), 0.9 }, ... }; };随后通过printer_demo-globalPrinterState().set_ink_levels(...)把模型挂到 UI 的全局对象上。同样PrinterQueue全局对象被替换为可变的slint::VectorModelPrinterQueueItem并注册on_start_job向队列追加新任务记录提交时间戳与on_cancel_job按索引删除任务两个回调。7.3 定时器驱动的打印进度最值得关注的是用slint::Timer模拟任务进度slint::Timer printer_queue_progress_timer(std::chrono::seconds(1), []() { if (printer_queue-row_count() 0) { auto top_item *printer_queue-row_data(0); top_item.progress 1; if (top_item.progress 100) { printer_queue-erase(0); } else { top_item.status printing; printer_queue-set_row_data(0, top_item); } } });每秒把队首任务的progress加 1超过 100 即视为打印完成并从队列移除——这演示了在无操作系统定时器抽象之外Slint 的Timer如何在 Zephyr 上驱动模型更新并自动刷新界面。8. 已知问题根据 README.md 的记录该移植有两个已知限制平台集成未进入 Slint C API 主库与 ESP-IDF 集成不同Zephyr 的平台集成没有作为 Slint C API 的一部分发布。原因是 Zephyr 用设备树描述硬件注册输入事件回调需要从设备树节点取得struct device指针且回调写法依赖具体驱动的行为。当前 slint-zephyr.cpp 的实现已足够覆盖模拟器与显示 Shield 驱动但更通用的方案留待未来研究不支持双缓冲模拟器与测试硬件均未报告支持双缓冲因此当前为单缓冲渲染。9. 常见问题与支持构建与运行中遇到的通用问题可先查阅仓库根目录的 FAQ.md涉及本 Demo 内容或正确性的问题可以在本仓库的 Issues 中提交NXP 微控制器相关的通用技术问题例如对预期功能的差异有疑问建议前往 NXP 官方社区论坛提问直接联系渠道infoslint.dev。本项目使用 MIT 许可见 LICENSES/MIT.txt。【免费下载链接】slintSlint is an open-source declarative GUI toolkit to build native user interfaces for Rust, C, JavaScript, or Python apps.项目地址: https://gitcode.com/GitHub_Trending/sl/slint创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表