资讯详情

资讯详情

RT-Thread 在 QEMU(Ubuntu/Linux)上的快速上手:VExpress A9 虚拟开发板编译、运行与文件系统实战

操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】rt-threadRT-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 | 128MB0x60000000 - 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各包的作用与注意点sconsRT-Thread 的构建工具负责解析 SConscript 构建脚本并调用编译器python3、python3-kconfiglibscons --menuconfig配置界面依赖 kconfiglib 解析 Kconfig注意不要改用pip install kconfiglib在较新的 Debian/Ubuntu 上 PEP 668 会将系统 Python 环境标记为 externally managed 而导致安装失败且包名python3-kconfiglib由章节 1 的 apt 命令提供gcc-arm-none-eabi、binutils-arm-none-eabiARM 交叉编译工具链与二进制工具libstdc-arm-none-eabi-newlib链接阶段必需。缺少它时构建会报cannot find -lsupc该报错不会直接提示缺失的包名。-lsupc正是 rtconfig.py 中链接选项LFLAGS的一部分gdb-multiarch多架构调试器配合qemu-dbg.sh做源码级调试qemu-system-armARM 系统模拟器本体libncurses-devmenuconfig 字符界面所需的 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 架构ARCHarm、CPUcortex-a编译标志为-marcharmv7-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/KconfigBSP 驱动菜单这正是 menuconfig 中各级菜单的来源。小技巧每次使用pkgs命令前都要source ~/.env/env.sh比较繁琐。可以把该命令追加到~/.bashrc末尾之后开新终端即可直接使用pkgs。4.5 编译sconsSConstruct与各目录下的SConscript构建脚本会被 scons 自动解析例如 bsp/qemu-vexpress-a9/SConscript 会递归引入applications、drivers子目录的构建脚本。编译成功后BSP 目录下会生成rtthread.elfQEMU 运行所需的 ELF 目标文件也可用于 gdb 调试rtthread.bin由构建脚本通过 objcopy 从 ELF 转换而来的二进制镜像QEMU 启动脚本实际加载的就是它rtthread.map链接映射文件可查看符号布局。5 QEMU BSP 目录结构介绍QEMU BSP 位于 RT-Thread 源码bsp目录下的qemu-vexpress-a9文件夹主要文件与目录如下文件/目录说明applications用户应用程序代码目录含 main.c、mnt.cdriversRT-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 卡上的 elmFatFS文件系统若挂载失败会自动执行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 ofsd.bin bs1024 count65536 fi qemu-system-arm --version qemu-system-arm -M vexpress-a9 -smp cpus2 -kernel rtthread.bin -serial stdio -sd sd.bin要点解读首次运行会创建一块64MB65536 x 1024 字节的虚拟 SD 卡sd.bin-M vexpress-a9选择 VExpress A9 机器型号-smp cpus2以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 提示符下按下CTRLA再按下X终端显示QEMU: Terminated即退出Linux 下的标准方式Windows 环境下则是按下CTRLC在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-armqemu包找不到较新发行版已拆分元包改用qemu-system-armpip install kconfiglib失败PEP 668使用系统包python3-kconfiglib不要用 pip 覆盖系统 Python 环境menuconfig 界面错乱终端尺寸需大于 80x24启动日志中有 ALSA 音频错误服务器环境无声卡所致不影响 RT-Thread 运行看到 RT-Thread 启动 logo 与msh /提示符即可正常调试文件系统未出现SD 卡首次格式化后需重启重新执行./qemu.sh才会加载文件系统。赞分享操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】rt-threadRT-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 VExpress-A9 上的运行指南BSP 编译、启动脚本、SD 卡文件系统与调试全解析RT Thread 在 QEMU VExpress A9 上的运行指南BSP 编译、启动脚本、SD 卡文件系统与调试全解析 本文围绕 RT Thread 仓库操作系统嵌入式物联网嵌入式OSRTOSWindows 平台使用 QEMU 快速体验 RT-Threadqemu-vexpress-a9 BSP 编译运行与文件系统实战指南Windows 平台使用 QEMU 快速体验 RT Threadqemu vexpress a9 BSP 编译运行与文件系统实战指南 嵌入式开发离不开开发板操作系统嵌入式物联网嵌入式OSRTOS在 QEMU 中模拟 Arm Versatile Express 开发板vexpress-a9 与 vexpress-a15 的配置、设备模型与 Linux 启动实战在 QEMU 中模拟 Arm Versatile Express 开发板vexpress a9 与 vexpress a15 的配置、设备模型与 Linux虚拟化硬件仿真上一篇永久保存聊天记录只需 3 步留痕WeChatMsg简单上手指南下一篇40分钟iPad降级教程用 Legacy-iOS-Kit 把 iPad Air 1 刷回 iOS 10.3.3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →