☰
RT-Thread 树莓派 4B(Raspberry Pi 4)64 位 BSP 移植实战:编译、u-boot 网络加载与驱动支持解析
2026/9/25 7:21:45 网站建设 项目流程
  • 操作系统
  • 嵌入式
  • 物联网
  • 嵌入式OS
  • RTOS

【免费下载链接】rt-thread

RT-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
点击查看免费下载

树莓派 4B 是 RT-Thread 官方支持的 64 位 ARM 平台之一,本指南以bsp/raspberry-pi/raspi4-64板级支持包为对象,完整讲解如何用scons编译固件、通过串口(GPIO 14/15)观察输出、借助 u-boot + TFTP 将rtthread.bin加载到内存运行,并逐项解析该 BSP 已支持的 UART、SPI、SDIO、以太网、HDMI 等驱动及其rtconfig.h配置依据。读完本文,你将掌握从零开始在该平台构建并启动 RT-Thread 的完整流程,并了解其 SMP 四核调度、内存布局与设备树(DTB)加载机制。

1. 平台概述:BCM2711 与树莓派 4B 的移植价值

树莓派 4B 的核心处理器为博通BCM2711,四核1.5GHz Cortex-A72架构(上一代树莓派 3 为四核 Cortex-A53),搭配LPDDR4 内存,供电方式为5V/3A USB-C或GPIO 5V。外设方面引入了双频 Wi-Fi、蓝牙 5.0、千兆网卡、MIPI CSI 相机接口、双 USB 口以及 40 个扩展引脚。

该 BSP 是 RT-Thread 面向 Raspberry Pi 4 的一份移植,对应的 SoC 配置在 Kconfig 中通过config SOC_BCM2711声明,并自动选择ARCH_ARMV8(64 位 ARMv8 架构)、ARCH_CPU_64BIT、RT_USING_CACHE、RT_USING_STDC_ATOMIC以及RT_USING_COMPONENTS_INIT、RT_USING_USER_MAIN等内核选项,default y保证该配置随 BSP 默认生效。

由于树莓派价格便宜、使用者甚众,它是研究和运行 RT-Thread 的可选平台之一,尤其适合验证 RT-Thread 在真实 Cortex-A 多核 SoC 上的 SMP(对称多处理)能力——rtconfig.h 中显式定义了RT_USING_SMP与RT_CPUS_NR 4,对应四核启动。

2. 编译说明:用 scons 构建固件

推荐使用 env 工具(RT-Thread 官方开发环境),在控制台进入bsp/raspberry-pi/raspi4-64目录后运行:

scons

如果编译正确无误,会生成rtthread.elf与rtthread.bin两个文件。

从构建脚本 SConstruct 与 rtconfig.py 可以确认编译细节:

  • 工具链:ARCH = 'aarch64'、CPU = 'cortex-a',默认前缀aarch64-none-elf-(可用环境变量RTT_CC_PREFIX覆盖),交叉编译器路径默认为/opt/gcc-arm-8.3-2019.03-x86_64-aarch64-elf/bin/,亦可通过RTT_EXEC_PATH环境变量指定。
  • 编译选项:-march=armv8-a -mtune=cortex-a72,与 BCM2711 的 Cortex-A72 核心对应;BUILD = 'debug'时追加-O0 -ggdb,release 时为-O2。
  • 链接与后处理:LFLAGS使用-T link.lds链接脚本并生成rtthread.map、rtt.asm;POST_ACTION执行objcopy -O binary $TARGET rtthread.bin与size $TARGET,这正是rtthread.bin的来源。

环境变量RTT_ROOT、RTT_CC、RTT_EXEC_PATH、RTT_CC_PREFIX均可按需覆盖默认路径,便于接入自建的 aarch64 GCC 工具链。

3. 环境搭建与运行方式

3.1 串口连线与参数

当前版本使用树莓派GPIO 14(TXD)、GPIO 15(RXD)作为串口输出,接线图如下:

串口参数为115200 8N1,硬件与软件流控均为关闭状态。

串口的引脚复用是在驱动层完成的:drivers/board.c中的ttyAMA0_init函数(通过INIT_EXPORT(ttyAMA0_init, "1.3")在初始化阶段执行)会解析内核启动参数中的console=,当使用ttyAMA0控制台时,通过设备树节点/soc/gpio@7e200000下的uart0-gpio14配置节点,调用 pinctrl 的pin_ctrl_confs_apply将 PL011 UART 复用切换到 GPIO 14/15(代码注释说明 Pi4 默认设备树将 PL011 路由到 GPIO 32/33 蓝牙,因此头部 40 针的 UART 需要显式切回 GPIO 14/15)。

3.2 RTT 固件放入 SD 卡运行(暂不支持)

当前 BSP暂时不支持直接从 SD 卡启动固件,需要使用 u-boot 加载。

3.3 用 u-boot 加载 RTT 程序(TFTP 网络引导)

BSP 的tools目录下提供了 u-boot64.bin 与 config.txt 两个文件,将其替换 SD 卡中原有文件即可。SD 卡推荐使用树莓派官方 imager 工具制作。

config.txt 内容如下,是树莓派固件侧的启动配置:

enable_uart=1 kernel=u-boot64.bin #kernel=kernel7.img #kernel_address=0xc0000000 arm_64bit=1

其中enable_uart=1打开串口,kernel=u-boot64.bin指定启动 u-boot,arm_64bit=1通知固件以 64 位模式引导。

完整步骤如下:

1. 电脑上启动 TFTP 服务器

Windows 系统可安装 tftpd 搭建 TFTP 服务器,将目录指定到bsp/raspberry-pi/raspi4-64(即固件所在目录)。

2. 修改 u-boot 设置

在 u-boot 控制台输入下列命令:

setenv bootcmd "dhcp 0x208000 x.x.x.x:rtthread.bin;fdt addr ${fdt_addr};fdt set /chosen bootargs 'earlycon=uart8250,mmio32,0xfe215040 console=ttyAMA0 cma=8M coherent_pool=2M';booti 0x208000 - ${fdt_addr}" saveenv reset

其中x.x.x.x为 TFTP 服务器的 PC 端 IP 地址。该命令组合的含义为:先通过dhcp 0x208000从 TFTP 下载rtthread.bin到内存地址0x208000(该地址与 rtconfig.h 中的ARCH_TEXT_OFFSET 0x208000严格对应,是 64 位内核镜像的加载偏移),随后把 bootargs 写入设备树/chosen节点(指定 earlycon 串口、console=ttyAMA0、cma=8M与coherent_pool=2M),最后用booti以 Image 格式启动内核,并传入fdt_addr对应的设备树。

3. 链接脚本自动替换(无需手动处理)

链接脚本会在 python 脚本中自行替换,无需人工干预。

4. 插入网线

将网线插入,保证开发板与 TFTP 服务器处于同一网段的路由器上。上电后 u-boot 会自动从 TFTP 服务器获取固件并开始执行。

完成后可以看到串口输出信息:

\ | / - RT - Thread Operating System / | \ 5.0.0 build Mar 29 2023 10:56:23 2006 - 2022 Copyright by RT-Thread team lwIP-2.1.2 initialized! EMMC: assuming clock rate to be 100MHz [I/sal.skt] Socket Abstraction Layer initialize success. [I/utest] utest is initialize success. [I/utest] total utest testcase num: (0) [I/DBG] version is B1 [I/SDIO] SD card capacity 31166976 KB. found part[0], begin: 4194304, size: 256.0MB found part[1], begin: 272629760, size: 3.856GB file system initialization done! cpu 2 boot success cpu 1 boot success cpu 3 boot success msh />

该输出直观展示了 BSP 的完整启动链路:RT-Thread 5.0.0 内核、lwIP 2.1.2 协议栈、SAL Socket 抽象层、utest 测试框架、SDIO/SD 卡与文件系统初始化,以及cpu 2/1/3 boot success的 SMP 从核启动信息,最终进入msh />命令行。

3.4 补充:QEMU 快速验证方式

除真机外,BSP 还附带 qemu.py 脚本,可基于qemu-system-aarch64 -M raspi4b -m 2G在模拟环境中运行(脚本会先用设备树编译工具把../dm/dts/bcm2711-rpi-4-b.dts编译为 dtb,再以-kernel rtthread.bin加载,bootargs 使用console=ttyAMA0 earlycon=pl011,0xfe201000 cma=8M coherent_pool=2M)。运行python qemu.py即可体验,支持-debug(-S -s等待 GDB 连接)与-graphic(挂载 USB 鼠标键盘)参数,适合没有硬件时先验证构建产物。

4. 驱动支持情况

该 BSP 的驱动支持情况汇总如下:

驱动支持情况备注
UART支持UART0, UART2, UART3, UART4, UART5
GPIO支持-
SPI支持SPI0
MAILBOX支持-
WATCHDOG支持-
HDMI支持-
SDIO支持-
ETH支持-

这些支持项在 rtconfig.h 中均有对应开关,可交叉印证:

  • 串口:RT_USING_SERIAL、RT_SERIAL_PL011(PL011 串口控制器)与RT_SERIAL_8250、RT_SERIAL_8250_BCM2835AUX(BCM2835 辅助 UART,即 mini UART),RT_CONSOLE_DEVICE_NAME "uart0"指定控制台设备;
  • GPIO / 引脚控制:RT_USING_PIN、RT_PIN_BCM_VIRT、RT_PIN_BRCMSTB、RT_PIN_RASPBERRYPI_EXP,配合RT_USING_PINCTRL、RT_PINCTRL_BCM2835完成引脚复用;
  • SPI:RT_USING_SPI、RT_SPI_BCM2835、RT_SPI_BCM2835AUX;
  • MAILBOX:RT_USING_MBOX、RT_MBOX_BCM2835(树莓派固件 mailbox 通道,广泛用于图形、温度等固件查询);
  • 看门狗:RT_USING_WDT、RT_WDT_BCM2835;
  • HDMI / 显示:RT_USING_GRAPHIC、RT_GRAPHIC_FB_BCM2708、RT_GRAPHIC_BACKLIGHT_RPI、RT_GRAPHIC_LOGO_RASPI_CLUT224(启动 logo 图片路径为../dm/graphic/logo/logo-raspi-clut224.ppm);
  • SDIO / 存储:RT_USING_SDIO、RT_USING_SDHCI、RT_SDIO_SDHCI_BRCMSTB、RT_MMCSD_MAX_PARTITION 16,配合RT_USING_DFS_ELMFAT(FAT 文件系统)与分区表支持RT_BLK_PARTITION_DFS、RT_BLK_PARTITION_EFI;
  • 以太网:RT_USING_ETHERNET、RT_ETHERNET_BCMGENET(BCM2711 千兆网卡 GENET 控制器)、RT_PHY_MDIO_BCM_UNIMAC、RT_PHY_BCM54213(BCM54213 千兆 PHY),协议栈使用RT_USING_LWIP212(lwIP 2.1.2)并通过 SAL 抽象层接入,静态 IPv4 默认配置为RT_LWIP_IPADDR "192.168.137.100"、网关192.168.137.1、掩码255.255.255.0;
  • 其他外设:I2C(RT_I2C_BCM2835)、RTC、PWM、DMA、硬件加密(RT_HWCRYPTO_BCM2835)、PCIe(RT_PCIE_BRCMSTB,对应树莓派 4 的 PCIe 接口)、热管理(RT_THERMAL_BCM2711)、DVFS 调频(RT_DVFS_RASPBERRY_CPUFREQ)、中断控制器(RT_PIC_ARM_GIC+RT_PIC_BCM2835_INTC)等。

各驱动源码位于 BSP 共享的设备模型目录bsp/raspberry-pi/dm下,按serial/、spi/、sdio/、ethernet/、mailbox/、watchdog/、pinctrl/、thermal/、pwm/、clk/等子目录组织,并统一由 SConscript 通过SConscript(cwd + '/../dm/SConscript', ...)引入构建。

5. 注意事项:内存与堆栈配置

目前 RT-Thread 程序可使用的内存在100MB 以内。可以通过调整 drivers/board.c 中platform_mem_desc表的数据进行相关内存映射,以及修改 drivers/board.h 来确定程序使用的堆栈大小。相关内核级配置参考 rtconfig.h 中的ARCH_HEAP_SIZE 0x4000000(64MB 堆)、IDLE_THREAD_STACK_SIZE 8192、SYSTEM_THREAD_STACK_SIZE 8192、RT_MAIN_THREAD_STACK_SIZE 16384等宏。

此外,board.c的rt_hw_board_init通过调用rt_hw_common_setup()完成 MMU、设备树解析等公共初始化;其中注释掉的rt_hw_noncacheable_map展示了如何通过rt_hw_mmu_control将一段内存标记为非缓存区域(MMU_CNTL_NONCACHE),需要做 DMA 一致性处理时可以参考这一模式恢复启用。

6. 联系人信息

该 BSP 的维护人为 bernard。使用时如遇驱动适配、启动问题,可结合本节涉及的 rtconfig.h、board.c、config.txt 与 qemu.py 自行排查;树莓派 4B 以外的兄弟 BSP(如 raspi2、raspi3-32、raspi3-64、raspi4-32)也在同一目录下,可作为对比参考。

  • 操作系统
  • 嵌入式
  • 物联网
  • 嵌入式OS
  • RTOS

【免费下载链接】rt-thread

RT-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
点击查看免费下载

相关推荐

上一篇:高级应用指南:RustDesk API服务器的OAuth、LDAP和自定义命令
下一篇:PHP农历转换终极指南:快速实现公历农历互转

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询