Skip to content

Slint 可在多种嵌入式平台上运行。

下面的平台说明涵盖了已经过部署测试的内容。对于开发环境,我们建议使用最新的桌面操作系统和编译器版本。

嵌入式 Linux

Slint 可以在各种嵌入式 Linux 平台上运行。一般来说,Slint 需要一个现代的 Linux 用户空间,并配备可用的 OpenGL ES 2.0(或更新版本)或 Vulkan 驱动。我们已经成功在以下平台上运行 Slint:

对于 C++ 应用程序,有关 recipe(配方)请参见 meta-slint

Rust 应用程序可开箱即用地使用 Yocto 的 Rust 支持。

Toradex 提供 Torizon OS,这是一个基于 Linux 的嵌入式设备平台,可将应用程序打包到 docker 容器中。

我们以 docker 容器的形式提供针对 Toradex 编译的演示,带有和不带有 GPU 加速支持。

前置条件

  • 运行 Torizon OS 6.0 或更高版本的设备
  • 对 Torizon 设备的 SSH 访问权限
  • 设备上已安装 Docker

注意:Slint 演示直接在 linux/kms 上运行,不需要 Weston 容器。

运行

我们预先编译的演示有针对不同硬件平台优化的多个变体:

  1. 不带 GPU 的标准 ARM64 构建torizon-demos-arm64) - 使用软件渲染
  2. i.MX8 GPU 构建torizon-demos-arm64-imx8) - 针对 i.MX8 系列优化,具有 GPU 加速
  3. AM62 GPU 构建torizon-demos-arm64-am62) - 针对 AM62 系列优化,具有 GPU 加速
  4. i.MX95 GPU 构建torizon-demos-arm64-imx95) - 针对 i.MX95 系列优化,具有 GPU 加速

所有容器的完整列表可在以下位置找到:

https://github.com/orgs/slint-ui/packages?q=torizon&tab=packages&q=torizon

例如,要在带 GPU 的 i.MX8 板上运行容器,请使用 Docker Compose 部署以下 docker-compose.yaml

yaml
services:  slint-demo:    image: ghcr.io/slint-ui/slint/torizon-demos-arm64-imx8:latest    restart: unless-stopped    environment:      - ACCEPT_FSL_EULA=1    user: torizon    privileged: true    volumes:      - type: bind        source: /tmp        target: /tmp      - type: bind        source: /dev        target: /dev      - type: bind        source: /run/udev        target: /run/udev    device_cgroup_rules:      # ... for tty      - "c 4:* rmw"      # ... for /dev/input devices      - "c 13:* rmw"      - "c 199:* rmw"      # ... for /dev/dri devices      - "c 226:* rmw"

更改 image 以匹配你的硬件平台:

平台镜像
ARM64 无 GPUghcr.io/slint-ui/slint/torizon-demos-arm64:latest
i.MX8 带 GPUghcr.io/slint-ui/slint/torizon-demos-arm64-imx9:latest
AM62 带 GPUghcr.io/slint-ui/slint/torizon-demos-am62:latest
i.MX95 带 GPUghcr.io/slint-ui/slint/torizon-demos-imx95:latest

或者,使用以下命令行运行容器:

sudo docker run --rm --privileged \  --user=torizon \  -v /dev:/dev \  -v /tmp:/tmp \  -v /run/udev:/run/udev \  --device-cgroup-rule='c 199:* rmw' \  --device-cgroup-rule='c 226:* rmw' \  --device-cgroup-rule='c 13:* rmw' \  --device-cgroup-rule='c 4:* rmw' \  ghcr.io/slint-ui/slint/torizon-demos-arm64-imx8

plaintext

选择演示

默认情况下,运行 home-automation 演示。容器打包了多个演示应用程序:

  • home-automation(默认) - 智能家居控制面板
  • energy-monitor - 能源监控仪表板
  • printerdemo - 3D 打印机控制界面
  • gallery - 带触摸导航的图像画廊
  • slide_puzzle - 互动滑动拼图游戏
  • opengl_underlay - OpenGL 渲染演示
  • carousel - 3D 轮播界面
  • todo - 任务管理应用程序
  • weather-demo - 天气信息显示(需要 API key)

通过将特定演示作为参数传递给 docker run 来运行该演示,例如:

sudo docker run --rm --privileged --user=torizon \  -v /dev:/dev -v /tmp:/tmp -v /run/udev:/run/udev \  --device-cgroup-rule='c 199:* rmw' --device-cgroup-rule='c 226:* rmw' \  --device-cgroup-rule='c 13:* rmw' --device-cgroup-rule='c 4:* rmw' \  ghcr.io/slint-ui/slint/torizon-demos-arm64-imx8 printerdemo

plaintext

微控制器

Slint 的平台抽象允许集成到任何基于 Rust 或 C++ 的微控制器开发环境中。开发者需要实现将输入事件(如触摸或键盘)馈送进去,以及将由 Slint 渲染的像素显示到帧缓冲区或行缓冲区中的功能。

我们为一些来自硅片厂商的现成开发板提供模板。

你需要使用 mcu-board-support crate。该 crate 重新导出了一个应用于 main 函数的 entry 属性宏,以及一个应在创建 Slint UI 之前调用的 init() 函数。

为了使用此后端,最终程序必须同时依赖于 slintmcu-board-support。 main.rs 看起来像这样:

rust
#![no_std]#![cfg_attr(not(feature = "simulator"), no_main)]slint::include_modules!();
#[allow(unused_imports)]use mcu_board_support::prelude::*;
#[mcu_board_support::entry]fn main() -> ! {    mcu_board_support::init();    MainWindow::new().run();    panic!("The event loop should not return");}

由于 mcu-board-support 目前是一个内部 crate,未上传到 crates.io,因此你必须使用 slint、slint-build 和 mcu-board-support 的 git 版本:

toml
[dependencies]slint = { git = "https://github.com/slint-ui/slint", default-features = false }mcu-board-support = { git = "https://github.com/slint-ui/slint" }# ...[build-dependencies]slint-build = { git = "https://github.com/slint-ui/slint" }

在你的 build.rs 中,你必须包含对 slint_build::print_rustc_flags().unwrap() 的调用来设置某些标志。

乐鑫(ESP32)

要将 Slint 与你的 C++ 应用程序一起使用,你可以遵循 Espressif 文档站点 上的说明。

ST(STM32)

STM32H735G-DK

你可以从模板 slint-cpp-template-stm32h735g-dk.zip 开始

STM32H747I-DISCO

你可以从模板 slint-cpp-template-stm32h747i-disco.zip 开始

按照下面的步骤运行 Slint Printer 演示

STM32H735G-DK

使用 probe-rs

Terminal window

bash
CARGO_PROFILE_RELEASE_OPT_LEVEL=s CARGO_TARGET_THUMBV7EM_NONE_EABIHF_RUNNER="probe-rs run --chip STM32H735IGKx" cargo run -p printerdemo_mcu --no-default-features  --features=mcu-board-support/stm32h735g --target=thumbv7em-none-eabihf --release

树莓派(Pico)

目前 Raspberry Pi Pico 上仅支持 Rust 程序。

在 Raspberry Pi Pico 上

确保设置了正确的 target:

Terminal window

bash
rustup target add thumbv6m-none-eabi

使用以下命令构建 Slint Printer 演示:

Terminal window

bash
cargo build -p printerdemo_mcu --no-default-features --features=mcu-board-support/pico-st7789 --target=thumbv6m-none-eabi --release

生成的文件可以使用 elf2uf2-rs 烧录。使用以下命令安装它:

Terminal window

bash
cargo install elf2uf2-rs

现在关闭 Pico 的电源,并在按住 "bootsel" 按钮的同时连接它。该设备将以 RPI-RP2 的名称显示为一个存储设备。

然后使用以下命令将演示烧录到 Pico:

Terminal window

bash
elf2uf2-rs -d target/thumbv6m-none-eabi/release/printerdemo_mcu

烧录完成后,Pico 将重新启动并显示 Slint Printer 演示。Mac 会警告驱动器被意外卸载。这属于正常情况,可以忽略。

现在关闭 Pico 的电源,并在按住 "bootsel" 按钮的同时连接它。该设备将显示为一个存储设备。

挂载设备:

Terminal window

bash
udisksctl mount -b /dev/sda1

然后使用以下命令将演示烧录到 Pico:

Terminal window

bash
elf2uf2-rs -d target/thumbv6m-none-eabi/release/printerdemo_mcu

在 Raspberry Pi Pico2 上

使用以下命令构建 Slint Printer 演示:

Terminal window

bash
cargo build -p printerdemo_mcu --no-default-features --features=mcu-board-support/pico2-st7789 --target=thumbv8m.main-none-eabihf --release

生成的文件可以使用 picotool 方便地烧录。你应该从源码构建它。

然后将演示上传到 Raspberry Pi Pico2:在将 micro-usb 数据线连接到设备的同时,按下设备上的 "bootsel" 白色按钮,这会在你的工作站上连接一些 USB 存储,你可以在其中存储二进制文件。

或者在 linux 上通过命令执行(在按下 "bootsel" 按钮的同时连接设备):

Terminal window

bash
# If you're on Linux: mount the deviceudisksctl mount -b /dev/sda1# uploadpicotool load -u -v -x -t elf target/thumbv8m.main-none-eabihf/release/printerdemo_mcu

使用 probe-rs

这需要 probe-rs,并通过 probe(例如运行 probe 的另一个 pico)连接 pico。

然后你只需使用 cargo run 运行即可

Terminal window

bash
CARGO_TARGET_THUMBV6M_NONE_EABI_LINKER="flip-link" CARGO_TARGET_THUMBV6M_NONE_EABI_RUNNER="probe-rs run --chip RP2040" cargo run -p printerdemo_mcu --no-default-features --features=mcu-board-support/pico-st7789 --target=thumbv6m-none-eabi --release

使用 probe-rs 的 VSCode 插件烧录和调试 Pico

按照 此处 的说明安装 probe-rs-debugger 和 VSCode 插件。

将此构建任务添加到你的 .vscode/tasks.json

json
{  "version": "2.0.0",  "tasks": [    {      "type": "cargo",      "command": "build",      "args": [        "--package=printerdemo_mcu",        "--features=mcu-pico-st7789",        "--target=thumbv6m-none-eabi",        "--profile=release-with-debug"      ],      "problemMatcher": [        "$rustc"      ],      "group": "build",      "label": "build mcu demo for pico"    },  ]}

release-with-debug profile 是必需的,因为 debug 构建不适合放入 flash 中。

你可以在顶层 Cargo.toml 中这样定义它:

toml
[profile.release-with-debug]inherits = "release"debug = true

现在,你可以将启动配置添加到 .vscode/launch.json

json
{    "version": "0.2.0",    "configurations": [        {            "preLaunchTask": "build mcu demo for pico",            "type": "probe-rs-debug",            "request": "launch",            "name": "Flash and Debug MCU Demo",            "cwd": "${workspaceFolder}",            "connectUnderReset": false,            "chip": "RP2040",            "flashingConfig": {                "flashingEnabled": true,                "resetAfterFlashing": true,                "haltAfterReset": true            },            "coreConfigs": [                {                    "coreIndex": 0,                    "rttEnabled": true,                    "programBinary": "./target/thumbv6m-none-eabi/release-with-debug/printerdemo_mcu"                }            ]        },    ]}

这是使用通过 DapperMime 编程为 probe 的第二个 Raspberry Pi Pico 测试的。

其他平台

如果你希望在其它平台/版本上使用 Slint,请联系我们

基于 MIT 协议发布