本文主要描述树莓派64位的编译及运行方式,并且通过在qemu上运行仿真体验一下rt-thread 的64位效果。对于手上没有树莓派但是又想体验一下树莓派64位的朋友来说非常方便。当在qemu上运行通过后,再下载到真实的树莓派3b的板子上运行,效果一致。通过这种方式可以方便调试程序。
准备条件:
Ubuntu16.04
下面的实验步骤在Ubuntu16.04上进行,尽量保证环境的一致性。
推荐采用gcc-arm-8.3-2019.03-x86_64-aarch64-elf进行源代码的编译,由于官方下载速度非常慢,所以我放到网盘上提供下载。
链接: https://pan.baidu.com/s/1ZAba3xbhad-BnimCo5VDGA
提取码: a6t5
解压到opt目录下。
在github上的rt-thread上进行下载
git clone git@github.com:RT-Thread/rt-thread.git
切换到rt-thread/bsp/raspberry-pi/raspi3-64
目录,输入scons
开始编译
最后生成kernel8.img文件就是可执行文件。
qemu环境可以在官方网站上下载。
下载完成后解压文件。
或者从github中clone代码
git clone git@github.com:qemu/qemu.git
git submodule update --init --recursive
./configure --help|less
这样可以看到目前所有支持的芯片架构类型.
Standard options:
--help print this message
--prefix=PREFIX install in PREFIX [/usr/local]
--interp-prefix=PREFIX where to find shared libraries, etc.
use %M for cpu name [/usr/gnemul/qemu-%M]
--target-list=LIST set target list (default: build everything)
Available targets: aarch64-softmmu alpha-softmmu
arm-softmmu cris-softmmu hppa-softmmu i386-softmmu
lm32-softmmu m68k-softmmu microblaze-softmmu
microblazeel-softmmu mips-softmmu mips64-softmmu
mips64el-softmmu mipsel-softmmu moxie-softmmu
nios2-softmmu or1k-softmmu ppc-softmmu ppc64-softmmu
riscv32-softmmu riscv64-softmmu s390x-softmmu
sh4-softmmu sh4eb-softmmu sparc-softmmu
sparc64-softmmu tricore-softmmu unicore32-softmmu
x86_64-softmmu xtensa-softmmu xtensaeb-softmmu
aarch64-linux-user aarch64_be-linux-user
alpha-linux-user arm-linux-user armeb-linux-user
cris-linux-user hppa-linux-user i386-linux-user
m68k-linux-user microblaze-linux-user
microblazeel-linux-user mips-linux-user
mips64-linux-user mips64el-linux-user
mipsel-linux-user mipsn32-linux-user
mipsn32el-linux-user nios2-linux-user
or1k-linux-user ppc-linux-user ppc64-linux-user
ppc64abi32-linux-user ppc64le-linux-user
riscv32-linux-user riscv64-linux-user
s390x-linux-user sh4-linux-user sh4eb-linux-user
sparc-linux-user sparc32plus-linux-user
sparc64-linux-user tilegx-linux-user
x86_64-linux-user xtensa-linux-user
xtensaeb-linux-user
其中我们可以看到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
正常情况下,当安装完成后,在控制台输入qemu-system-aarch64 -M raspi3 -kernel kernel8.img -serial null -serial stdio
就可以看到程序正常的运行起来了。
bigmagic@bigmagic:~/work/rt-thread/bsp/raspberry-pi/raspi3-64$ qemu-system-aarch64 -M raspi3 -kernel kernel8.img -serial null -serial stdio
heap: 0x00110738 - 0x00510738
__page_off = 2000
\ | /
- RT - Thread Operating System
/ | \ 4.0.3 build Feb 8 2020
2006 - 2019 Copyright by rt-thread team
Hi, this is RT-Thread!!
msh />
很多情况下,我们完成软件的编写,需要定位的时候,可以利用gdb工具进行代码层面的调试。
如果要启动调试,可以输入以下的命令
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
这个路径是需要调试的文件。
到这里就配置完成了。
首先可以输入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。