☰
RT-Thread 在 QEMU(Ubuntu/Linux)上的快速上手:VExpress A9 虚拟开发板编译、运行与文件系统实战
2026/10/4 15:21:48 网站建设 项目流程
  • 操作系统
  • 嵌入式
  • 物联网
  • 嵌入式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
点击查看免费下载

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 编译

scons

SConstruct与各目录下的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)
driversRT-Thread 提供的底层驱动(UART、SDIO、CLCD、键盘、鼠标、以太网、定时器等)
qemu.batWindows 平台运行脚本
qemu.shLinux 平台运行脚本
qemu-dbg.batWindows 平台调试脚本
qemu-dbg.shLinux 平台调试脚本
README.mdBSP 说明文档
rtconfig.hBSP 配置文件(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

配置完成后先保存、再退出配置界面,然后按以下流程操作:

  1. 若勾选了软件包,执行pkgs --update下载对应软件包源码;
  2. 执行scons重新编译;
  3. 执行./qemu.sh运行 QEMU;
  4. 输入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/

项目地址:https://gitcode.com/gh_mirrors/rt/rt-thread
点击查看免费下载

相关推荐

上一篇:永久保存聊天记录只需 3 步:留痕(WeChatMsg)简单上手指南
下一篇:40分钟iPad降级教程:用 Legacy-iOS-Kit 把 iPad Air 1 刷回 iOS 10.3.3

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

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

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

立即咨询