专栏首页嵌入式iotrt-thread 树莓派3b 64位在qemu上运行

rt-thread 树莓派3b 64位在qemu上运行

rt-thread 树莓派3b 64位在qemu上运行

  • 1.本文目的
  • 2.代码编译
    • 2.1 工具链的准备
    • 2.2 编译源代码
  • 3.qemu安装
    • 3.1 编译qemu
    • 3.2 运行raspi镜像
  • 4.启动调试
    • 4.1 建立连接
    • 4.2 调试技巧
  • 5.后续

1.本文目的

本文主要描述树莓派64位的编译及运行方式,并且通过在qemu上运行仿真体验一下rt-thread 的64位效果。对于手上没有树莓派但是又想体验一下树莓派64位的朋友来说非常方便。当在qemu上运行通过后,再下载到真实的树莓派3b的板子上运行,效果一致。通过这种方式可以方便调试程序。

准备条件:

Ubuntu16.04

下面的实验步骤在Ubuntu16.04上进行,尽量保证环境的一致性。

2.代码编译

2.1 工具链的准备

推荐采用gcc-arm-8.3-2019.03-x86_64-aarch64-elf进行源代码的编译,由于官方下载速度非常慢,所以我放到网盘上提供下载。

链接: https://pan.baidu.com/s/1ZAba3xbhad-BnimCo5VDGA

提取码: a6t5

解压到opt目录下。

2.2 编译源代码

在github上的rt-thread上进行下载

git clone git@github.com:RT-Thread/rt-thread.git

切换到rt-thread/bsp/raspberry-pi/raspi3-64目录,输入scons开始编译

最后生成kernel8.img文件就是可执行文件。

3.qemu安装

qemu环境可以在官方网站上下载。

下载完成后解压文件。

或者从github中clone代码

git clone git@github.com:qemu/qemu.git
git submodule update --init --recursive

3.1 编译qemu

./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

3.2 运行raspi镜像

正常情况下,当安装完成后,在控制台输入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 />

4.启动调试

很多情况下,我们完成软件的编写,需要定位的时候,可以利用gdb工具进行代码层面的调试。

4.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这个路径是需要调试的文件。

到这里就配置完成了。

4.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。

本文分享自微信公众号 - 嵌入式IoT(Embeded_IoT),作者:bigmagic

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 全志V3S 编译运行xboot笔记

    现在手上有一块V3S的板子,想将其用起来。现在来记录一下这个过程。记录一下荔枝派zero的使用流程。

    bigmagic
  • DHT温湿度传感器的基本探究

    由于DHT11需要与主控进行通信,所以必须要涉及到通信时序。也就是约定好通信规则。那么对于DHT11温湿度传感器的通信时序又是怎样的呢?

    bigmagic
  • 单片机红外接收与红外发射

    1. 红外接收1.1 说明1.2 NEC协议1.3 关于红外接收的波形1.4 解码1.4 红外对射思考2. 红外发射2.1 红外发射管参数2.2 红外发射电路搭...

    bigmagic
  • 详解 Python qrcode 二维码模块

    1、version:控制二维码的大小,取值范围从1到40。取最小值1时,二维码大小为21*21。取值为 None (默认)或者使用fit=true参数(默认)时...

    Python中文社区
  • 详解 Python qrcode 二维码模块

    1、version:控制二维码的大小,取值范围从1到40。取最小值1时,二维码大小为21*21。取值为 None (默认)或者使用fit=true参数(默认)时...

    小小科
  • 腾讯云服务器Window系统新手建站流程(图文教程)

    一直想着有一天能够拥有自己的网站,以前只是知道网站需要服务器和域名,不知道怎么建站,自己瞎折腾这么久,多少也了解一下,现在把这个流程整理如下:

    用户2416682
  • 究竟什么是linux!?

    昨天需要在centos下安装一个软件,下载了原代码编译,提示缺少另外一个组件,又下载了,编译的时候,又提示需要再安装另外一个开源的软件,就这样,一个传一个,直到...

    力哥聊运维与云计算
  • git使用,这几个命令就够了

    longzeqiu
  • Java反射超越泛型

    在一次使用BeanUtils.copyProperties的方法是,莫名其妙的报错,产生的代码分解如下:

    付威
  • “公司为先”是硅谷神话,印象笔记创始人谈AI创投3大问题6大偏见

    【新智元导读】前 Evernote 联合创始人兼 CEO Phil Libin 成立了 AI 产品孵化公司 All Turtles,他列举了 AI 创投领域的3...

    新智元

扫码关注云+社区

领取腾讯云代金券