ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

RT-Thread 在 QEMU VExpress-A9 上的运行指南:BSP 编译、启动脚本、SD 卡文件系统与调试全解析

RT-Thread 在 QEMU VExpress-A9 上的运行指南:BSP 编译、启动脚本、SD 卡文件系统与调试全解析 操作系统嵌入式物联网嵌入式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 仓库中的bsp/qemu-vexpress-a9板级支持包BSP系统讲解如何在一台没有真实 ARM 开发板的 PC 上通过 QEMU 虚拟机编译、启动并调试 RT-Thread从 env / Linux 工具链的编译方式、六个 QEMU 启动脚本的参数含义到 RT-Studio 与命令行两种运行形态、SD 卡文件系统的自动挂载与格式化机制再到该 BSP 支持的 UART、SDIO、CLCD、键盘鼠标与以太网外设。读完本文你可以在 Windows 或 Linux 上一键跑起带 msh 控制台、文件系统和网络栈的 RT-Thread并掌握 QEMU 与源码级的排查手段。1 BSP 概览用 QEMU 模拟一块“并不存在”的 ARM 开发板1.1 Versatile Express 与 QEMU 的软件模拟特性Versatile ExpressVExpress是 ARM Ltd 提供的一套开发环境硬件上由 uATX 主板和 CoreTile Express A9x4 子板组成面向 Cortex-A9 四核处理器。其核心是一套基于 FPGA 的开发环境——Cortex-A 芯片的逻辑本身就是 FPGA 上的硬件逻辑因此并不存在一颗真实的对应芯片。QEMU/VExpress-A9 则是 QEMU 模拟器针对 ARM VExpress-A9 FPGA 开发板做的指令级软件虚拟机。因为是纯软件仿真它可以被配置成多种模式单核 Cortex-A9、多核 Cortex-A9乃至多核 Cortex-A15同时还能模拟出 VExpress FPGA 开发板上绝大多数外设。本 BSP 正是针对 QEMU/VExpress-A9 的一份移植。需要说明的是它从未在真实的 VExpress FPGA 开发板上运行过主要价值是为开发者提供便利用以使用、验证 RT-Thread 的各类功能对真实 FPGA 开发板的执行情况不做任何假设。当前 QEMU/VExpress-A9 对应的硬件特性如下| 硬件 | 描述 | | -- | -- | | CPU | ARM Cortex-A9单核 | | 主频 | NA | | Memory | 128MB0x60000000 - 0x68000000 |1.2 BSP 目录构成该 BSP 目录bsp/qemu-vexpress-a9自包含一套完整的 RT-Thread 工程骨架构建入口Kconfig、SConstruct、SConscript、rtconfig.py、rtconfig.h链接脚本link.lds普通模式与link_smart.lds应用层applications/main.c入口打印Hello RT-Thread!、applications/mnt.cSD 卡文件系统挂载、lcd_init.c与lvgl/示例驱动层drivers/下的 UART、SDIO、CLCD、键盘、鼠标、SMC911x 以太网、定时器等板级驱动六个 QEMU 启动脚本qemu.bat、qemu.sh、qemu-dbg.bat、qemu-dbg.sh、qemu-nographic.bat、qemu-nographic.sh文档与插图README.md 及figures/目录。2 编译env 与 Linux 工具链两条路径2.1 推荐方式env 工具 scons推荐使用 RT-Thread env 工具编译工程。在bsp/qemu-vexpress-a9目录中打开 env 环境Windows 下可右键该目录选择 “ConEmu Here” 打开运行scons -j4编译正确无误后目录下会产生rtthread.elf和rtthread.bin两个文件。QEMU 中一般使用 elf 方式运行所以只需rtthread.elf即可Windows 的qemu.bat使用rtthread.elfLinux 脚本则使用rtthread.bin。rtthread.bin由构建脚本在链接后通过 objcopy 自动生成见 rtconfig.py 中的POST_ACTION OBJCPY -O binary $TARGET rtthread.bin。2.2 工具链版本与 Linux 下的安装当前 BSP 测试使用的 RT-Thread Env 版本与 GCC 交叉编译工具链版本见figures/下的对应截图。如果在 Linux 下使用推荐直接用发行版包管理器安装arm-none-eabi工具链——rtconfig.py 中EXEC_PATH默认即为/usr/binEXEC_PATH os.getenv(RTT_EXEC_PATH) or r/usr/bin装好后无需额外配置。以 Debian/Ubuntu 为例sudo apt install gcc-arm-none-eabi libstdc-arm-none-eabi-newlib其中libstdc-arm-none-eabi-newlib提供链接阶段-lsupc所需的库rtconfig.py的LFLAGS中确实包含-lsupc -lgcc -static。也可以从 Arm GNU Toolchain 官方下载页获取预编译版本解压后用环境变量RTT_EXEC_PATH指向其bin目录即可无需改动配置文件。2.3 编译配置要点rtconfig.py 解读从源码结构看rtconfig.py 是本 BSP 的编译核心值得关注的要点架构声明ARCH arm、CPU cortex-a、CROSS_TOOL gcc、PLATFORM gcc交叉编译前缀PREFIX os.getenv(RTT_CC_PREFIX) or arm-none-eabi-即默认使用arm-none-eabi-gcc系列设备编译选项DEVICE -marcharmv7-a -mtunecortex-a7 -ftree-vectorize -ffast-math -funwind-tables -fno-strict-aliasing并配合软浮点-mfloat-abisoftfp -mfpuneon链接脚本LINK_SCRIPT link.lds链接时通过-T link.lds指定构建模式BUILD debug时追加-O0 -gdwarf-2便于 gdb 调试一个有趣的细节脚本每次构建前会根据宿主机 MAC 地址自动生成drivers/automac.h为模拟的网卡分配固定前缀的 MAC 地址AUTOMAC0..5这正是 QEMU 中 EMAC 驱动能稳定工作的前提之一。3 执行脚本六种启动方式与 QEMU 参数解读3.1 脚本清单bsp 目录下已提供如下执行脚本执行脚本文件运行平台备注qemu.batWindows普通模式启动运行qemu.shLinux同上qemu-dbg.batWindows调试模式启动运行qemu-dbg.shLinux同上qemu-nographic.batWindows以不带界面的模式启动运行qemu-nographic.shLinux同上3.2 脚本实际内容与参数含义对比四个 Linux/Windows 脚本的真实内容可以归纳出 QEMU 命令行参数的含义Windows 版与 Linux 版逻辑一致仅创建虚拟 SD 卡镜像的命令不同Windows 用qemu-img create -f raw sd.bin 64MLinux 用dd if/dev/zero ofsd.bin bs1024 count65536两者都是先保证存在一块 64MB 的 raw 磁盘镜像| 参数 | 含义 | | -- | -- | |-M vexpress-a9| 指定模拟的机器型号为 VExpress-A9 | |-smp cpus2| 以双核 SMP 模式启动qemu.sh / qemu.bat / qemu-dbg 系列使用 | |-kernel rtthread.bin/rtthread.elf| 指定内核镜像文件 | |-serial stdio| 将串口RT-Thread 控制台 uart0重定向到宿主标准输入输出 | |-nographic| 无图形界面的纯文本模式同样把串口接到 stdio | |-sd sd.bin| 挂载虚拟 SD 卡镜像 | |-S -s| 调试模式-S表示启动即暂停等待调试器-s表示在 tcp:1234 开放 gdbstub 端口 |例如 qemu-nographic.sh 的内容为if [ ! -f sd.bin ]; then dd if/dev/zero ofsd.bin bs1024 count65536 fi qemu-system-arm -M vexpress-a9 -smp cpus2 -kernel rtthread.bin -nographic -sd sd.binqemu-dbg.sh 则在末尾追加-S -s配合arm-none-eabi-gdb rtthread.elf即可在 QEMU 内进行断点调试。顺带说明虽然脚本用-smp cpus2启动但 rtconfig.h 中RT_CPUS_NR为 1即 RT-Thread 侧默认以单核配置编译README 硬件特性表也标注 CPU 为单核 Cortex-A9这一点在实际使用时无需特意修改。4 三种运行形态详解4.1 RT-Studio IDE 下运行推荐学习方式RT-Studio 方式简单易用被 README 推荐用于学习。流程为创建 QEMU 工程新建 RT-Thread 项目时选择“基于开发板”开发板选择 QEMU-VEXPRESS-A9创建完成后选中 qemu-a9 工程并编译工程调试工程程序会停在main函数开头处点击全速运行RT-Thread 即正常运行起来可在 msh 控制台交互。该流程的界面截图见bsp/qemu-vexpress-a9/figures/下的image-20220626125511399.png、image-20220626125644099.png、image-20220626125717698.png与image-20220626125837849.png。4.2 Windows ENV 下运行启动与退出启动 QEMU在 Windows 的 bsp 目录下打开 env敲入qemu.bat即可直接运行。该脚本默认把串口输出到 stdio即控制台所以执行后立刻能看到输出结果。默认情况下系统启动后会自动完成 SD 卡的检测与文件系统挂载注意默认情况下 SD 中不存在文件系统因此首次挂载会失败程序中检测到挂载失败后会自动执行mkfs对文件系统进行格式化格式化完成后再次执行mount文件系统即挂载成功。挂载成功后可以验证文件系统读写是否正常例如ls查看根目录、echo写文件、cat读文件文件系统的这套“自动格式化重挂载”逻辑并非魔法而是写在 applications/mnt.c 中并通过INIT_ENV_EXPORT(mnt_init)在环境初始化阶段自动执行它先尝试dfs_mount(sd, /, elm, 0, 0)失败后调用dfs_mkfs(elm, sd)格式化再重新挂载。这也解释了为何首次运行空 SD 镜像与后续运行已有 FAT 文件系统的日志不同。当然也可以尝试使用其他两个.bat文件qemu-nographic.bat、qemu-dbg.bat启动运行。退出 QEMU在 msh 提示输入的状态下按下CTRLC出现以下提示后按下y即可退出 QEMUhello rt-thread msh / msh / msh /Terminate batch job (Y/N)? y4.3 Windows VSCode 中运行该方式可参考 RT-Thread 官方文档《使用 VS Code 开发 RT-Thread》对应 QEMU/VSCode 应用笔记其核心思路是用 VS Code 打开 bsp 目录借助 env 的编译环境执行 scons再通过 Cortex-Debug 等插件连接qemu-dbg.bat开放的 gdbstub 端口进行编译、下载与调试一体化开发。4.4 Linux 下运行安装 QEMU 与启动安装 qemu-system-armLinux 下与 Windows 稍有区别Windows 的 env 工具自带qemu-system-arm而 Linux 默认没有该工具直接执行./qemu.sh会报错bsp/qemu-vexpress-a9$ ./qemu-nographic.sh ./qemu-nographic.sh: line 5: /usr/bin/qemu-system-arm: No such file or directory此时需要在 Linux 平台安装qemu-system-arm工具包以 Ubuntu 为例bsp/qemu-vexpress-a9$ sudo apt-get install qemu-system-arm安装成功后输入以下命令应能看到版本信息证明其可正常使用bsp/qemu-vexpress-a9$ qemu-system-arm --version QEMU emulator version 4.2.1 (Debian 1:4.2-3ubuntu6.17) Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers启动 QEMULinux 平台一般是不带界面的服务器所以推荐用qemu-nographic.sh启动运行示例输出如下bsp/qemu-vexpress-a9$ ./qemu-nographic.sh WARNING: Image format was not specified for sd.bin and probing guessed raw. Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted. Specify the raw format explicitly to remove the restrictions. ALSA lib confmisc.c:767:(parse_card) cannot find card 0 ... audio: Failed to create voice lm4549.out \ | / - RT - Thread Operating System / | \ 4.1.0 build Nov 24 2021 19:49:17 2006 - 2021 Copyright by rt-thread team lwIP-2.1.2 initialized! [I/sal.skt] Socket Abstraction Layer initialize success. [I/SDIO] SD card capacity 65536 KB. [I/SDIO] switching card to high speed failed! [W/POSIX.delay] Please consider implementing rt_hw_us_delay() in another file. hello rt-thread msh / msh / msh /注意前面的错误信息可以忽略——包括 sd.bin 未声明 raw 格式的告警、ALSA 声卡初始化失败服务器无音频设备所致等。只要能看到 RT-Thread 的启动 logo 输出且 msh 能正常输入输出即可进行代码调试。同时从日志可见网络栈lwIP-2.1.2 SAL Socket Abstraction Layer与 SDIO 子系统均已随系统初始化印证了该 BSP 对外设的完整模拟能力。退出 QEMULinux 下退出方式与 Windows 不同在 msh 提示输入的状态下按下CTRLA再按下X即可退出 QEMUhello rt-thread msh / msh / msh /QEMU: Terminated5 支持的外设驱动一览该 BSP 的驱动支持情况如下驱动支持情况备注UART支持UART0/1SD/MMC支持CLCD支持Key支持Mouse支持EMAC支持对照drivers/目录的源码可以逐项找到实现对应UARTdrv_uart.c /drv_uart_v2.crtconfig.h 中BSP_USING_UART0已默认使能且RT_CONSOLE_DEVICE_NAME指定为uart0即控制台走 UART0SD/MMCdrv_sdio.c配合RT_USING_SDIO与文件系统栈RT_USING_DFS_ELMFATelm-FAT实现 SD 卡块设备与 FAT 文件系统CLCDdrv_clcd.c配套rt_lcd.h与applications/lcd_init.cQEMU 中以图形窗口呈现Key / Mousedrv_keyboard.c、drv_mouse.c模拟开发板键盘与鼠标输入EMACdrv_smc911x.c对应 VExpress 板载 SMSC LAN911x 以太网控制器配合上文提到的自动生成 MAC 地址的automac.h使用定时器drv_timer.c多核辅助secondary_cpu.c。6 运行常见现象与注意事项首次启动 SD 卡挂载失败属正常空sd.bin上没有 FAT 文件系统mnt.c会自动执行mkfs格式化后再次挂载格式化后文件系统即可正常读写见第 4.2 节。switching card to high speed failed!与POSIX.delay警告可忽略前者是模拟器对 SD 高速模式的限制后者提示rt_hw_us_delay()未实现均不影响 msh 与文件系统的正常使用。图形界面可选qemu-nographic系列以纯文本方式运行适合服务器/SSH 环境qemu.bat/qemu.sh会同时打开 VExpress 的图形显示窗口若未初始化显示窗口内会提示 “Guest has not initialized the display (yet)”。调试端口qemu-dbg系列通过-S -s在 tcp:1234 提供 gdbstub可用arm-none-eabi-gdb连接后设置断点、查看寄存器与内存配合 debug 模式编译-O0 -gdwarf-2体验最佳。7 联系人信息本 BSP 的维护人为 bernard 与 recan-li相关驱动与脚本问题可在 RT-Thread 社区按此信息查找维护人沟通。综上bsp/qemu-vexpress-a9是一份开箱即用的“模拟开发板”BSP一条scons -j4命令完成编译一个qemu.bat/qemu-nographic.sh命令完成启动msh 控制台、SD 卡 FAT 文件系统、网络栈与 CLCD 图形界面全部可用。无论你手上有没有真实硬件都可以借助它快速验证 RT-Thread 内核机制、设备驱动框架乃至 GUI 应用。赞分享操作系统嵌入式物联网嵌入式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 on Core-V-MCU (CV32E40P) BSP 实战指南QEMU 仿真、编译运行与 IDE 调试RT Thread on Core V MCU CV32E40P BSP 实战指南QEMU 仿真、编译运行与 IDE 调试 本指南以 RT Thread 仓库操作系统嵌入式物联网嵌入式OSRTOSRT-Thread RSK-RZN2L BSP 实战在瑞萨 RZ/N2LCortex-R52评估板上编译、运行与配置 RT-ThreadRT Thread RSK RZN2L BSP 实战在瑞萨 RZ/N2LCortex R52评估板上编译、运行与配置 RT Thread 本文围绕 RT操作系统嵌入式物联网嵌入式OSRTOSRT-Thread 在 HPM6P00EVK 上的 BSP 快速上手指南环境搭建、编译烧录与调试RT Thread 在 HPM6P00EVK 上的 BSP 快速上手指南环境搭建、编译烧录与调试 本篇技术指南以 RT Thread 仓库中 hpm6p00e操作系统嵌入式物联网嵌入式OSRTOS上一篇函数调用新方式DreamBerd的括号无关语法实践下一篇突破内存限制Laravel-Excel 分块写入与流式导出实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表