在qemu上搭建开发aarch64 rtos环境

2020-03-17 15:00:55 浏览数 (1)

前言

随着芯片技术的发展,嵌入式已经不再是传统的单片机开发模式,需要一些硬件操作的板子,现在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等调试工具进行分析,也加快了开发的速度,是一种比较好的手段。

0 人点赞