前言
随着芯片技术的发展,嵌入式已经不再是传统的单片机开发模式,需要一些硬件操作的板子,现在qemu这种模拟硬件的手段非常好,通过直接在电脑上仿真后,然后再移植到真实的设备上,这样大大减少了下载程序的时间,同时也方便问题的定位和分析,通过这种方式,进行业务逻辑层的开发更加的高效合理。本文主要介绍在qemu上搭建树莓派3b的开发环境。
准备条件:
Ubuntu16.04
下面的实验步骤在Ubuntu16.04上进行,尽量保证环境的一致性。
01
代码编译
对于一个环境,我们往往需要进行源代码工程的构建,所以现在我们选择的是rt-thread操作系统进行相关的开发工作。
1.1 工具链的准备
推荐采用gcc-arm-8.3-2019.03-x86_64-aarch64-elf进行源代码的编译,由于官方下载速度非常慢,所以我放到网盘上提供下载。
链接: https://pan.baidu.com/s/1ZAba3xbhad-BnimCo5VDGA
提取码: a6t5
解压到opt目录下。
1.2 编译rtt工程
在github上的rt-thread上进行下载
git clone git@github.com:RT-Thread/rt-thread.git
切换到rt-thread/bsp/raspberry-pi/raspi3-64目录,输入scons开始编译
最后生成kernel8.img文件就是可执行文件。
02
qemu的安装
直接通过Ubuntu进行sudo apt-get install qemu安装的qemu版本较低,不支持arrch64体系架构,所以我们需要去下载安装最新版本的qemu,到官网上下载即可。
下载完成后解压文件。
或者从github中clone代码
git clone git@github.com:qemu/qemu.git
git submodule update --init --recursive
2.1 编译qemu
由于最新版本的qemu只是源代码,所以还需要进行qemu的编译。
查看当前所有支持命令
./configure --help|less
可以看到如下信息
其中我们可以看到aarch64-softmmu,aarch64-linux-user,aarch64_be-linux-user。对于这三个编译选项:
aarch64-softmmu:
一般选择,用来跑os的,已经开了软件mmu。
aarch64-linux-user:
用于跑app
aarch64_be-linux-user :
与上面不同的是,用来跑big-endian的app程序。
编译
./configure --target-list=arm-softmmu,aarch64-softmmu --enable-debug --enable-sdl
make
make install
03
运行raspi镜像
正常情况下,当安装完成后,在控制台输入qemu-system-aarch64 -M raspi3 -kernel kernel8.img -serial null -serial stdio就可以看到程序正常的运行起来了。
3.1 启动调试
如果要启动调试,可以输入以下的命令
qemu-system-aarch64 -M raspi3 -kernel rtthread.elf -serial null -serial stdio -s -S
-S 表示guest虚拟机一启动就会暂停
-s 表示监听tcp:1234端口等待GDB的连接
第一步:
开一个窗口,输入aarch64-elf-gdb.
第二步:
等待连接操作,然后输入target remote localhost:1234连接
第三步:
打开需要调试的文件,输入路径file /home/bigmagic/work/raspberry-pi/src/rt-thread/bsp/raspi3-64/rtthread.elf这个路径是需要调试的文件。
到这里就配置完成了。
3.2 调试技巧
首先可以输入layout src打开源代码显示窗口。
断点
输入断点可以是函数名称,可以是行号,可以是某个文件的具体函数。
break main //也可以写 b main
或者文件的第20行。
break 20
演示效果如下:
其中c是continue的简写。会向下执行,执行到断点处。
如果我们想删除某个断点,有两种方法:
1 delete 命令 简写d
delete break 删除所有的断点
delete break n 删除某个断点 n为断点号
2 clear 命令
clear 行号 删除设在某一行的断点
查看断点信息:info b 查看所有断点信息。
单步调试
进入函数内部单步调试step,简写s。
安装函数一行一行执行next,简写n。
04
总结
嵌入式开发过程中,往往避免不了与硬件打交道,但是通过qemu这种模拟硬件的方式,往往能够很好的加快调试的手段,在出现问题的时候,可以借助gdb等调试工具进行分析,也加快了开发的速度,是一种比较好的手段。