- 操作系统
- 嵌入式
- 物联网
- 嵌入式OS
- RTOS
【免费下载链接】rt-thread
RT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/
本文基于 RT-Thread 仓库中 RK3500 BSP 使用文档 展开,系统讲解如何在 ARMv8/AArch64 架构的瑞芯微 RK35xx 系列 SoC(RK3566/RK3568/RK3576 等)上,使用 RT-Thread Smart 专用工具链完成 RT-Thread 的下载、编译与启动。读完后你将掌握:BSP 支持矩阵与 earlycon 调试串口配置、RTT_CC/RTT_EXEC_PATH/RTT_CC_PREFIX环境变量的作用、scons --menuconfig+ 软件包拉取的完整编译流程,以及通过 U-Bootfatload/booti命令从 SD 卡引导rtthread.bin的实操步骤与启动日志解读。
1. 支持芯片列表与调试串口(Earlycon)配置
RK3500 BSP 位于 bsp/rockchip/rk3500 目录,其 Kconfig 中定义了目标架构选型,默认启用以下关键选项(见 Kconfig):
config SOC_RK3500 bool select ARCH_ARMV8 select ARCH_CPU_64BIT select ARCH_ARM_MMU select RT_USING_CACHE select RT_USING_COMPONENTS_INIT select RT_USING_USER_MAIN select RT_USING_STDC_ATOMIC default y从源码结构看,该 BSP 面向 64 位 Cortex-A 大核、带 MMU 的 SoC 设计,并强制开启了缓存一致性支持(RT_USING_CACHE)、组件自动初始化(RT_USING_COMPONENTS_INIT)和用户态main入口(RT_USING_USER_MAIN),这些与后文启动日志中出现的msh />命令行及Hi, this is RT-Thread!!(来自 applications/main.c)一一对应。
BSP 文档给出的 SoC 支持矩阵如下(RK3562 与 RK3506 尚未支持):
| SoC | 支持情况 | Earlycon |
|---|---|---|
| RK3576 | 支持 | earlycon=uart8250,mmio32,0x2ad40000 |
| RK3588 | 支持 | earlycon=uart8250,mmio32,0xfeb50000 |
| RK3562 | - | - |
| RK3568J | 支持 | earlycon=uart8250,mmio32,0xfe660000 |
| RK3568 | 支持 | earlycon=uart8250,mmio32,0xfe660000 |
| RK3566 | 支持 | earlycon=uart8250,mmio32,0xfe660000 |
| RK3528 | 支持 | earlycon=uart8250,mmio32,0xff9f0000 |
| RK3506 | - | - |
表中earlycon参数指向各芯片上调试 UART 的物理基地址,例如 RK3566/RK3568/RK3568J 均为0xfe660000,RK3576 为0x2ad40000。这个值需要在设备树chosen.bootargs中配置,启动早期控制台由此输出,日志中即可看到[I/rtdm.ofw] Earlycon: uart8250 at MMIO/PIO 0x00000000fe660000。仓库中还有一份补充文档 Taishanpi-RK3566_CN.md,详细给出了chosen节点与fiq-debugger节点的设备树写法示例(含rockchip,baudrate = <1500000>等参数),可作为设备树配置参照。
2. 编译环境:RT-Thread Smart 专用工具链
RK3500 BSP 使用 RT-Thread Smart 专用 AArch64 musl 工具链。工具链解析逻辑位于 rtconfig.py,关键实现如下:
ARCH ='aarch64' CPU ='cortex-a' CROSS_TOOL ='gcc' if os.getenv('RTT_CC'): CROSS_TOOL = os.getenv('RTT_CC') PLATFORM = 'gcc' EXEC_PATH = os.getenv('RTT_EXEC_PATH') or '/usr/bin' ... PREFIX = os.getenv('RTT_CC_PREFIX') or 'aarch64-none-elf-' CC = PREFIX + 'gcc'可以看到三个环境变量与源码的对应关系:
RTT_CC="gcc":决定交叉工具类别,对应CROSS_TOOL;RTT_EXEC_PATH:指向工具链bin目录,对应EXEC_PATH;RTT_CC_PREFIX:交叉编译器前缀(如aarch64-linux-musleabi-),拼接出gcc/ar/objcopy等工具全名,默认回退为aarch64-none-elf-。
此外,rtconfig.py 中针对 Cortex-A53/A72 大核固定了编译参数DEVICE = ' -g -mcpu=cortex-a53 -fdiagnostics-color=always',并以-nostartfiles、-u,system_vectors、-T link.lds方式链接,最终POST_ACTION生成rtthread.bin并打印 md5。
按文档操作,下载并解压工具链到/opt:
wget https://github.com/RT-Thread/rt-thread/releases/download/v5.2.0/aarch64-linux-musleabi_for_x86_64-pc-linux-gnu_242520-979be38cba.tar.bz2 sudo tar -xf aarch64-linux-musleabi_for_x86_64-pc-linux-gnu_242520-979be38cba.tar.bz2 -C /opt然后设置环境变量(可整体粘贴执行):
export RTT_CC="gcc" export RTT_EXEC_PATH="/opt/aarch64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/" export RTT_CC_PREFIX="aarch64-linux-musleabi-" export PATH="$RTT_EXEC_PATH:$PATH"3. 编译流程:menuconfig 配置、软件包拉取与 scons 构建
进入rt-thread/bsp/rockchip/rk3500目录后执行:
scons --menuconfig在菜单中选择并拉取 zlib 软件包(BSP 构建过程依赖该压缩库):
随后执行以下命令拉取软件包并编译:
source ~/.env/tools/scripts/pkgs --update scons编译入口是 SConscript:它遍历 BSP 目录子目录(applications、driver)收集源文件,并额外挂载上层../dm(Device Model)驱动目录:
objs = objs + SConscript(cwd + '/../dm/SConscript', variant_dir = 'dm', duplicate = 0)dm目录即瑞芯微系列 SoC 的公共设备驱动层,其 Kconfig 中声明了 ADC、音频、CAN、时钟(clk)、DVFS、网口、显示帧缓冲、硬件加密、hwspinlock、硬件定时器、I2C、Mailbox、MFD、NVMEM、PCI、Phy、Pinctrl、PWM、Regulator、RTC、SDIO、SPI、热管理、UFS、看门狗等完整驱动模块。其中时钟驱动按芯片拆分为 clk-rk3528.c、clk-rk3568.c、clk-rk3576.c、clk-rk3588.c,与第 1 节的支持矩阵相互印证。BSP 自身的板级初始化 driver/board.c 只有三行,rt_hw_board_init直接调用rt_hw_common_setup完成通用初始化,体现了 BSP 精简、依赖 dm 驱动层的设计。
编译成功后,当前目录生成rtthread.elf与rtthread.bin镜像,供 SD 卡启动使用。
4. 运行:SD 卡引导与 U-Boot 命令行启动
不同板卡有不同的内核安装方法,文档推荐安装到 SD 卡,并以 Orange Pi Compute Module 4(RK3566)为例说明。
步骤 1:连接开发板串口。
打开串口工具,选择对应串口,设置波特率为1500000(与设备树fiq-debugger节点的rockchip,baudrate一致)。
步骤 2:将编译生成的rtthread.bin放置到 SD 卡(FAT 分区)中。
步骤 3:开发板上电,按ctrl + c中断自动引导,进入 U-Boot 命令行:
步骤 4:执行以下指令从 SD 卡加载镜像并启动 RT-Thread Smart 系统:
fatload mmc 1:1 0x480000 rtthread.bin;booti 0x480000 - 0x8300000命令含义:fatload从 SD 卡(mmc 1:1)FAT 分区读取rtthread.bin到内存地址0x480000;booti以0x480000为内核入口启动,第三个参数指定设备树 blob 位于0x8300000(即 U-Boot 自身加载时保留的 DTB 位置)。
注意:
booti要求内存中存在有效设备树。若未加载 DTB 会得到Could not find a valid device tree错误;Taishanpi-RK3566_CN.md 给出了完整排错过程——需将板卡对应的.dtb文件一并拷入 SD 卡,用fatload加载到0x8300000后再执行booti,且每次引导失败后应完全断电再上电清空内存。
启动日志解读:正常启动的输出节选及含义如下:
reading rtthread.bin 1188080 bytes read in 102 ms (11.1 MiB/s) Fdt Ramdisk skip relocation ## Flattened Device Tree blob at 0x08300000 Booting using the fdt blob at 0x08300000 ... == DO RELOCATE == Kernel from 0x00280000 to 0x00480000 Starting kernel ... [I/rtdm.ofw] Booting RT-Thread on physical CPU 0x0 [I/rtdm.ofw] Machine model: Rockchip RK3566 Orange Pi CM4 Board [I/rtdm.ofw] Earlycon: uart8250 at MMIO/PIO 0x00000000fe660000 (options '') [I/rtdm.ofw] Memory node(1) ranges: 0x0000000000200000 - 0x0000000008400000 [I/mm.memblock] 4191 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 Apr 28 2025 09:19:08 lwIP-2.1.2 initialized! [I/sal.skt] Socket Abstraction Layer initialize success. [I/drivers.serial] Using /dev/ttyS0 as default console Hi, this is RT-Thread!! I/TC: Secondary CPU 1 initializing [I/cpu.aa64] Call cpu 1 on success msh />各关键行的含义:
Machine model行确认 U-Boot 传递的设备树属于目标板卡(此例为 RK3566 Orange Pi CM4,说明该 BSP 被 RK356x 家族板卡共用);Earlycon: uart8250 at MMIO/PIO 0xfe660000表示第 1 节支持矩阵中的 earlycon 参数生效;[I/mm.memblock]段解析 DTB 的 memory 节点,扣除reserved-memory(ramoops、CMA 等保留区)后,最终4191 MB memory installed to system page表示约 4 GB 内存被装入系统页管理;[I/osi.psci] Using PSCI v1.1 Function IDs表明 SMP 通过 PSCI 固件接口实现,随后Secondary CPU 1/2/3 initializing ... Call cpu x on success即三个次核被逐个拉起,完成四核启动;[I/clk.rk3568] set cpu_freq to 1800000000来自 clk-rk3568.c 时钟驱动,将 CPU 频率设为 1.8 GHz;lwIP-2.1.2 initialized!与[I/sal.skt]表示网络协议栈和 Socket 抽象层就绪;- 最终停在
msh />提示符,可执行 shell 命令。
5. 小结
RK3500 BSP 是 RT-Thread Smart 面向瑞芯微 RK35 系列 AArch64 SoC 的板级支持包,其工程特点是:BSP 目录本身非常精简(板级初始化仅调用rt_hw_common_setup),驱动能力集中在上层 dm 设备模型目录中按 Kconfig 可选编译;编译侧通过RTT_CC/RTT_EXEC_PATH/RTT_CC_PREFIX三个环境变量与 rtconfig.py 解耦工具链路径;运行侧完全依托板载 U-Boot,用一条fatload; booti命令即可从 SD 卡引导rtthread.bin,并通过 earlycon/fiq-debugger 串口(1500000 波特率)获得从 U-Boot、设备树解析、内存管理到 SMP 拉核的完整启动日志,便于逐段验证系统状态。
- 操作系统
- 嵌入式
- 物联网
- 嵌入式OS
- RTOS
【免费下载链接】rt-thread
RT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/
相关推荐
Rockchip RK35xx(RK3500 BSP)上编译与启动 RT-Thread Smart 的完整实践
Rockchip RK35xx RK3500 BSP 上编译与启动 RT Thread Smart 的完整实践 本文围绕 Rockchip RK3500 BSP
操作系统嵌入式物联网嵌入式OSRTOSRT-Thread Rockchip RK3300 BSP:aarch64 工具链配置与 scons 完整构建指南
RT Thread Rockchip RK3300 BSP:aarch64 工具链配置与 scons 完整构建指南 本篇指南基于 RT Thread 仓库中的
操作系统嵌入式物联网嵌入式OSRTOSRT-Thread 瑞萨 RA 系列 BSP 制作实战:基于 FSP 与 Scons 构建可发布的板级支持包
RT Thread 瑞萨 RA 系列 BSP 制作实战:基于 FSP 与 Scons 构建可发布的板级支持包 本文以 RT Thread 仓库自带的《RA 系列
操作系统嵌入式物联网嵌入式OSRTOS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考