- 操作系统
- 嵌入式
- 物联网
- 嵌入式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 仓库中 bsp/raspberry-pico/RP2350 的官方 BSP 文档为核心,完整讲解如何在 Linux 环境下为树莓派 RP2350 芯片编译 RT-Thread 固件、通过 UF2 文件完成烧写,并结合仓库源码剖析其时钟、系统节拍、堆内存与串口控制台的初始化流程。读完本文,你将能够在基于 RP2350 的 Pico 开发板上快速跑起 RT-Thread 与 msh 命令行,并在此基础上按需裁剪外设驱动。
RP2350 与 BSP 概览
Raspberry RP2350 是树莓派推出的高性能微控制器芯片,该 BSP 面向搭载此芯片的开发板。根据 README 的产品介绍,其主要特性如下:
- 双核双架构设计:可选择 Arm Cortex-M33 或 Hazard3 RISC-V 内核,兼顾生态兼容与架构灵活性;
- 150MHz 主频,520KB RAM、2MB Flash,算力与存储资源足以承载 RT-Thread 完整内核、Shell 组件及多种外设驱动;
- 高度集成、超小尺寸:板卡尺寸仅 25 × 20.5mm,集成锂电池充电管理与电池电压监测,并引出 11 个 IO;
- 低功耗:休眠功耗仅 25uA(文档标称值),适合电池供电的物联网场景;
- 支持 C/C++ 与 MicroPython编程;
- 单面布局、半孔工艺,可直接用于贴片量产。
该 BSP 位于仓库bsp/raspberry-pico/RP2350目录,与同仓库的 RP2040 BSP 共用bsp/raspberry-pico/libraries/Drivers下的通用驱动实现(UART、GPIO、SPI、I2C、PWM、ADC、RTC、WDT 等),并额外引入raspberrypi-pico-rp2350-sdk软件包作为底层 SDK。
BSP 工程结构与关键文件
编译前先了解 BSP 的目录组织,便于后续按图索骥:
| 路径 | 作用 |
|---|---|
| applications/main.c | 应用入口,默认实现 LED 闪烁与 "Hello, RT-Thread!" 打印 |
| board/board.c | 板级初始化:堆、系统时钟、SysTick、串口与控制台 |
| board/board.h | 定义 SRAM 大小与堆区边界(HEAP_BEGIN / HEAP_END) |
| board/Kconfig | 外设驱动开关与引脚复用的菜单配置 |
| Kconfig | BSP 顶层配置入口,声明 SOC_RP2350 并关联 SDK 包 |
| SConstruct | scons 构建入口,自动进入 SDK 包目录完成子构建 |
| SConscript | 递归收集子目录中的 SConscript 参与构建 |
| rtconfig.h | 编译期配置(内核、组件、外设、引脚号) |
| rtconfig.py | 工具链与编译/链接参数,包含 UF2 生成步骤 |
| link.ld | 链接脚本 |
| tools/picotool | 官方 picotool 工具,用于 elf → uf2 转换及命令行烧写 |
编译环境准备(Linux)
文档明确注明:当前 BSP 需要在 Linux 环境下编译,测试环境为 Ubuntu 21,并建议 gcc 版本不低于 6.x。构建依赖 RT-Thread 的 menuconfig 配置系统与在线软件包管理器,因此需预先安装 scons、gcc、arm-none-eabi 工具链等基础环境。
Step 1:下载 SDK 软件包
在 BSP 目录(bsp/raspberry-pico/RP2350)下执行:
menuconfig pkgs --updatemenuconfig打开图形化配置界面,可在此调整内核选项与各外设驱动;pkgs --update会根据配置自动下载raspberrypi-pico-rp2350-sdk软件包。
该依赖关系在 Kconfig 中已声明:config SOC_RP2350会自动select PKG_USING_RASPBERRYPI_PICO_RP2350_SDK,并在 rtconfig.h 中体现为PKG_USING_RASPBERRYPI_PICO_RP2350_SDK与..._LATEST_VERSION两个宏。SDK 包下载后落在packages目录,构建时由 SConstruct 通过find_package_path定位并进入该目录执行子构建。
编译固件
Step 2:使用 scons 编译
scons -c sconsscons -c清理上一次的构建产物,避免残留对象文件造成链接错误;scons执行增量编译并链接。
工具链在 rtconfig.py 中定义:架构为arm、CPU 为cortex-m33,交叉编译器前缀为arm-none-eabi-,并带有-march=armv8-m.main+fp+dsp -mcpu=cortex-m33 -mthumb -mfloat-abi=softfp -mfpu=fpv5-sp-d16 -mcmse等针对 Cortex-M33 安全扩展(TrustZone)的编译选项。默认BUILD = 'debug',采用-O3 -gdwarf-2 -g优化与调试信息级别。
Step 3:生成 UF2 烧写文件
编译结束后,构建脚本会自动生成UF2 烧写文件。在 rtconfig.py 的POST_ACTION中可以看到完整流程:
POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' ... POST_ACTION += "{0} uf2 convert --quiet rtthread-pico.elf rtthread-pico.uf2 --family rp2350-arm-s --abs-block".format(elf2uf2_path)即:先用arm-none-eabi-objcopy将 ELF 转换为rtthread.bin并打印 size 信息,再调用 BSP 自带的tools/picotool执行uf2 convert,将rtthread-pico.elf转换为rtthread-pico.uf2。注意这里指定的 family 为rp2350-arm-s(ARM Secure 变体),与 rtconfig.h 中ARCH_ARM_CORTEX_SECURE(rtconfig.h)的配置相互呼应,即默认编译 ARM 安全态镜像。
最终产物为rtthread-pico.uf2文件,位于 BSP 根目录。
烧写方式(两种)
方式一:U 盘拖拽烧写(推荐)
- 按住开发板上的boot 按键,再短按重启按键,进入 U 盘烧写模式;
- 将 RP2350 板通过 USB 插入电脑,系统会识别出一个U 盘:
- 将编译生成的rtthread-pico.uf2文件复制到该 U 盘根目录;
- 固件写入完成后开发板自动重启运行,无需额外操作。
方式二:picotool 命令行烧写
进入 boot 模式后,也可以使用 BSP 附带的 picotool 工具执行烧写与重启:
picotool load rtthread-pico.uf2 picotool rebootpicotool load将 UF2 镜像加载到板载 Flash;picotool reboot触发开发板重启进入用户固件。
运行结果
烧写并重启后,通过串口终端(对应 UART0,默认波特率取决于 SDK 配置)可看到如下输出:
\ | / - RT - Thread Operating System / | \ 4.0.3 build Jan 28 2021 2006 - 2021 Copyright by rt-thread team Hello, RT-Thread! msh >其中:
- RT-Thread 版本横幅与版权信息由内核打印;
Hello, RT-Thread!来自 applications/main.c 的rt_kprintf;msh >表明 FinSH 命令行组件已启动,可以输入 RT-Thread 内置命令进行交互调试。
说明:横幅中显示的版本号 "4.0.3 build Jan 28 2021" 为 BSP 文档保留的示例输出,实际构建时版本信息以你当前仓库
RT_VER_NUM(rtconfig.h 中为 0x50300)及编译日期为准。
板级初始化源码解析
理解 BSP 的启动脉络,有助于后续自行裁剪。板级初始化集中在 board/board.c 的rt_hw_board_init():
void rt_hw_board_init() { #ifdef RT_USING_HEAP rt_system_heap_init(HEAP_BEGIN, HEAP_END); #endif set_sys_clock_khz(PLL_SYS_KHZ, true); alarm_pool_init_default(); systick_config(clock_get_hz(clk_sys) / RT_TICK_PER_SECOND); #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); #endif #ifdef RT_USING_SERIAL stdio_init_all(); rt_hw_uart_init(); #endif #ifdef RT_USING_CONSOLE rt_console_set_device(RT_CONSOLE_DEVICE_NAME); #endif }关键点逐项说明:
- 堆初始化:
rt_system_heap_init(HEAP_BEGIN, HEAP_END)将堆区交由内核动态内存管理。堆边界定义在 board/board.h:PICO_SRAM_SIZE为 520(KB),PICO_SRAM_END为0x20000000 + 520 * 1024,HEAP_BEGIN为链接脚本中的栈符号_sstack,即从栈顶到 SRAM 末尾的整段空间; - 系统时钟:
set_sys_clock_khz(PLL_SYS_KHZ, true)将系统主频配置为150 * 1000kHz(150MHz),PLL_SYS_KHZ定义于 board.c; - 系统节拍:
systick_config(clock_get_hz(clk_sys) / RT_TICK_PER_SECOND)用 Cortex-M33 的 SysTick 产生 RT-Thread 时基,RT_TICK_PER_SECOND默认 100(rtconfig.h),即 10ms 一个 tick。节拍中断服务函数SysTick_Handler(board.c)通过rt_interrupt_enter()/rt_tick_increase()/rt_interrupt_leave()驱动内核调度器; - 串口与控制台:
stdio_init_all()初始化 Pico SDK 标准 IO,rt_hw_uart_init()注册 UART 设备驱动,最后rt_console_set_device(RT_CONSOLE_DEVICE_NAME)将控制台设备设为"uart0"(rtconfig.h)。
默认应用:LED 闪烁示例
applications/main.c 是默认的用户主函数,演示了 RT-Thread PIN 设备 API 的基本用法:
#define LED_PIN 25 int main() { rt_kprintf("Hello, RT-Thread!\n"); rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); while (1) { rt_pin_write(LED_PIN, 1); rt_thread_mdelay(1000); rt_pin_write(LED_PIN, 0); rt_thread_mdelay(1000); } return 0; }rt_pin_mode/rt_pin_write来自 RT-Thread 统一 PIN 设备驱动框架,由BSP_USING_PIN(rtconfig.h)使能;- 板载 LED 接在 GP25(与 RP2040 BSP 一致),每 1 秒翻转一次电平,形成可观察的闪烁;
rt_thread_mdelay让出 CPU,体现 RT-Thread 的线程化时间管理。
外设支持与配置
README 给出当前 BSP 支持的外设总览:
| Drive | Support | Remark |
|---|---|---|
| UART | Support | UART0/1 |
| GPIO | Support | 0-29 |
默认rtconfig.h中已使能 UART0(TX=GP0、RX=GP1,见 rtconfig.h)与 GPIO。
在 board/Kconfig 中还可以开启更丰富的外设,均通过menuconfig图形界面勾选后重新scons生效:
- UART0 / UART1:支持多个引脚复用选择。UART0 的 TX 可选 GP0/12/16,RX 可选 GP1/13/17;UART1 的 TX 可选 GP4/8,RX 可选 GP5/9(board/Kconfig);
- SPI0 / SPI1:MOSI、MISO、SCK、CS 均提供多组引脚选择;
- 硬件 I2C0 / I2C1:SCL/SDA 提供多组引脚映射;
- PWM0 ~ PWM7:覆盖全部 8 组 PWM slice,A/B 通道引脚可选;
- ADC0/1/2:对应 GP26/27/28;
- WDT、RTC、片上 Flash(配合 FAL)等;
- 软件 I2C / 软件 SPI:
swi2c1、swspi0、swspi1,适合引脚受限场景。
此外,板级配置还预留了两类生态集成选项:
- BSP_USING_ARDUINO(board/Kconfig):启用 RTduino 兼容层,自动联动 UART1、GPIO、ADC、PWM、I2C、SPI 等驱动,并默认将 SPI/I2C 引脚切换为 Arduino 布局;
- BSP_USING_LVGL(board/Kconfig):为 LCD 屏接 LVGL 图形库,可附带官方 LVGL demo。
对应的驱动实现位于 bsp/raspberry-pico/libraries/Drivers(drv_uart.c、drv_gpio.c、drv_spi.c、drv_i2c.c、drv_pwm.c、drv_adc.c、drv_rtc.c、drv_wdt.c、drv_flash.c、drv_timer.c),RP2040 与 RP2350 两个 BSP 共享这套驱动层。
总结
通过本文,你可以完整走通 RT-Thread 在 Raspberry RP2350 上的开发闭环:menuconfig+pkgs --update拉取 SDK →scons编译生成rtthread-pico.uf2→ 进入 U 盘模式拖拽烧写或picotool命令行烧写 → 串口看到 RT-Thread 启动横幅与msh命令行。同时,board.c 的初始化顺序与 board/Kconfig 的外设裁剪方式,也为二次开发与驱动移植提供了清晰的参照。
- 操作系统
- 嵌入式
- 物联网
- 嵌入式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 Raspberry Pi 3-64 BSP 移植指南:环境搭建、镜像烧写与驱动支持详解
RT Thread Raspberry Pi 3 64 BSP 移植指南:环境搭建、镜像烧写与驱动支持详解 Raspberry Pi 3(树莓派 3)是价格亲民
操作系统嵌入式物联网嵌入式OSRTOSRT-Thread 在 MM32F103RB(MM32 MiniBoard)上的移植实战:BSP 上手、编译烧写与源码解析
RT Thread 在 MM32F103RB(MM32 MiniBoard)上的移植实战:BSP 上手、编译烧写与源码解析 本篇技术指南以 RT Thread
操作系统嵌入式物联网嵌入式OSRTOSRT-Thread Smart 在 Allwinner D1(RISC-V64)上的移植指南:环境搭建、编译与烧录验证
RT Thread Smart 在 Allwinner D1(RISC V64)上的移植指南:环境搭建、编译与烧录验证 全志 D1(d1 allwinner n
操作系统嵌入式物联网嵌入式OSRTOS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考