交叉开发(编译)

交叉开发:

        是一种开发方式,也是用来开发软件的

        编写代码------->编译代码(gcc)-------->运行代码

一. 交叉编译(corss-compiling)

交叉编译,是一种编译方式,也是把一种程序语言翻译为一种机器语言

交叉?(编译代码的环境和你运行代码的环境不一样)

        编译环境:一般指的是编写代码和编译代码的环境(主机的信息: x86-64, windows

                          / x86-64, Linux-ubuntu)
        运行环境:一般指的是你运行程序(编译后的二进制)的那一个主机的信息

                          (x86-64, Linux-ubuntu / ARM, Linux)

在实际开发中,编译环境和运行环境一般是不相同的 (产品一般是不具备写代码和编译代码条件的,没有编辑器和编译器)

我们只能在自己的PC上面写完代码(keil / ubuntu),编译好,再下载(烧写)到具体的产品上面运行,这个过程就是我们所说的交叉开发
            如:
                在PC机上去写一个代码,编译好,下载带51单片机上运行
                在PC机上去写一个代码,编译好,下载带ARM开发板上运行
                ....

查资料: ARM和x86是什么?

ARM:

        ARM是一种处理器架构,全称为Advanced RISC Machine。ARM处理器由ARM公司设计,是一种低功耗、高性能的处理器架构,广泛应用于移动设备、嵌入式系统、个人电脑以及服务器等领域。ARM处理器采用精简指令集计算技术(RISC),具有较高的能效比和较低的能耗。它具有灵活的架构设计,可以根据应用需求进行定制,支持多核处理器和多线程技术。目前,ARM处理器在全球市场占据主导地位,并且在人工智能、物联网和汽车领域等新兴应用中有着广阔的发展前景。

处理器架构:

        处理器架构是指计算机处理器的设计和组织方式,包括指令集、寄存器、内部结构、流水线和总线等各个方面的组织和设计。处理器架构决定了处理器的性能、功耗和功能等特性。

        处理器架构可以分为复杂指令集计算机(CISC)和精简指令集计算机(RISC)两种类型。CISC处理器具有复杂的指令集,一条指令可以执行多个操作,相对而言更加复杂,但也更加灵活。而RISC处理器具有简化的指令集,每条指令只执行一个简单的操作,相对而言更加简单,但也更加高效。

        处理器架构还可以细分为32位架构和64位架构,表示处理器寄存器中一次可操作的数据的位数。64位架构相比32位架构具有更大的寻址空间和更高的运算速度。

        另外,处理器架构还可以根据是否支持并行计算划分为单核处理器和多核处理器。多核处理器具有多个核心,可以同时执行多个任务,提高处理器的整体性能。

        不同的处理器架构适用于不同的应用领域和场景,如移动设备、嵌入式系统、个人电脑、服务器和超级计算机等。选择合适的处理器架构对于系统的性能、功耗和成本等方面至关重要。

x86:

        x86(也称为IA-32)是一种常见的处理器架构,最初由Intel公司推出,并广泛应用于个人电脑和服务器等领域。x86处理器采用复杂指令集计算机(CISC)架构,具有较为复杂的指令集,允许进行多个复杂的操作。

        x86架构最早出现于20世纪80年代中期,随后不断发展和升级。现在的x86处理器包括Intel的Core系列和Xeon系列以及AMD的Athlon系列和Ryzen系列等。x86处理器以其高性能和灵活性广受欢迎,并成为个人电脑和服务器市场的主导架构。

        x86架构的特点包括指令集的丰富和复杂性、支持虚拟内存和多任务操作系统、广泛的软件兼容性等。x86处理器还支持流水线、超标量和多核等技术,提高了指令的执行效率和系统性能。

        总的来说,x86是一种常见的处理器架构,被广泛应用于个人电脑和服务器等领域,主要由Intel和AMD等公司生产,具有丰富的软件兼容性和高性能。

在一种环境下面去生成另一种环境可以运行的可执行文件

如: 在x86环境(linux/ubuntu)生成开发板(ARM)可以运行的程序

 

ARM开发板的程序如何编译呢?
            gcc ------>编译器(生成的可执行文件,可以放到x86上面运行)

            arm-linux-gcc ----->交叉编译器(生成的可执行文件,可以放到ARM上面运行)

  

             交叉编译环境一般使用linux系统

            PC机(编写)--->PC机上进行交叉编译--->可执行程序--->下载到目标板上运行

二. 交叉编译器的安装

sudo apt-get install gcc   安装普通的编译器(前提:联网)
sudo apt-get install arm-linux-gcc     新版本的Ubuntu可以下载,但是下载之后,可能用不了

 一般来说,交叉编译器都是芯片厂商做好的,编译好的(我们也可以自己做),直接拿过来使用就可以了

编译器版本和编译内核的编译器版本一致

💖交叉编译器的安装:
        1. 把交叉编译器工具链的压缩包,放到自己的linux系统下(家目录)

            不要放到共享文件夹(共享文件夹是windows的文件夹)
            cp  arm-linux-gnueabi-5.4.0.tar.xz  /home/china/
                    // 把交叉编译器复制到家目录
            cd /home/china
        
        2. 解压到一个合适的目录
            sudo mkdir /usr/local/arm      // 自己新建一个目录
            sudo tar -xvf arm-linux-gnueabi-5.4.0.tar.xz  -C  /usr/local/arm 

                    // 解压到指定的目录
            cd /usr/local/arm   里面就有你需要的编译器

        3. 找到你解压之后的编译器目录
            /usr/local/arm/5.4.0/bin
            这个目录里面就有常用的交叉编译器工具

            就可以使用这个工具去编译我们的可执行程序
            /usr/local/arm/5.4.0/bin/arm-linux-gcc 1.c -o 1
            使用编译器的时候需要加路径?
                    因为编译器所在的路径不是系统的默认路径,把这个路径加入到默认的路径中(环境变量PATH)不然shell不知道你的命令在哪里

            为什么我们敲ls,pwd不需要指定路径呢?

                    因为这些命令在我们系统的默认路径下面

                        a. 你可以把你的命令放到默认路径下面去

                        b. 你可以使你的编译器的目录变成默认路径的一部分

                                把我们这个目录加入到一个名字叫做PATH的环境变量

                        PATH:这个环境变量保留了系统默认的可执行文件的目录列表

                                PATH=dir1:dir2:dir3:dir4:......

        4. 修改环境变量
            把我们编译器所在的路径变成默认路径的一部分
            ====>参考shell中的环境变量

练习:

        学过了shell(脚本文件,重复写命令)

        写一个shell脚本,把/usr/local/arm/arm-2009q3/bin所有的工具都建立一个对应的软链接

        ./xx.sh    就会为所有的工具都建立一个对应的软链接

        arm-none-linux-gnueabi-c++

        ====>arm-linux-c++

提示: shell 中 ${},## 和%%的用法

        假如我有一个变量:

        file=xxx/dir1/dir2/dir3/dir4/my.file.txt

可以使用${}获取字符串中的不同内容:

        ${file#*/}:删除第一个 / 以及左边的字符串

        ====>

        dir1/dir2/dir3/dir4/my.file.txt

        

        ${file#*.}:删除第一个 . 以及左边的字符串

        ====>

        file.txt

   

        ${file##*/}:删除最后一个 / 以及左边的字符串

        ====>

        my.file.txt

        

        ${file##*.}:删除最后一个 . 以及左边的字符串

        ====>

        txt

        

        ${file%*/}:删除从右边数第一个 / 以及右边的字符串

        ====>

        xxx/dir1/dir2/dir3/dir4

        

        ${file%%*/}:删除从右边数最后一个 / 以及右边的字符串

        ====>

        xxx

#!/bin/bash

list=`ls arm-none-*`
for var in $list
do
    #取每一个var的最后一个-后面的字符串
    var1=${var##*gnueabi-}
    #把取到的字符串(var1)放到arm-linux-后面
    var2=arm-linux-$var1
    #echo $var2
    ln -s $var $var2
done

三. 把我们自己的程序下载到嵌入式开发板上面运行

ARM芯片(三星的s5pv6818的处理器)

两部分:屏幕(LCD显示屏 + 触摸屏)

              底板(主板)

网线

电源线

串口线(两端一样)

USB-转串口

开发板和PC通信

        串口通信

           

            串口线

PC-----------------------开发板

串口软件(SecureCRT)

开发板的使用:通过串口和PC通信

        windows中要先安装串口线的驱动

        设备管理器:其他设备:显示  usb2.0-ser!   表示没有安装驱动(不识别此设备)

 右击设备名称---->更新驱动程序软件--->浏览计算机以查找驱动程序软---->找到解压之后的usb_com文件夹(包含子目录)----->下一步

USB-转串口(需要安装驱动程序) 

插入USB-转串口,会显示在设备管理器中

端口:

        USB-SERIAL CH340(COMX)
                ch340表示的是设备名称
                COMx表示设备连接到计算机的哪一个端口

使用串口软件去读写串口的数据
        secureCRT(windows)
        putty(windows)
        xshell(windows)
        minicom(linux)      
            Linux中常用的命令行串口工具
                    sudo apt install minicom
            设置串口通信协议:
                    sudo minicom -s 
                ....

打开secureCRT,点击快速连接
            协议:serial            串口协议
            端口:COMX          连接到你计算机的哪一个USB口
            波特率: 115200       每秒发送的bit数
            把流控去掉
            确定,出现绿色的小√就可以了

             

            Ctrl+C 会出现一个虚拟终端,这个终端就是控制开发板的

             操作方法和虚拟机一样的,通过命令行操作

开发板的所有信息都会通过串口传入PC,PC也可以通过串口控制开发板

进入开发板之后,建议设置一个自己的工作文件夹(可以修改/etc/profile) :vi  /etc/profile
            自己的数据都放到自己的工作文件夹
            cd ~ 
            mkdir SC
            cd SC

通过串口下载文件到开发板上面运行
        开发板没有编译器,所以我们需要先在PC上编译好,再下载到开发板上面运行

  • 串口下载文件(Xmodem/Ymodem/Zmodem)

            rx    recive  Xmodem
                在开发板上面使用xmodem协议去接收数据
                开发板已经做好了接收准备,在PC上面发送文件即可

            开发板:
                rx hello
                    开发板使用xmodem的协议接受一个名字叫做hello的文件
                CRT上发送:
                    传输--->发送xmodem--->选择你要发送的文件

        
        rz + 回车

  • 运行开发板上面的文件

            ./hello 
            -/bin/sh: ./hello: Permission denied
            权限不够
            ======>
            chmod +x hello


            ./hello 
           ./hello: line 1: syntax error: unexpected "("
           放到开发板上面运行的程序都需要使用arm-linux-gcc编译器编译

开发板的屏幕是不会有变化的,因为你没写程序控制屏幕

四. U盘

1. 给自己的U盘建立文件系统分区
            Linux中的分区命令(fdisk)
                sudo fdisk -l  列举当前系统中所有存储设备的信息   
                fdisk   /dev/sda1
                    需要操作/dev/sda1这个设备


2. 格式化(mkfs)
            Linux系统有可能不认识你U盘的数据
            U盘中的数据有自己的文件系统(有自己的存储格式) 
            也可以把U盘格式化为指定的文件系统(把文件系统的元数据写入到分区的最前面)

3. 挂载(mount)  <----
           把指定的存储设备(U盘的分区文件系统),加载到操作系统的文件系统的某一个路径下面(一般都是自动挂载的,windows)
           在Linux下面,也可能会自动挂载,一般在如下的位置
                     1)/mnt/media
                     2)/media 
                     3)/mnt/udisk  <------------ 我们的开发板
           U盘的内容就出现在了这个目录下面,U盘自动挂载到/mnt/udisk

           如果没有自动挂载,可以尝试使用mount命令手动挂载
            mount  /dev/sdb1  /mnt
                /dev/sdb1     // 你要挂载的分区的名称
                /mnt              // 你要把设备挂载到操作系统的哪一个目录下面去
                挂载成功,/dev/sdb1磁盘中的内容就会出现在/mnt目录下面

4. 卸载 
            umount  /mnt

 

1)把传输的文件拷贝到U盘

2)把U盘插到开发板上

3)U盘自动挂载到开发板的 /mnt/udisk

4)  文件拷贝到自己的开发板目录

注意:可能自动挂载会不成功,需要手动挂载

cd /mnt/udisk 目录

ls 查看不到U盘中的文件

手动挂载步骤:

        ①创建一个用来挂载U盘的路径

                eg: mkdir /FT/udisk

        ②mount /dev/....(查看插入U盘时文件) 自己创建U盘的挂载路径

                eg: mount /dev/sda1 /FT/udisk

        ③切换到自己的挂载路径

        ④用完后记得解除

                umount 自己创建U盘的挂载路径

                eg: umount /FT/usidk

五. 配置网络

网络:开发板有一个有线网卡,可以直接联网

虚拟机联网:参考Linux基础的内容

开发板:
        a. 连接网线
            可以连桌面上的网线(开发板和教室中所有的机器在一个局域网)
            可以直接用一根网线连接PC机和开发板(开发板和PC机两台机器构成了一个局域网),这样做的话,PC就不要连wifi

        b. 设置网络信息(IP地址)
            如果使用教室局域网,可以使用命令自动获取IP地址 
                udhcpc

            可以通过命令设置IP地址(但是是临时的)
                ifconfig eth0 172.11.0.4 netmask 255.255.254.0 up 
                route add default gw 172.11.1.1
 

            需要开机就设置,可以使用配置文件(把上面的语句中的一种写入/etc/profile)
            

            reboot

             

            或者还有一种方式:
            在开发板的 /etc/init.d目录下面建立一个简单的脚本文件
            名称必须是 Start.sh 
            系统每一次重启都会执行这个脚本
            内容为:
                #!/bin/sh

                #关闭eth0的网卡
                ifconfig eth0 down

                #设置eth0网卡的物理地址(最后两位建议每个同学的都不相同)
                ifconfig eth0 hw ether 08:90:00:A0:35:88

                #设置网卡的IP和子网掩码
                ifconfig eth0 172.11.0.4 netmask 255.255.254.0 up

                #设置网关
                route add default gw 172.11.1.1
=

                #打开telnetd服务
                telnetd &

            注意:
                 脚本必须有可执行权限
                 手动运行一次脚本或者重启开发板才可以生效
                 IP地址不能和Windows相同
                 同一个局域网中网关和子网掩码必须相同

            如果开发板需要访问外网网址,还需要添加域名解析服务器地址
            设置DNS服务区
            vi /etc/resolv.conf  
            增加一行:
            nameserver 114.114.114.114
            开发板就可以ping通百度了
        
        经过上面的操作,你的开发板,虚拟机和windows应该处于同一个局域网
        可以相互ping通

        windows:
            地址        172.11.0.1
            子网掩码    255.255.254.0
            网关        172.11.1.1
            DNS         114.114.114.114

        Ubuntu:
            地址        172.11.0.3
            子网掩码    255.255.254.0
            网关        172.11.1.1
            DNS         114.114.114.114    

 

        开发板:
            地址        172.11.0.4
            子网掩码    255.255.254.0
            网关        172.11.1.1
            DNS         114.114.114.114   

六. tftp / ftp

网络文件传输协议

在虚拟机中搭建一个文件传输服务器(tftp / ftp)
        目的:使用网络传输文件到开发板
        tftp是一个网络服务程序,是CS架构
            C: client         客户端       开发板
            S: server        服务器       PC / ubuntu

可以在虚拟机中搭建一个tftp的服务器,在开发板上面就可以使用tftp客户端下载文件
            在虚拟机中安装:
            安装: 
                    sudo apt-get install tftp-hpa
            启动:
                    sudo service tftpd-hpa start
            停止:
                    sudo service tftpd-hpa stop 
            重启:
                    sudo service tftpd-hpa restart

            查看:

                    sudo service tftpd-hpa status

            配置tftp的配置文件:( /etc/default/tftpd-hpa )

                  # /etc/default/tftpd-hpa   注释

                  TFTP_USERNAME="tftp"
                  TFTP_DIRECTORY="/home/china/tftpboot"
                  // 服务器共享到网络上面的目录(必须有可执行权限)

                  TFTP_ADDRESS="0.0.0.0:69"
                  TFTP_OPTIONS="-l -c -s"

查看当前虚拟机中的tftp服务器的进程是否正常启动:
        ps -ef | grep tftp

在同一个局域网中的其他设备(虚拟机/开发板)上就可以使用tftp从服务器上面下载文件,也可以上传文件到服务器(前提是网络正常)

            cd ~/tftpboot

            or

            cd /home/china/tftpboot

            在开发板上使用tftp命令下载:
             
  tftp -g(get获取) -r(remote远程)  远程文件名  服务器地址
                如:
                tftp -g -r a.txt  172.11.0.3
                从172.11.0.3这个服务器(虚拟机:/home/china/tftpboot)上面下载一个叫做a.txt的文件到本地(开发板)的当前目录

            在开发板上使用tftp命令上传:
             
  tftp -p -l  本地文件名  服务器地址 
                如:
                tftp -p -l  1.txt 172.11.0.3
                把当前目录下面的1.txt文件推送到服务器172.11.0.3的目录                                                      (/home/china/tftpboot)


            Ubuntu中也可以使用tftp服务器
                tftp 172.11.0.3  进入tftp的命令行
                or
                tftp localhost   表示本地IP地址

                下载:get b.txt 
                上传:put n.txt
                退出tftp:quit 

七. 补充

1. 计算机中如何比较两个文件是否相同(大小/内容)? 
        一般使用md5sum 
       
md5sum  a.txt   计算这个文件的md5值
        如果两个文件的md5值相同,那么我们认为这两个文件是相同的 !!!

 2. 刷机: (最好不要实验,因为软件和硬件都是定制的,有可能不兼容)
        USB线连接到OTG(注意安装OTG的驱动)
        步骤:
            让开发板进入boot命令行(类似于BIOS)
            开机启动的时候,在5S内按任意键,进入boot命令行
            如果需要继续启动:
                输入命令boot 
            如果需要刷机:
                a.在boot命令行输入fastboot
                b.打开windows中的刷机包,刷机auto.bat  (windows中的脚步)
                等待完成即可

八. 任务

1. 查资料了解telnetd服务怎么搭建并且搭建一个telnet服务(搭建到虚拟机)
    可以使用CRT连接虚拟机或者开发板
        安装telnetd 服务
        sudo apt-get install telnetd 
        sudo apt-get install xinetd
        sudo apt-get install telnetd-ssl
        查看telnet运行状态
        sudo netstat -a | grep telnet
        

        telnet localhost
        telnet 172.11.0.3
        输入用户名(china)和密码(123456)即可
        exit退出
        
        https://www.cnblogs.com/smartmsl/p/10878287.html

    也可以使用超级终端工具(CRT)连接
        快速连接--->协议:telnet
        主机名:IP地址
        
2. 自己在ubuntu中搭建一个ftp服务器
    可以在开发板中使用wget下载服务器中的内容
    
3. 自己学习一下scp这条牛逼的命令(跨主机复制)
    只有能够ping通,就可以自由的复制文件
    scp 1.c china@172.11.0.1:/home/china/123
    把当前目录下面的1.c文件复制到IP地址为172.11.0.1上面的china用户的/home/china/123目录下面
    前提是安装ssh服务
    
4. ssh协议,搭建一个ssh服务器,可以实现远程登录
    https://blog.csdn.net/gymaisyl/article/details/86570426/
    
上面三个都是建立在网络连通的情况下

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
交叉编译是指在某种开发环境下,将程序代码编译成可在不同类型或构架的操作系统或平台上运行的可执行程序。sysbench是一个在数据库和操作系统上进行基准测试和性能评估的工具。要交叉编译sysbench,首先需要选择目标平台的交叉编译工具链,这通常包括交叉编译器、交叉链接器和交叉调试器。接着需要配置sysbench的编译选项,指定目标平台的操作系统和构架。然后进行交叉编译,根据不同的目标平台和编译工具链,具体的步骤可能会有所不同。最后,进行测试和部署,验证交叉编译后的sysbench在目标平台上能够正常运行并得到期望的性能数据。 具体来说,首先需要获取目标平台的交叉编译工具链,可以通过在官方网站下载或自行编译获取。接着需要配置sysbench的编译选项,包括指定交叉编译器、交叉链接器等工具,以及目标平台的操作系统和构架。然后执行编译命令,根据具体的编译工具链和选项进行交叉编译。最后,在目标平台上进行测试,验证交叉编译后的sysbench在该平台上的性能表现和稳定性。如果有必要,还可以进行调试和优化,以确保sysbench在目标平台上能够达到最佳的性能和稳定性。 总之,交叉编译sysbench需要选择合适的交叉编译工具链,配置编译选项,进行编译和测试,并根据需要进行调试和优化,以确保sysbench在目标平台上能够正常运行并得到准确的性能数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值