专栏首页嵌入式iot在qemu上搭建开发aarch64 rtos环境

在qemu上搭建开发aarch64 rtos环境

前言

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

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

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

原始发表时间:2020-03-10

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • rt-thread系统裁剪指南

    在设计嵌入式RTOS系统逻辑时,我们往往希望系统简洁并且代码可控,这样我们做方案时心里才有底。下面我们来从原理层面和实现层面上讲一下rt-thread裁剪相关的...

    bigmagic
  • Linux通用GPIO驱动写法与应用

    在Linux中,可以对GPIO进行相关的控制,具体的做法就是利用字符设备驱动程序对相关的gpio进行控制。由于操作系统的限制,在Linux上又无法直接在应用程序...

    bigmagic
  • 如何在树莓派2上移植rt-thread操作系统

    2.Ubuntu上需要装scons,因为rt-thread操作系统是通过scons组织的。

    bigmagic
  • Linux(RHEL7及CentOS7)的时间设置篇(timedatectl,date,hwclock)-系统管理(2)

    RHEL7、CentOS7提供三种命令行方式方式来设置和显示日期、时间。timedatectl是在RHEL7及CentOS7中新增的systemd的一部分,da...

    耕耘实录
  • 小白Linux入门--入门篇(二):Linux中特殊符号./~><;的作用详解

    开头先给大家介绍两个实用又常用的Linux命令,可以让你在实用Linux过程中更加方便!

    浩Coding
  • 爬虫之Scarpy.Request

    小小咸鱼YwY
  • CentOS7 设置用户密码规则

    1、设置密码过期的天数。 用户必须在几天内更改密码。 此设置仅在创建用户时才会产生影响,而不会影响到现有用户。 如果设置为现有用户,请运行命令“chage -M...

    shaonbean
  • 企业级Tomcat部署实践及安全调优

    1.1 Tomcat简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由...

    惨绿少年
  • Mycat数据库中间件简介

    Mycat是一个优秀的数据库中间件,它可以实现mysql数据库的读写分离和高可用,能够支持数亿大表的分布式数据库系统,我们也可以把它当做一种数据库...

    AsiaYe
  • Python3爬虫下载pdf(一)

    py3study

扫码关注云+社区

领取腾讯云代金券