ARTICLE DETAIL

资讯详情

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

RT-Thread Smart 在泰山派1(RK3566)上的编译、烧录与 TF 卡启动实战指南

RT-Thread Smart 在泰山派1(RK3566)上的编译、烧录与 TF 卡启动实战指南 操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址https://gitcode.com/gh_mirrors/rt/rt-thread点击查看免费下载泰山派1TaishanPi 1lckfb tspi V10 Board是一块基于 Rockchip RK3566 芯片的开源硬件开发板。本文以 RT-Thread 仓库中 bsp/rockchip/rk3500/Taishanpi-RK3566_ZH.md 为骨架结合仓库内 BSP 源码与配置系统讲解如何在 Ubuntu 宿主机上搭建 RT-Thread Smart 交叉编译环境、编译出rtthread.bin并通过 U-Boot TF 卡方案将 RT-Thread Smart 5.2.1 引导运行起来。读完本文你将掌握完整的环境搭建 → 编译 → 烧录 → TF 卡启动 → 故障排查闭环流程并能读懂启动日志与设备树DTB的关键配置。0. 文档与代码版本说明本文对应的 BSP 使用指南基于固定 Commit 编写仓库版本信息如下关联文档基于 Commita1c642aa3a2848b47f2a1b52679dc4ee5156f2f4本文是对 RK3500 BSP 原始文档 的补充与细化在原有编译、运行说明之上增加了宿主机环境配置、TF 卡制作、boot.scr生成、完整启动日志以及常见故障的逐步排查方法。仓库中另有中文版 Taishanpi-RK3566_CN.md 与英文版 Taishanpi-RK3566_ZH.md 可对照阅读。1. RK3566 芯片与泰山派1 开发板概览1.1 RK3566 芯片规格Rockchip RK3566 是一颗面向中高端 AIoT 场景的 SoC主要特性如下特性参数制程工艺22nmCPU4 核 Cortex-A55 64 位处理器主频最高 1.8GHzGPUARM Mali-G52NPU集成 1 TOPS 算力的 AI 加速器视频解码支持 4K60FPS视频编码支持 1080P60FPSISP支持 5M ISP 与 HDR结合 bsp/rockchip/rk3500/rtconfig.h 中的配置可以看到该 BSP 以RT_USING_SMART、RT_USING_SMP、RT_CPUS_NR 4的方式启用 RT-Thread Smart 用户态与 4 核对称多处理配合RT_TICK_PER_SECOND 1000的 1ms 系统节拍充分发挥四核 A55 的性能。1.2 RK3500 BSP 对不同 RK35 系列芯片的支持情况RK3566 所属的 BSP 目录名为rk3500但实际覆盖了多个 RK35 系列 SoC。bsp/rockchip/rk3500/README.md 中给出了支持矩阵与对应的 earlycon 串口参数SoC支持情况EarlyconRK3576支持earlyconuart8250,mmio32,0x2ad40000RK3588支持earlyconuart8250,mmio32,0xfeb50000RK3562--RK3568J支持earlyconuart8250,mmio32,0xfe660000RK3568支持earlyconuart8250,mmio32,0xfe660000RK3566支持earlyconuart8250,mmio32,0xfe660000RK3528支持earlyconuart8250,mmio32,0xff9f0000RK3506--本文涉及的泰山派1 使用 RK3566其调试串口 earlycon 地址为0xfe660000uart2m0这一参数会在后续设备树配置中反复出现。1.3 宿主机环境要求本文写作时使用的宿主机环境为操作系统Ubuntu 22.04.5 LTS Desktop运行于 VMware 虚拟机中Python 版本Python 3.10.12$ cat /etc/os-release PRETTY_NAMEUbuntu 22.04.5 LTS NAMEUbuntu VERSION_ID22.04 VERSION22.04.5 LTS (Jammy Jellyfish) VERSION_CODENAMEjammy IDubuntu ID_LIKEdebian HOME_URLhttps://www.ubuntu.com/ SUPPORT_URLhttps://help.ubuntu.com/ BUG_REPORT_URLhttps://bugs.launchpad.net/ubuntu/ PRIVACY_PROFILE_URLhttps://www.ubuntu.com/legal/terms-and-policies/privacy-policy UBUNTU_CODENAMEjammy$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.2 LTS Release: 22.04 Codename: jammy$ python --version Python 3.10.122. 环境搭建2.1 安装基础工具执行以下命令安装编译 RT-Thread Smart 所需的系统级工具sudo apt update \ sudo apt install -y python3 python3-pip u-boot-tools device-tree-compiler各工具用途说明python3 / python3-pipRT-Thread 的构建系统基于 SConsPython后续会用 pip 安装sconsu-boot-tools提供mkimage命令用于把boot.cmd打包成 U-Boot 可执行的boot.scr脚本device-tree-compiler提供dtc等设备树工具用于 DTB 的编译与反编译方便排查设备树问题。2.2 使用 pip 安装构建工具pip3 install --user tqdm sconssconsRT-Thread 的构建系统所有编译、menuconfig 操作都由它驱动tqdm软件包拉取时的进度条显示依赖。2.3 设定 python 版本RT-Thread 的 SCons 构建脚本默认调用python命令而 Ubuntu 22.04 默认只安装python3。需要建立软链接sudo rm -rf /usr/bin/python \ sudo ln -s /usr/bin/python3 /usr/bin/python2.4 下载并解压 RT-Thread Smart 工具链RT-Thread Smart 需要专用的aarch64-linux-musleabi交叉编译工具链基于 musl libc 的 glibc 兼容用户态。下载并解压到/opt目录wget RT-Thread Smart aarch64-linux-musleabi 工具链下载地址 sudo tar -xf aarch64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2 -C /opt工具链下载地址以 RT-Thread 官方发布为准。RK3500 BSP 原始文档 中给出的版本为随 RT-Thread v5.2.0 release 发布的aarch64-linux-musleabi_for_x86_64-pc-linux-gnu_242520-979be38cba.tar.bz2可按需选用。README 中注明使用 RT-Thread Smart 专用工具链进行编译切勿混用通用的 aarch64-none-elf 裸机工具链。2.5 设置环境变量解压完成后配置以下环境变量直接复制全部内容粘贴到命令行回车即可export RTT_CCgcc export RTT_EXEC_PATH/opt/aarch64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/ export RTT_CC_PREFIXaarch64-linux-musleabi- export PATH$RTT_EXEC_PATH:$PATH这些环境变量会被 bsp/rockchip/rk3500/rtconfig.py 读取从而决定实际的编译工具链。源码中对应的读取逻辑如下# rtconfig.py节选 ARCH aarch64 CPU cortex-a CROSS_TOOL gcc if os.getenv(RTT_CC): CROSS_TOOL os.getenv(RTT_CC) EXEC_PATH os.getenv(RTT_EXEC_PATH) or /usr/bin PREFIX os.getenv(RTT_CC_PREFIX) or aarch64-none-elf-可见RTT_CC覆盖默认的gcc编译环境即 PLATFORM gccRTT_EXEC_PATH覆盖默认路径/usr/bin指向工具链bin/目录RTT_CC_PREFIX决定所有工具的前缀gcc、g、ar、ld、objcopy等都会自动加上aarch64-linux-musleabi-前缀。同时该文件针对 Cortex-A53/A55 采用了-mcpucortex-a53的编译选项RK3566 的四核 A55 与该指令集兼容并在POST_ACTION中自动执行objcopy -O binary生成rtthread.bin并计算md5sum# rtconfig.py节选 DEVICE -g -mcpucortex-a53 -fdiagnostics-coloralways POST_ACTION OBJCPY -O binary $TARGET rtthread.bin\n SIZE $TARGET \n POST_ACTION md5sum rtthread.bin\n3. 编译 rtthread 镜像3.1 进入 BSP 目录并生成 .config进入rt-thread/bsp/rockchip/rk3500目录运行scons --menuconfig进入 menuconfig 后直接保存退出即可生成.config文件。这一步骤还会顺带拉取编译所必需的zlib软件包该 BSP 的图形配置界面依赖 zlib。3.2 拉取软件包menuconfig 保存退出后运行以下命令更新软件包source ~/.env/tools/scripts/pkgs --update3.3 开始编译scons -j$(nproc)也可以使用scons --exec-pathGCC 工具链路径命令在指定工具链位置的同时直接编译免去手动 export 环境变量的步骤。编译完成后在当前rk3566目录即 bsp/rockchip/rk3500下会生成rtthread.elf与rtthread.bin两个文件其中rtthread.bin是后续烧录/拷贝到 TF 卡的二进制镜像。从源码结构看该 BSP 的板级初始化入口在 bsp/rockchip/rk3500/driver/board.c核心实现为#include setup.h #include board.h void rt_hw_board_init(void) { rt_hw_common_setup(); }rt_hw_common_setup()来自同目录公共驱动层../dm/在 SConscript 中通过SConscript(cwd /../dm/SConscript, ...)引入负责在进入 RT-Thread 内核前完成 UART 早期打印、内存memblock信息解析、PSCI 接口配置等底层初始化这也是启动日志中[I/rtdm.ofw]、[I/mm.memblock]、[I/osi.psci]各条日志的来源。4. 烧录与启动4.1 为板子烧录 U-Boot 相关镜像本文采用的引导方式是在 U-Boot 环境中使用命令加载并引导 RT-Thread Smart因此需要先为板子烧录 Linux 引导镜像。本文基于泰山派1 的 Rockchip Linux 5.10 SDKSDK 源码开源宿主机构建方式请参考泰山派1 官方文档SDK 编译完成后所需文件位于其rockdev/目录。首先使用瑞芯微开发工具将板子上的所有镜像全部擦除然后使用瑞芯微开发工具烧录以下 4 个文件MiniLoaderAll.binparameter.txtuboot.imgboot.img注意泰山派1 的 SDK 使用自定义分区布局因此需要上述 4 个文件其他板卡未经过测试分区与文件可能不同需要自行尝试。烧录完成后板子上的 U-Boot 即具备从 TF 卡加载rtthread.bin与 DTB 的能力。4.2 格式化 TF 卡准备一张 TF 卡用于存放 RT-Thread 镜像与设备树文件。下载 Rufus 工具配置为适合本次启动的格式FAT 文件系统然后点击开始进行格式化图中配置仅为参考关键是 TF 卡需要格式化为 U-Boot 的fatload命令可以识别的 FAT 分区因为后续boot.scr中会使用fatload mmc 1:1从第一个分区加载文件。4.3 制作 boot.scr可以直接使用本 BSP 目录下已有的boot.scr也可以按下面的方法自己制作前面安装的u-boot-tools提供了mkimage命令。创建boot.cmd写入以下内容fatload mmc 1:1 0x480000 rtthread.bin; fatload mmc 1:1 0x8300000 tspi-rk3566-user-v10-linux.dtb; booti 0x480000 - 0x8300000;各条命令的作用命令作用fatload mmc 1:1 0x480000 rtthread.bin从 TF 卡mmc 1第一个分区:1读取rtthread.bin到内存0x480000地址fatload mmc 1:1 0x8300000 tspi-rk3566-user-v10-linux.dtb读取设备树文件到内存0x8300000地址booti 0x480000 - 0x8300000以 Image 格式启动0x480000处的内核-表示无 ramdisk0x8300000为 DTB 地址系统启动必须加载设备树文件 DTB。对于泰山派1DTB 文件位于 SDK 的kernel/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dtb其他板卡使用不同的 DTB 文件需按开发板选择。缺少正确的 DTB 时 RT-Thread 将无法启动详见常见问题与解决办法。运行以下命令生成boot.scrmkimage -C none -A arm -T script -d boot.cmd boot.scr参数含义-C none表示不压缩-A arm指定架构为 ARM64 位兼容-T script指定脚本类型-d指定输入与输出文件。4.4 复制文件到 TF 卡将下面三个文件复制到 TF 卡根目录boot.scrtspi-rk3566-user-v10-linux.dtbrtthread.bin至此TF 卡中已具备完整的启动三要素U-Boot 脚本、设备树、RT-Thread 内核镜像。4.5 连接串口并自动启动使用串口工具如 MobaXterm连接开发板调试串口选择正确的串口设备设置波特率为15000001.5Mbps。将 TF 卡插入板卡并上电。由于 TF 卡根目录存在boot.scrU-Boot 会自动扫描并执行该脚本从而自动引导 RT-Thread注意 1如果启动卡死在[I/rtdm.ofw] Console: uart0 (fiq-debugger)请参考常见问题与解决办法中的设备树排查方法。注意 2每次 RT-Thread 在 U-Boot 中引导失败后都应先完全断电再重新上电以清空内存中的残留状态。注意 3如果多次自动引导失败可以在 U-Boot 界面手动执行boot.cmd中的内容进行手动引导若仍失败则需要排查 TF 卡质量、文件是否损坏等其他因素。4.6 完整启动日志解读正常启动时串口输出如下节选Hit key to stop autoboot(CTRLC): 0 switch to partitions #0, OK mmc1 is current device Scanning mmc 1:1... Found U-Boot script /boot.scr reading /boot.scr 197 bytes read in 3 ms (63.5 KiB/s) ## Executing script at 00c00000 reading rtthread.bin 1220848 bytes read in 104 ms (11.2 MiB/s) reading tspi-rk3566-user-v10-linux.dtb 167469 bytes read in 17 ms (9.4 MiB/s) Fdt Ramdisk skip relocation No misc partition ## Flattened Device Tree blob at 0x08300000 Booting using the fdt blob at 0x08300000 Using Device Tree in place at 0000000008300000, end 000000000832be2c ... ## reserved-memory: drm-logo00000000: addr7df00000 sizead000 drm-cubic-lut00000000: addr7ff00000 size8000 ramoops110000: addr110000 sizef0000 Adding bank: 0x00200000 - 0x08400000 (size: 0x08200000) Adding bank: 0x09400000 - 0x80000000 (size: 0x76c00000) board seed: Pseudo Total: 600.154/648.331 ms Starting kernel ... [I/rtdm.ofw] Booting RT-Thread on physical CPU 0x0 [I/rtdm.ofw] Machine model: lckfb tspi V10 Board [I/rtdm.ofw] Earlycon: uart8250 at MMIO/PIO 0x00000000fe660000 (options ) [I/rtdm.ofw] Memory node(1) ranges: 0x0000000000200000 - 0x0000000008400000 [I/rtdm.ofw] Memory node(1) ranges: 0x0000000009400000 - 0x0000000080000000 [I/mm.memblock] System memory: [I/mm.memblock] [0x0000000000200000, 0x0000000008400000] [I/mm.memblock] [0x0000000009400000, 0x0000000080000000] [I/mm.memblock] Reserved memory: ... [I/mm.memblock] 2055 MB memory installed to system page [I/osi.psci] Using PSCI v1.1 Function IDs [I/clk.rk3568] set cpu_freq to 1800000000 [I/rtdm.ofw] Console: uart0 (fiq-debugger) \ | / - RT - Thread Smart Operating System / | \ 5.2.1 build Jul 30 2025 08:58:40 2006 - 2024 Copyright by RT-Thread team lwIP-2.1.2 initialized! [I/sal.skt] Socket Abstraction Layer initialize success. [I/utest] utest is initialize success. [I/utest] total utest testcase num: (5) [I/drivers.serial] Using /dev/ttyS0 as default console Press any key to stop init process startup ... 3 Press any key to stop init process startup ... 2 Press any key to stop init process startup ... 1 Starting init ... [E/DFS.fs] mount point (/proc) already mounted! [I/rtdm.mnt] File system initialization done Hi, this is RT-Thread!! msh /I/TC: Secondary CPU 1 initializing I/TC: Secondary CPU 1 switching to normal world boot ... [I/cpu.aa64] Call cpu 2 on success [I/cpu.aa64] Call cpu 3 on success msh /日志要点解读Machine model: lckfb tspi V10 BoardRT-Thread 从 DTB 中读到的机器型号说明 DTB 匹配正确Earlycon: uart8250 at MMIO/PIO 0x00000000fe660000与 README.md 中 RK3566 的 earlycon 地址一致说明调试串口初始化成功[I/mm.memblock] 2055 MB memory installed to system pageRT-Thread Smart 已将 DTB 描述的内存两块 bank纳入页管理[I/clk.rk3568] set cpu_freq to 1800000000CPU 主频配置为 1.8GHz与芯片规格一致5.2.1 build ...RT-Thread Smart 版本号[I/cpu.aa64] Call cpu 2/3 on success4 核SMP全部被拉起对应rtconfig.h中RT_CPUS_NR 4的配置出现个别串口输出交错乱行属于多核并发打印的正常现象不影响系统运行最终进入msh /命令行提示符系统启动完成。5. 常见问题与解决办法5.1 Could not find a valid device tree未加载.dtb设备树文件直接启动时会出现以下报错Hit key to stop autoboot(CTRLC): 0 INTERRUPT fatload mmc 1:1 0x480000 rtthread.bin reading rtthread.bin 1220848 bytes read in 104 ms (11.2 MiB/s) booti 0x480000 - 0x8300000 Fdt Ramdisk skip relocation No misc partition ERROR: Did not find a cmdline Flattened Device Tree Could not find a valid device tree 解决办法每次 RT-Thread 引导失败后将开发板完全断电再上电清空内存残留将 SDK 的kernel/arch/arm64/boot/dts/rockchip/目录中编译好的.dtb文件复制到 TF 卡在 U-Boot 中先用fatload将 DTB 加载到0x8300000地址再次执行启动命令booti 0x480000 - 0x8300000。5.2 卡在[I/rtdm.ofw] Console: uart0 (fiq-debugger)无法启动启动卡死在该行大概率与设备树配置有关。设备树中有一个关键节点必须正确配置chosen节点的bootargs以及fiq-debugger节点。这里给出泰山派1 的参考配置其 Debug 串口硬件为uart2m0chosen: chosen { bootargs earlyconuart8250,mmio32,0xfe660000 consolettyFIQ0; }; fiq-debugger { compatible rockchip,fiq-debugger; rockchip,serial-id 2; rockchip,wake-irq 0; /* If enable uart uses irq instead of fiq */ rockchip,irq-mode-enable 1; rockchip,baudrate 1500000; /* Only 115200 and 1500000 */ interrupts GIC_SPI 252 IRQ_TYPE_LEVEL_LOW; pinctrl-names default; pinctrl-0 uart2m0_xfer; status okay; };配置要点说明配置项说明bootargsearlyconuart8250,mmio32,0xfe660000指明早期控制台使用 uart8250、32 位 MMIO、基地址0xfe660000对应 RK3566 的 uart2m0consolettyFIQ0指定 FIQ 调试串口为系统控制台rockchip,serial-id 2指定调试串口为串口 2对应 uart2m0rockchip,baudrate 1500000调试串口波特率仅支持115200与1500000两种取值本文所有串口操作均使用1500000rockchip,irq-mode-enable 1使用 IRQ 模式而非 FIQ 模式处理串口中断interrupts GIC_SPI 252 IRQ_TYPE_LEVEL_LOW串口中断号与触发方式pinctrl-0 uart2m0_xfer引脚复用配置指定 uart2m0 的收发引脚chosen节点参数是启动成功的关键若earlycon的地址与你的调试串口硬件不一致RT-Thread 将无法完成控制台初始化从而卡死在Console: uart0 (fiq-debugger)。如果对配置不确定可以参照上面写法结合自己板卡的调试串口哪个 uart、基地址是多少修改0xfe660000、serial-id与pinctrl-0三项。6. 深入理解BSP 源码结构与启动链路从仓库源码结构可以进一步理解整个启动链路工具链与编译配置rtconfig.py 定义了ARCHaarch64、CPUcortex-a读取RTT_CC/RTT_EXEC_PATH/RTT_CC_PREFIX环境变量决定交叉工具链POST_ACTION在链接后自动生成rtthread.bin并输出md5sum可用于校验拷贝到 TF 卡后文件是否损坏。SoC 使能配置Kconfig 中SOC_RK3500自动select ARCH_ARMV8、ARCH_CPU_64BIT、ARCH_ARM_MMU、RT_USING_CACHE、RT_USING_COMPONENTS_INIT、RT_USING_USER_MAIN、RT_USING_STDC_ATOMIC等选项即 RK35 系列统一启用 AArch64 MMU 缓存 用户态入口的 Smart 特性。内核配置rtconfig.h 启用了RT_USING_SMART、RT_USING_SMP、RT_CPUS_NR 4四核、RT_TICK_PER_SECOND 1000等对应启动日志中 4 个 CPU 全部上线、msh用户态命令行正常出现的行为。板级初始化driver/board.c 的rt_hw_board_init()调用rt_hw_common_setup()该公共实现来自../dm/目录见 SConscript 中的variant_dirdm引入方式负责 earlycon、memblock 内存登记、PSCI、时钟等底层初始化是启动日志前半段的直接来源。引导方式本 BSP 不依赖烧录进板载 flash 的 RT-Thread 镜像而是通过 U-Boot 从 TF 卡fatload mmc 1:1加载rtthread.bin与 DTB 后booti启动。这与 README.md 中 Orange Pi CM4 的示例fatload mmc 1:1 0x480000 rtthread.bin;booti 0x480000 - 0x8300000思路一致区别在于泰山派1 需要额外加载 DTB 文件。7. 参考文档仓库内Taishanpi-RK3566_ZH.md本文依据的英文版板级支持包使用指南Taishanpi-RK3566_CN.md同一指南的中文版README.mdRK3500 BSP 原始文档包含 RK35 系列芯片支持矩阵、编译与通用运行方法README_ZH.mdRK3500 BSP 中文介绍rtconfig.py工具链、编译选项与rtthread.bin生成规则rtconfig.hSmart/SMP 内核配置KconfigSoC 使能与内核特性选择driver/board.c板级初始化入口。赞分享操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址https://gitcode.com/gh_mirrors/rt/rt-thread点击查看免费下载相关推荐RT-Thread Smart 在泰山派 RK3566 开发板上的移植与实战RK3500 BSP 编译、U-Boot 引导与设备树调试全解RT Thread Smart 在泰山派 RK3566 开发板上的移植与实战RK3500 BSP 编译、U Boot 引导与设备树调试全解 本文以 RT Th操作系统嵌入式物联网嵌入式OSRTOSRT-Thread 树莓派 3B32 位BSP 移植指南编译、烧录与四核 SMP 启动实战RT Thread 树莓派 3B32 位BSP 移植指南编译、烧录与四核 SMP 启动实战 树莓派 3B 采用四核 ARM Cortex A53ARMv操作系统嵌入式物联网嵌入式OSRTOSRT-Thread Smart 在 Allwinner D1RISC-V64上的移植指南环境搭建、编译与烧录验证RT Thread Smart 在 Allwinner D1RISC V64上的移植指南环境搭建、编译与烧录验证 全志 D1d1 allwinner n操作系统嵌入式物联网嵌入式OSRTOS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表