跳转至

使用 QEMU 运行 RT-Thread

摘要

本应用笔记描述了如何在 Window 及 Ubuntu 平台使用 QEMU 运行 RT-Thread qemu-vexpress-a9 BSP 工程。

本文的目的和结构

本文的目的和背景

嵌入式软件开发离不开开发板,在没有物理开发板的情况下,可以使用 QEMU 等类似的虚拟机来模拟开发板。QEMU 是一个支持跨平台虚拟化的虚拟机,它可以虚拟很多开发板。为了方便大家在没有开发板的情况下体验 RT-Thread,RT-Thread 提供了 QEMU 模拟的 ARM vexpress A9 开发板的板级支持包 (BSP)。 本文主要介绍在 Window 平台和 Ubuntu 平台使用 QEMU 运行 RT-Thread qemu-vexpress-a9 BSP 工程,并介绍了如何使用虚拟网卡连接 QEMU 到网络。

本文的结构

本文首先介绍 qemu-vexpress-a9 BSP 在 Window 平台的使用明细,然后介绍在 Ubuntu 平台的使用明细。

在 Window 平台使用 QEMU 运行 RT-Thread

准备工作

RT-Thread 提供的 QEMU 模拟的 ARM vexpress A9 开发板的板级支持包 (BSP) 位于 RT-Thread 源码 BSP 目录下的 qemu-vexpress-a9 文件夹,此 BSP 实现了 LCD、键盘、鼠标、SD 卡、以太网卡、串口等相关驱动,文件夹内容如下图所示。

qemu-vexpress-a9 文件夹

qemu-vexpress-a9 BSP 主要文件及目录描述如下所示:

文件 / 目录 描述
.vscode vscode 配置文件
applications 用户应用代码目录
cpu 芯片相关
drivers RT-Thread 提供的底层驱动
qemu.bat Windows 平台运行脚本文件
qemu.sh Linux 平台运行脚本文件
qemu-dbg.bat Windows 平台调试脚本文件
qemu-dbg.sh Linux 平台调试脚本文件
README.md BSP 说明文件
rtconfig.h BSP 配置头文件

编译和运行 RT-Thread

步骤一 使用 scons 命令编译工程

打开 Env 文件夹,双击 env.exe 文件打开 Env 控制台:

Env 文件夹

在 Env 控制台下切换目录,输入命令 cd D:\repository\rt-thread\bsp\qemu-vexpress-a9 切换到 RT-Thread 源码文件夹下的 qemu-vexpress-a9 BSP 根目录,然后输入 scons 命令编译工程,如果编译正确无误,会在 BSP 目录下生成 QEMU 下运行的 rtthread.elf 目标文件。

编译工程

步骤二 使用 qemu.bat 命令运行工程

编译完成后输入 qemu.bat 启动虚拟机及 BSP 工程,qemu.bat 是 Window 批处理文件,此文件位于 BSP 文件夹下,主要包括 QEMU 的执行指令,第一次运行工程会在 BSP 文件夹下创建一份空白的 sd.bin 文件,这是虚拟的 sd 卡,大小为 64M。Env 命令行界面显示 RT-Thread 系统启动过程中打印的初始化信息及版本号信息等,qemu 虚拟机也运行起来了。如下面图片所示:

运行工程

虚拟机

注意事项:若电脑安装有 360 安全卫士会有警告,请点击允许程序运行。

运行 RT-Thread Finsh 控制台

RT-Thread 支持 Finsh,用户可以在命令行模式使用命令操作。输入 help 或按 tab 键可以查看所有支持的命令。如下图所示,左边为命令,右边为命令描述。

查看 Finsh 命令

如下图所示,比如输入list_thread命令可以查看当前运行的线程,以及线程状态和堆栈大小等信息。输入list_timer可以查看定时器的状态。

查看系统线程情况

运行 RT-Thread 文件系统

输入 list_device 可以查看注册到系统的所有设备。如下面图片所示可以看到虚拟的 sd 卡 “sd0” 设备,接下来我们可以使用 mkfs sd0 命令格式化 sd 卡,执行该命令会将 sd 卡格式化成 FatFS 文件系统。FatFs 是专为小型嵌入式设备开发的一个兼容微软 fat 的文件系统,采用 ANSI C 编写,采用抽象的硬件 I/O 层以及提供持续的维护,因此具有良好的硬件无关性以及可移植性。

了解 FatFS 详细信息请点击链接:http://elm-chan.org/fsw/ff/00index_e.html

格式化 sd 卡

第一次格式化 sd 卡后文件系统不会马上装载上,第二次启动才会被正确装载。我们退出虚拟机,然后在 Env 命令行界面输入 qemu.bat 重新启动虚拟机及工程,输入 ls 命令可以看到新增了 Directory 目录,文件系统已经装载上,然后可以使用 RT-Thread 提供的其他命令体验文件系统

文件系统其他命令

运行 RT-Thread 网络

步骤一 安装和配置 TAP 网卡

1、下载 TAP 网卡 tap-windows-9.21.2.exe。下载好后双击安装程序,默认安装即可。

2、打开网络和共享中心更改适配器设置,将安装的虚拟网卡重命名为 tap,如下图所示:

tap_rename

方法A:右键当前能上网的网络连接(本文使用以太网),打开属性 -> 共享,选择家庭网络连接为 tap,点击确定完成设置,如下图所示:

tap_share_internet

方法B:也可以将一个能正常连接网络的物理网卡与 tap 进行桥接,桥接成功后会出现一个网桥。如下面图片所示:

tap_桥接

tap_桥接成功

注意事项: tap 网卡和 VMware 的虚拟网卡可能会冲突,如果出现无法开启网络共享,或者 ping 不通网络的情况,请在删除 VMware 虚拟网卡之后再尝试一次。

步骤二 修改 qemu.bat 脚本文件

打开 qemu-vexpress-a9 BSP 目录下的 qemu.bat 文件,在下图所示位置添加以下配置内容:

-net nic -net tap,ifname=tap

其中 ifname=tap 的意思是网卡的名称是 tap。

qemu_modify

步骤三 查看 IP 地址

输入 qemu.bat 命令运行工程,在 shell 中输入 ifconfig命令查看网络状态,正常获取到 IP 即表示网络驱动正常,配置工作完成,效果如下图所示:

ifconfig

注意事项

  • 当出现获取不到 IP 地址的情况时,先将以太网的共享关闭,然后再次打开即可。

  • 如果获取到的 IP 是 10.0.x,x,是因为没有为 QEMU 添加启动参数 -net nic -net tap,ifname=tap

  • 虚拟机刚开始运行的时候并不会立刻获取到 IP 地址,有时需要等待几秒钟才会获取到 IP。

  • 关闭虚拟机可以按 Ctrl + 'C' 来结束程序运行。

运行 RT-Thread Ping 工具

步骤一 下载网络工具软件包

1、在路径bsp\qemu-vexpress-a9下打开 Env 工具,执行 menuconfig,如下图所示:

Env_menuconfig

2、在 RT-Thread online packages->IoT - internet of things 页面打开 netutils: Networking utilities for RT-Thread 功能,如下图所示:

online_packages

3、进入 netutils: Networking utilities for RT-Thread 页面,打开 Enable Ping utility 功能,如下图所示:

enable_ping

4、保存并退出配置界面。如果没有开启 Env 自动更新软件包功能的话,需要输入 pkgs --update 更新软件包配置。更新完成后使用 scons 命令重新编译工程,如下图所示:

scons

5、编译完成之后运行 qemu.bat 文件,如下图所示:

qemu_bat

步骤二 运行 ping 工具

在 shell 中输入 ifconfig命令查看网络状态,正常获取到 IP 即表示网络驱动正常:

ifconfig

在 shell 中输入 ping www.rt-thread.com 可以看到 ping 通的返回结果, 表示网络配置成功,能够 ping 通,如下图所示:

ping

运行 RT-Thread GUI 引擎

步骤一 下载 GUI 引擎软件包

关掉 QEMU 虚拟机,回到 ENV 控制台,输入 menuconfig 命令进入配置界面:

menuconfig

进入 “RT-Thread oneline packages” → “system packages” → “RT-Thread GUI Engine” 子菜单,选中 “Enable GUI Engine” 和“Enable the example of GUI Engine”:

选择 GUI 示例

按‘→’键选中 “save” 保存配置,并按 “Exit” 键退出配置界面,回到命令行界面,输入 pkgs --update 下载 GUI 软件包及示例代码:

下载 GUI 软件包

步骤二 运行 GUI 引擎

软件包下载完成后输入 scons 重新编译工程:

scons 命令编译工程

编译完成后输入 qemu.bat 命令启动 QEMU 虚拟机及工程,可以看到 QEMU 虚拟的显示屏上显示了示例代码展示的图片、文字和图形信息:

虚拟屏 GUI 示例展示

在 Ubuntu 平台使用 QEMU 运行 RT-Thread

准备工作

  • 下载 RT-Thread 源码,使用命令:git clone https://github.com/RT-Thread/rt-thread.git

  • 安装 QEMU,使用命令:sudo apt-get install qemu

  • 安装 Scons,使用命令:sudo apt-get install scons

  • 安装编译器,使用 apt-get 命令安装的编译器版本太旧会导致编译报错,可依次使用如下命令下载安装新版本,下载链接和解压文件夹名因下载版本而异:

  • 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 ~/Downloads/ gcc-arm-none-eabi-6_2-2016q4-20161216-linux.tar.bz2

  • 安装 ncurses 库,使用命令:sudo apt-get install libncurses5-dev

编译器安装好以后需要修改 qemu-vexpress-a9 BSP 下面的 rtconfig.py 文件,修改对应路径为解压到 opt 目录下的编译器对应的 bin 目录,参考下图,目录名字因下载的编译器版本而异:

编译器路径修改

1、在 qemu-vexpress-a9 BSP 根目录输入 scons --menuconfig 开启配置界面,配置操作和 Window 平台一样:

menuconfig 配置界面

2、使用 scons --menuconfig 命令后会安装及初始化 Env 工具,并在 home 目录下面生成 “.env” 文件夹,此文件夹为隐藏文件夹,切换到 home 目录,使用 la 命令可查看所有目录和文件。env.sh 文件是需要执行的文件,它会配置好环境变量,让我们可以使用 pkgs 命令来更新软件包,输入 source ~/.env/env.sh 命令执行。若已经选择了在线软件包,就可以使用 pkgs --update 命令下载软件包到 BSP 目录下的 packages 文件夹里:

.env 文件夹

pkgs --update 命令下载软件包

编译和运行 RT-Thread

1、在 qemu-vexpress-a9 BSP 目录下输入 scons 命令编译工程:

scons 命令编译工程

2、输入 ls 命令查看 BSP 下面的文件明细,绿色显示的文件是有执行权限的文件,我们需要给 qemu.sh 文件新增执行权限,输入 chmod +x qemu.sh 命令:

qemu.sh 文件新增执行权限

3、输入 ./qemu.sh 命令执行脚本文件,这时候虚拟机便运行起来,如下图所示,命令行显示了 RT-Thread 操作系统启动过程所打印的相关信息,白色窗口为虚拟的 LCD 屏。

虚拟机运行界面

参考

常见问题

  • Env 工具的相关问题请参考 Env 工具使用手册的常用资料链接小节。
  • 编译工程提示 fatal error: rtgui/driver.h: No such file or directory
  • 解决方法:使用 menuconfig 使能 “Enable GUI Engine”后需要使用命令pkgs --update下载 GUI 软件包。

评论