- 操作系统
- 嵌入式
- 物联网
- 嵌入式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 为没有实体开发板的开发者提供了基于 QEMU 模拟 ARM VExpress A9 开发板的板级支持包(BSP),本文以 Ubuntu/Linux 为例,完整讲解从依赖安装、源码获取、Env 环境配置、软件包管理、编译运行到 Finsh 控制台与虚拟 SD 卡文件系统操作的全流程。读完本文,你可以在纯软件环境下编译出 RT-Thread 镜像,用 QEMU 启动一个带 UART、SD 卡、以太网、LCD、键盘和鼠标驱动的多核虚拟开发板,并亲自验证线程、定时器、文件系统等内核功能。
1 为什么要用 QEMU 跑 RT-Thread
嵌入式软件开发离不开开发板,在没有物理开发板的场景下,可以用 QEMU 这类跨平台虚拟化虚拟机来模拟开发板。QEMU 可以虚拟化多种开发板,RT-Thread 针对 QEMU 模拟的ARM VExpress A9开发板提供了一套完整的 BSP,位于 bsp/qemu-vexpress-a9。
根据 bsp/qemu-vexpress-a9/README.md 的说明,Versatile Express 系统由 ARM Ltd 提供,作为 Cortex-A9 四核处理器的开发环境;QEMU/VExpress A9 是对该 FPGA 开发板进行软件模拟的指令级虚拟机,可配置为单核 Cortex-A9、多核 Cortex-A9 乃至多核 Cortex-A15 等模式,并模拟出板上大多数外设。这套 BSP 对应的模拟硬件特性如下:
| 硬件 | 描述 | | -- | -- | | CPU | ARM Cortex-A9(单核,QEMU 脚本默认以 2 核 SMP 启动) | | 主频 | NA | | Memory | 128MB(0x60000000 - 0x68000000) |
从 drivers/board.c 中的内存描述表可以看到,BSP 将0x10000000-0x50000000映射为设备内存(DEVICE_MEM),将0x60000000-0x70000000映射为普通内存(NORMAL_MEM),这正是 VExpress A9 平台的外设与内存布局。该 BSP 已实现 LCD、键盘、鼠标、SD 卡、以太网卡、串口等驱动,支持的驱动清单同样见 bsp/qemu-vexpress-a9/README.md。
2 安装依赖库
在终端中执行以下命令安装全部依赖:
sudo apt install git gcc scons python3 python3-kconfiglib \ gcc-arm-none-eabi binutils-arm-none-eabi libstdc++-arm-none-eabi-newlib \ gdb-multiarch qemu-system-arm libncurses-dev各包的作用与注意点:
scons:RT-Thread 的构建工具,负责解析 SConscript 构建脚本并调用编译器;python3、python3-kconfiglib:scons --menuconfig配置界面依赖 kconfiglib 解析 Kconfig(注意:不要改用pip install kconfiglib,在较新的 Debian/Ubuntu 上 PEP 668 会将系统 Python 环境标记为 externally managed 而导致安装失败,且包名python3-kconfiglib由章节 1 的 apt 命令提供);gcc-arm-none-eabi、binutils-arm-none-eabi:ARM 交叉编译工具链与二进制工具;libstdc++-arm-none-eabi-newlib:链接阶段必需。缺少它时构建会报cannot find -lsupc++,该报错不会直接提示缺失的包名。-lsupc++正是 rtconfig.py 中链接选项LFLAGS的一部分;gdb-multiarch:多架构调试器,配合qemu-dbg.sh做源码级调试;qemu-system-arm:ARM 系统模拟器本体;libncurses-dev:menuconfig 字符界面所需的 ncurses 库。
旧包名对照:较老的教程或发行版中包名有所不同,若提示包不存在,请对照下表:
旧包名 当前包名 原因 gdb-arm-none-eabigdb-multiarch自 Debian 11 / Ubuntu 22.04 起已移除 qemuqemu-system-armqemu元包已被拆分,只需安装 ARM 系统模拟器libncurses5-devlibncurses-devncurses5过渡包已被移除
提示:
qemu-system-arm也可以直接安装为sudo apt-get install qemu-system-arm,安装后用qemu-system-arm --version验证可用性。
3 获取 RT-Thread 源码
git clone https://github.com/RT-Thread/rt-thread.git克隆完成后,QEMU BSP 位于源码树中的rt-thread/bsp/qemu-vexpress-a9/目录。
3.1 手动安装 GCC 交叉编译器(可选)
以下步骤仅在系统 apt 提供的编译器版本过旧、导致编译出错时才需要,通常不需要执行:
# 下载并解压到 /opt 目录(文件名与解压目录名随版本变化) wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/6-2016q4/gcc-arm-none-eabi-6_2-2016q4-20161216-linux.tar.bz2 cd /opt sudo tar xf ~/gcc-arm-none-eabi-6_2-2016q4-20161216-linux.tar.bz2安装后需要修改 bsp/qemu-vexpress-a9/rtconfig.py 中的编译器路径。现代版本的rtconfig.py已经默认:
EXEC_PATH = os.getenv('RTT_EXEC_PATH') or r'/usr/bin'即优先读取环境变量RTT_EXEC_PATH,未设置时回退到/usr/bin。因此推荐两种做法:
- 使用发行版包管理器安装工具链(
sudo apt install gcc-arm-none-eabi libstdc++-arm-none-eabi-newlib),工具链即位于/usr/bin,无需任何配置; - 若使用 Arm 官方预编译工具链,设置环境变量
export RTT_EXEC_PATH=/opt/<你的工具链目录>/bin即可,无需改动仓库文件。
另外 rtconfig.py 中PREFIX = os.getenv('RTT_CC_PREFIX') or 'arm-none-eabi-',交叉编译前缀同样支持通过RTT_CC_PREFIX覆盖。该 BSP 采用 ARM Cortex-A 架构(ARCH='arm'、CPU='cortex-a'),编译标志为-march=armv7-a,产物为 ELF 格式,构建末尾通过objcopy自动生成 QEMU 启动所需的rtthread.bin(见 rtconfig.py)。
4 构建 QEMU 工程:环境配置
4.1 进入 BSP 目录
cd rt-thread/bsp/qemu-vexpress-a9/4.2 将 python 命令映射为 python3
先使用whereis确认本机 python3 的版本,例如输出为 python 3.9,然后执行(请务必先确认路径与版本号再操作):
sudo rm -rf /usr/bin/python3 sudo rm -rf /usr/bin/python sudo ln -s /usr/bin/python3.9 /usr/bin/python3 sudo ln -s /usr/bin/python3.9 /usr/bin/python提示:删除系统
python3再重建软链接属于有风险的系统级操作。若你的发行版默认已提供python3命令(现代 Ubuntu 基本都内置),可以跳过此步,直接验证python3 --version与scons --version可用即可。
4.3 初始化 Env 工具并进入配置界面
在bsp/qemu-vexpress-a9目录下执行:
scons --menuconfig首次执行该命令会安装并初始化 Env 工具,随后进入 BSP 配置界面。你可以在配置界面中完成内核组件、驱动和在线软件包的选择:
操作说明:
↑/↓键:上下浏览菜单项;Enter键:进入选中目录;Space键:选中/取消布尔变量;Esc Esc:退出当前目录。
注意:请确保终端尺寸大于 80x24 字符,否则 menuconfig 界面会显示异常。
4.4 配置 BSP 并获取软件包
source ~/.env/env.sh scons --menuconfig pkgs --update~/.env/env.sh是 Env 工具生成的环境脚本,执行它(source)后才能使用pkgs等命令;scons --menuconfig进入配置界面,此时可以勾选在线软件包;pkgs --update将勾选的软件包下载到 BSP 目录下的packages文件夹(需要已安装 git)。
以内核示例包中的semaphore sample(信号量示例)为例,在 menuconfig 中找到并勾选该包后保存退出,再执行pkgs --update即可拉取源码。配置项定义见 bsp/qemu-vexpress-a9/Kconfig:它依次引入 RT-Thread 根 Kconfig、packages/Kconfig(在线软件包菜单)以及drivers/Kconfig(BSP 驱动菜单),这正是 menuconfig 中各级菜单的来源。
小技巧:每次使用
pkgs命令前都要source ~/.env/env.sh,比较繁琐。可以把该命令追加到~/.bashrc末尾,之后开新终端即可直接使用pkgs。
4.5 编译
sconsSConstruct与各目录下的SConscript构建脚本会被 scons 自动解析(例如 bsp/qemu-vexpress-a9/SConscript 会递归引入applications、drivers子目录的构建脚本)。编译成功后,BSP 目录下会生成:
rtthread.elf:QEMU 运行所需的 ELF 目标文件(也可用于 gdb 调试);rtthread.bin:由构建脚本通过 objcopy 从 ELF 转换而来的二进制镜像,QEMU 启动脚本实际加载的就是它;rtthread.map:链接映射文件,可查看符号布局。
5 QEMU BSP 目录结构介绍
QEMU BSP 位于 RT-Thread 源码bsp目录下的qemu-vexpress-a9文件夹,主要文件与目录如下:
| 文件/目录 | 说明 |
|---|---|
| applications | 用户应用程序代码目录(含 main.c、mnt.c) |
| drivers | RT-Thread 提供的底层驱动(UART、SDIO、CLCD、键盘、鼠标、以太网、定时器等) |
| qemu.bat | Windows 平台运行脚本 |
| qemu.sh | Linux 平台运行脚本 |
| qemu-dbg.bat | Windows 平台调试脚本 |
| qemu-dbg.sh | Linux 平台调试脚本 |
| README.md | BSP 说明文档 |
| rtconfig.h | BSP 配置文件(menuconfig 生成的宏开关) |
| rtconfig.py | 构建工具链配置(架构、编译器路径、编译/链接选项) |
从 applications/main.c 可以看到入口程序非常简单:main()中通过rt_kprintf("Hello RT-Thread!\n")输出一行信息,真正系统初始化由 RT-Thread 的启动流程完成。另外 applications/mnt.c 通过INIT_ENV_EXPORT(mnt_init)在系统环境初始化阶段自动尝试挂载 SD 卡上的 elm(FatFS)文件系统;若挂载失败,会自动执行dfs_mkfs格式化再重新挂载——这正是首次启动时系统自动格式化 SD 卡的源码依据。
6 编译与运行
6.1 编译
scons编译正确无误后,BSP 目录生成rtthread.elf与rtthread.bin。
6.2 运行
./qemu.sh以 bsp/qemu-vexpress-a9/qemu.sh 为例,脚本内容如下:
if [ ! -f "sd.bin" ]; then dd if=/dev/zero of=sd.bin bs=1024 count=65536 fi qemu-system-arm --version qemu-system-arm -M vexpress-a9 -smp cpus=2 -kernel rtthread.bin -serial stdio -sd sd.bin要点解读:
- 首次运行会创建一块64MB(65536 x 1024 字节)的虚拟 SD 卡
sd.bin; -M vexpress-a9:选择 VExpress A9 机器型号;-smp cpus=2:以2 核 Cortex-A9 对称多处理(SMP)模式启动,对应 BSP 中RT_USING_SMP的配置;-kernel rtthread.bin:加载内核镜像;-serial stdio:把虚拟串口输出重定向到终端控制台,因此启动日志与 msh 命令交互都直接出现在当前终端;-sd sd.bin:挂载虚拟 SD 卡。
启动后终端会打印 RT-Thread 版本信息、lwIP 网络协议栈初始化、SDIO 卡容量识别等日志,并进入msh />命令行提示符:
6.3 其他运行/调试脚本
BSP 还提供了其他脚本(Linux 平台对应.sh版本):
| 脚本 | 说明 |
|---|---|
./qemu-nographic.sh | 无图形界面模式启动(适合无显示器的服务器),串口同样输出到 stdio |
./qemu-dbg.sh | 调试模式启动,追加-S -s参数:-S启动即暂停等待调试器,-s在 1234 端口开放 gdb 服务,可与gdb-multiarch rtthread.elf配合进行源码级调试 |
6.4 退出 QEMU
- 在 msh 提示符下按下CTRL+A,再按下X,终端显示
QEMU: Terminated即退出(Linux 下的标准方式); - Windows 环境下则是按下CTRL+C,在
Terminate batch job (Y/N)?提示后输入y退出。
7 使用 Finsh 控制台
RT-Thread 自带 Finsh 命令行组件,可在 msh 模式下用命令操作 RT-Thread。
- 输入
help或按下Tab键,列出所有支持的命令(左侧为命令名,右侧为命令描述); - 输入
list_thread:查看当前运行的线程、线程状态与栈大小; - 输入
list_timer:查看系统定时器状态; - 输入
list_device:查看系统中已注册的所有设备。
例如list_device输出中可以看到虚拟 SD 卡设备sd0,这是后续文件系统操作的前提。Finsh 组件的源码位于 components/finsh,命令表由各模块通过MSH_CMD_EXPORT等宏注册,这也是help能枚举出所有命令的机制。
8 体验虚拟 SD 卡文件系统
8.1 格式化 SD 卡
在 msh 下执行:
mkfs sd0该命令将虚拟 SD 卡格式化为FatFS文件系统。FatFS 是面向小型嵌入式设备、与微软 FAT 兼容的文件系统,使用 ANSI C 编写,通过抽象硬件 I/O 层实现,具备良好的可移植性。
8.2 二次启动加载文件系统
首次格式化后文件系统不会立即加载,需要退出虚拟机关机,再执行./qemu.sh重新启动。第二次启动后输入ls,可以看到根目录下已出现Directory目录,说明文件系统加载成功(对应的源码逻辑即 applications/mnt.c 中的挂载流程)。
之后即可体验 RT-Thread 提供的文件系统命令:
ls:显示文件与目录信息cd:切换指定目录rm:删除文件或目录echo:将指定内容写入目标文件cat:查看文件内容mkdir:创建文件夹
输入help可查看更多命令。文件系统组件位于 components/dfs,其中 FatFS 文件系统实现可在 components/dfs/filesystems 下找到(DFS 虚拟文件系统层 + elm-fatfs 具体实现)。
9 配置更多功能
QEMU 平台几乎支持配置 RT-Thread 的所有功能,只需再次进入配置界面:
scons --menuconfig配置完成后先保存、再退出配置界面,然后按以下流程操作:
- 若勾选了软件包,执行
pkgs --update下载对应软件包源码; - 执行
scons重新编译; - 执行
./qemu.sh运行 QEMU; - 输入
help查看 BSP 当前支持的所有命令并使用。
例如勾选内核示例包后,编译运行即可直接在 msh 下执行信号量、互斥量、消息队列等示例命令,验证 RT-Thread 的内核 IPC 机制。得益于 QEMU 的软件模拟特性,你可以反复修改 rtconfig.h 对应的 menuconfig 选项、重新编译运行,在不依赖任何物理硬件的情况下完成 RT-Thread 内核、驱动与组件的完整学习与验证。
10 常见问题排查
cannot find -lsupc++:缺少libstdc++-arm-none-eabi-newlib包,执行章节 2 的安装命令补齐即可;/usr/bin/qemu-system-arm: No such file or directory:未安装 QEMU ARM 模拟器,执行sudo apt-get install qemu-system-arm;qemu包找不到:较新发行版已拆分元包,改用qemu-system-arm;pip install kconfiglib失败(PEP 668):使用系统包python3-kconfiglib,不要用 pip 覆盖系统 Python 环境;- menuconfig 界面错乱:终端尺寸需大于 80x24;
- 启动日志中有 ALSA 音频错误:服务器环境无声卡所致,不影响 RT-Thread 运行,看到 RT-Thread 启动 logo 与
msh />提示符即可正常调试; - 文件系统未出现:SD 卡首次格式化后需重启(重新执行
./qemu.sh)才会加载文件系统。
- 操作系统
- 嵌入式
- 物联网
- 嵌入式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 在 QEMU VExpress-A9 上的运行指南:BSP 编译、启动脚本、SD 卡文件系统与调试全解析
RT Thread 在 QEMU VExpress A9 上的运行指南:BSP 编译、启动脚本、SD 卡文件系统与调试全解析 本文围绕 RT Thread 仓库
操作系统嵌入式物联网嵌入式OSRTOSWindows 平台使用 QEMU 快速体验 RT-Thread:qemu-vexpress-a9 BSP 编译运行与文件系统实战指南
Windows 平台使用 QEMU 快速体验 RT Thread:qemu vexpress a9 BSP 编译运行与文件系统实战指南 嵌入式开发离不开开发板,
操作系统嵌入式物联网嵌入式OSRTOS在 QEMU 中模拟 Arm Versatile Express 开发板:vexpress-a9 与 vexpress-a15 的配置、设备模型与 Linux 启动实战
在 QEMU 中模拟 Arm Versatile Express 开发板:vexpress a9 与 vexpress a15 的配置、设备模型与 Linux
虚拟化硬件仿真
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考