前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在qemu上搭建开发aarch64 rtos环境

在qemu上搭建开发aarch64 rtos环境

作者头像
bigmagic
发布2020-03-17 15:00:55
2.9K0
发布2020-03-17 15:00:55
举报
文章被收录于专栏:嵌入式iot

前言

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式IoT 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档