使用Ubuntu实现树莓派交叉编译与调试

本文介绍了树莓派与Ubuntu的交叉编译和调试环境搭建。先阐述了交叉编译的概念、必要性及系统连接方式,接着详细说明了环境搭建步骤,包括安装树莓派系统、连接树莓派、SSH远程登录、设置虚拟机网络等,还介绍了使用arm工具包、交叉编译和交叉调试的操作方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、相关介绍

1.1 环境

  • Win10 + VMware Workstation(主机)
  • Ubuntu16.04 64位(虚拟机)
  • 树莓派3  Model B,系统:Raspbian

1.2 什么是交叉编译

    交叉编译就是把编译的过程在LINUX PC(或其它主机)上执行,然后拷贝二进制可执行文件到树莓派(或其它嵌入式平台上)执行

1.3 为什么需要交叉编译

  • 目标平台的运行速度往往比主机慢得多,许多专用的嵌入式硬件被设计为低成本和低功耗,没有太高的性能
  • 整个编译过程是非常消耗资源的,嵌入式系统往往没有足够的内存或磁盘空间
  • 即使目标平台资源很充足,可以本地编译,但是第一个在目标平台上运行的本地编译器总需要通过交叉编译获得
  • 一个完整的Linux编译环境需要很多支持包,交叉编译使我们不需要花时间将各种支持包移植到目标板上

1.4 系统连接

  • 由于没有ubuntu的机器,因此使用win10下的虚拟机与树莓派进行交叉编译与调试

89c888bf2429ffdcd5f43224adbd0288f1f.jpg

系统连接图

二、环境搭建

2.1 安装树莓派系统

  • 在win10上下载并安装Win32 Disk Imager
  • 将下载的Raspbian系统写入到FT卡中(可用读卡器或卡套将TF卡连接到电脑上,如果用卡套时提示写入保护请把卡套侧边的写入保护关闭,不行请多试几次)

12b4668f4a93f74c113c527897424f92b0f.jpg

图1 写入系统镜像

  • 提示写入成功后,打开TF卡根目录下config.txt文件,在末尾添加如下2行:
enable_uart=1
dtoverlay=pi3-miniuart-bt

    注意:dtoverlay=pi3-miniuart-bt 这个语句是将树莓派的硬件串口作为串口调试,关闭蓝牙对硬件串口的使用,会导致设备不能正常工作。如果要使用蓝牙需去掉这个语句,用mini-uart作为串口调试。另外随便说一下,在TF卡根目录中新建一个空白文件,文件名改为SSH,不带后缀。插到树莓派上重启即可开启SSH。

2.2 树莓派连接

  • 将TF卡插入树莓派背后卡槽中

603f467642d2f7a6c2700f748ea070ec6c7.jpg

图2 树莓派40Pin引脚对照表

  • 用USB转TTL线连接win10与树莓派

    注意:红色线是供电线,建议不要使用,使用手机充电线给树莓派供电。黑色线是接地线,插引脚板外侧从远离USB口数第三根(为图2中BOARD编码6的位置)。白色线是td线,负责传输数据,插引脚板外侧从远离USB口数第四根(为图2中BOARD编码8的位置)。绿色线是rd线,负责接收数据,插引脚板外侧从远离USB口数第五根(为图2中BOARD编码10的位置)。

5c2d533704a4cf717918e1d26dd06e2c16d.jpg

图3 树莓派连接图

2.3 SSH远程登录

  • 要通过串口连接到树莓派,需要先知道树莓派的连接端口号,右键计算机->管理->设备管理器->端口,即为下图的COM3

图4 查看树莓派连接端口号

  • 使用远程登陆工具登录树莓派,这里使用xshell(其实树莓派有HDMI视频接口,也可以直接在树莓派上外接显示器和鼠标键盘进行操作),如下图,协议选择SERIAL

图5 xshell登录_1

  • Port选择前面查看的COM3(根据自己实际情况选取),波特率选择115200

图6 xshell登录_2

 

  • 连接后插入树莓派电源线,如果有字符闪过说明成功连接树莓派,默认用户名:pi,密码:raspberry,输入密码确定后出现命令提示符即登录成功

图7 树莓派登录

2.4 ubuntu虚拟机网络设置

  • 选择桥接模式,桥接模式好像在局域网中添加了一台新的、独立的计算机一样,虚拟机也会占用局域网中的一个IP地址,并且可以和其他终端进行相互访问。而NAT模式从外部网络来看,虚拟机和主机在共享一个IP地址,默认情况下,外部网络终端也无法访问到虚拟机,即树莓派不能访问虚拟机下的ubuntu(注:如果ubuntu没有使用虚拟机,而是真实的机器,则忽略此步骤)

2b239ddc99d1875a10165537e642c8d45d6.jpg

图8 ubuntu虚拟机网络配置

2.5 网络连接与测试

  • 由于后面需要交叉编译和调试,需要使用scp进行文件传输以及通信,所以需要保证树莓派和Ubuntu可以通信
  • 将win10和树莓派接入到同一个局域网下,这里我使用网线将他们接入同一个路由器即可,或者让他们连接到用一个wif下也可以
  • 查看树莓派的ip,如图9所示

图9 查看树莓派ip

  • 查看ubuntu的ip,如图10所示

图10 查看ubuntu的ip

  • 测试能否相互ping通,若出现下图结果,则证明ubuntu与树莓派网络连接成功

图11 ping ubuntu的ip

图12 ping树莓派的ip

三、使用arm工具包

  • 将文件arm_linux_tools.zip复制到ubuntu虚拟机系统中,用unzip命令解压,没有unzip请使用apt-get命令安装unzip
  • 如果ubuntu系统是64位,请输入下列命令,否则因为arm包是32位而不能执行:
sudo apt-get install libc6:i386 libstdc++6:i386 libncurses5:i386 zlib1g:i386
  • 将arm包执行文件路径加入path,方便使用:打开~/.bashrc,在文件末尾添加如下命令
vim ~/.bashrc
export PATH=$PATH:/home/user/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin #这里根据自己的解压路径,我是解压到/home/user目录下
source ~./bashrc

注:以下两个实验是在上位机(ubuntu)与树莓派通过网络连接的情况下进行

四、交叉编译

  • 上位机(ubuntu)执行下列语句保证树莓派能够使用scp下载文件
sudo apt-get install openssh-server
  • 新建一个hello.c的测试代码文件
#include<stdio.h>
int main(void)
{
    int i;
    for(i=0;i<5;i++)
    {
        printf("hello world,%d\n",i);     #后面在这行打断点进行gdb交叉调试
    }
    return 0;
 }
  • 使用arm编译工具包里的arm-linux-gnueabihf-gcc或者arm-linux-gnueabihf-g++编译源代码文件,为了之后可以调试加上-g
arm-linux-gnueabihf-gcc -g hello.c -o hello    #arm-linux-gnueabihf-gcc -g 源代码 -o 目标可执行文件
  • 在树莓派上使用scp命令下载目标可执行文件,需要输入上位机密码,如图12
scp user@192.168.1.103:/home/user/hello ./     #scp (用户名)@(上位机IP):(目标可执行文件路径) (树莓派下载存储路径)
  • 下载完成后./执行文件名,查看是否可执行,如图13所示

图13 scp下载可执行文件

五、交叉调试

  • 在树莓派上使用scp下载arm工具包中的gdbserver,路径为tools-master/arm-bcm2708/arm-bcm2708-linux-gnueabi/arm-bcm2708-linux-gnueabi/debug-root/usr/bin/gdbserver
  • 在树莓派上运行如下命令启动gdbserver,如图14所示
scp user@192.168.1.103:/home/user/tools-master/arm-bcm2708/arm-bcm2708-linux-gnueabi/arm-bcm2708-linux-gnueabi/debug-root/usr/bin/gdbserver ./     #下载gdbserver
#启动gdbserver
./gdbserver 192.168.1.100:6666 ./hello  # ./gdbserver (树莓派IP):(任意端口) (目标可执行文件路径)

图14 启动树莓派上的gdbserver

  • 在上位机启动gdb,如图15所示
arm-linux-gnueabihf-gdb

图15 启动ubuntu上的gdb

  • 进入gdb环境后链接到树莓派
#连接
target remote 192.168.1.100:6666    #target remote (树莓派IP):(端口)
#选择文件
file hello    
  • 进行交叉调试,使用“b”设置断点,使用“c”执行到下个断点,使用"p i"查看变量i的值,如图16所示

图16 交叉调试过程

转载于:https://my.oschina.net/zctzl/blog/3046602

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值