飞凌嵌入式
直播中

淡化浅出

7年用户 90经验值
擅长:嵌入式技术
私信 关注
[技术]

【ELF 1开发板试用】3. Ubuntu 下开发环境搭建——编译

【ELF 1开发板试用】3. Ubuntu 下开发环境搭建——编译

官方资料采用的是 Windows 下加虚拟机的方式搭建开发环境,笔者从官方资料中抽丝剥茧,把在 Ubuntu 实机上相关的资料整理出来。

必要库的安装

在进行开发之前,还需要一些其他的必要库,我们使用以下命令逐一安装,安装前需保证网络可正常使用,能上外网:
首先,更新下载源信息

sudo apt-get update

提供编译程序必须软件包列表信息

sudo apt-get install build-essential

用于生成基于文本的用户界面

sudo apt-get install libncurses*

基于 Lzo 库的压缩解压工具

sudo apt-get install lzop

网络配置工具

sudo apt-get install net-tools

Ubuntu 系统的主要目录

目录 说明
/ 根目录,所有的目录都是由根目录衍生出来
/bin 系统的基本指令,可以被 root 和一般用户使用
/home 用户主目录,默认用户的主文件夹都会放到这里
/dev 设备文件目录,设备与接口设备都是以文件形式存在在该目录
/etc 系统的主要配置文件目录
/lib 系统函数库目录
/lib/moudle 内核相关的模块驱动
/root 系统管理员 root 的主文件夹
/usr Unix Software Resource 的缩写,系统的默认软件会放到该目录下
/usr/bin 一些用户使用命令,非系统必须的命令
/usr/lib 应用软件所需的库文件
/sbin 重要的系统执行文件
/mnt 用户临时挂载目录
/opt 第三方软件放置目录
/proc 该目录为虚拟文件系统,操作系统运行时,进程信息及内核信息(比如 cpu、硬盘分区、内存信息等)存放在这里,放置的数据都在内存中

TFTP服务搭建

TFTP(Trivial File Transfer Protocol,简单文件传输协议),是 TCP/IP 协议族中用 来在客户机和服务器之间进行简单文件传输的协议,开销很小。TFTP 通常用于内核调试。 在嵌入式 Linux 开发过程中,内核调试是其中一个基础、重要的环节。调试内核通常是与 Bootloader 配合使用,只需在 Bootloader 中实现了网卡驱动和 TFTP 客户端,就可以使用 TFTP 进行传输内核。使用 TFTP 协议传输文件,还需要在主机安装 TFTP 服务端,可以在 Linux 系统下实现,也可以在 Windows 系统下实现,下面在 Linux(Ubuntu)系统下安装 TF TP 服务端进行测试。

一、安装服务器、客户端和守护进程

sudo apt-get install tftp-hpa tftpd-hpa xinetd

二、服务器配置

首先,在 ~ 目录下建一个 tftpboot,并把属性改成任意用户可读写:

mkdir ~/tftpboot
chmod 777 ~/tftpboot

然后,进入目录 /etc/xinetd.d/,并在其中新建文件tftp,把指定的内容加入到tftp文件中:

cd /etc/xinetd.d/
sudo nano tftp

添加以下内容到tftp文件:

service tftp
{
    disable = no 138
    socket_type = dgram
    protocol = udp
    wait = yes
    user = clark
    server = /usr/sbin/in.tftpd
    server_args = -s /home/clark/tftpboot -c
    per_source = 11
    cps = 100 2
}

最后,修改配置文件/etc/default/tftpd-hpa:

sudo nano /etc/default/tftpd-hpa

修改为:

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/clark/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure -l -c -s"

注意:将“TFTP_DIRECTORY” 改为新建tftpboot目录所在的路径。

三、重新启动服务

sudo /etc/init.d/xinetd reload
[ ok ] Reloading xinetd configuration (via systemctl): xinetd.service.
sudo /etc/init.d/xinetd restart
[ ok ] Restarting xinetd (via systemctl): xinetd.service.
sudo /etc/init.d/tftpd-hpa restart
[ ok ] Restarting tftpd-hpa (via systemctl):tftpd-hpa.service.

四、测试服务器

测试一下,在/tftpboot文件夹下新建立一个文件 :

touch abc

进入另外一个文件夹:

cd /home/
sudo tftp 192.168.124.20 //192.168.124.20 为本机 IP
tftp> get abc
tftp> quit
ls
abc clark

如果可以下载 abc 文件说明服务器已经安装成功

SSH 服务搭建

SSHSecure Shell 的缩写,由 IETF 的网络小组**(Network Working Group)**所制 定的建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务 提供安全性的协议,利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH 最 初是 UNIX 系统上的一个程序,后来又迅速扩展到其他操作平台,目前为止,几乎所有 UNIX 平台,包括 HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix 等,都可运行。 因为就是在 Ubuntu 实机上编译了,也许会遇到开发板需要登录实机的情况,所以最好也把 SSH 一起安装了。

安装 SSH

安装 SSH 服务

sudo apt-get install ssh

启动 SSH 服务

sudo service ssh start

查看 SSH 服务的状态

sudo service ssh status
ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: e>
     Active: active (running) since Thu 2023-11-23 19:22:47 CST; 16s ago
       Docs: man:sshd(8)
             man:sshd_config(5)
   Main PID: 38936 (sshd)
      Tasks: 1 (limit: 37869)
     Memory: 1.7M
        CPU: 45ms
     CGroup: /system.slice/ssh.service
             └─38936 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"

1123 19:22:47 clark-Lenovo-XiaoXin-Air-14ARR systemd[1]: Starting OpenBSD Se>
1123 19:22:47 clark-Lenovo-XiaoXin-Air-14ARR sshd[38936]: Server listening o>
1123 19:22:47 clark-Lenovo-XiaoXin-Air-14ARR sshd[38936]: Server listening o>
1123 19:22:47 clark-Lenovo-XiaoXin-Air-14ARR systemd[1]: Started OpenBSD Sec>

关闭 SSH 服务

sudo service ssh stop

测试 SSH

测试非常简单,直接在终端执行

ssh localhost

遇到 Are you sure you want to continue connecting (yes/no/[fingerprint])? 输入 yes 就可以了。

交叉编译

交叉编译是指在一个平台上生成可以在另一个平台上执行的代码。由于不同 的体系结构有不同的指令系统。因此,不同的 cpu 需要有相应的编译器,而交叉编 译就如同翻译一样,把相同的程序代码翻译成不同的 cpu 的对应的可执行的二进 制文件。

交叉编译链安装

提前下载好百度网盘客户端,前往官方资料下载 EF1 开发板资料包/06-常用工具/06-1 编译工具安装脚本/fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.0.0.sh~ 路径下,给予执行权限

chmod +x fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.0.0.sh

接着执行

sudo ./fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.0.0.sh

连按两次回车,等待编译SDK安装完毕。

Freescale i.MX Release Distro SDK installer version 4.1.15-2.0.0
================================================================
Enter target directory for SDK (default: /opt/fsl-imx-x11/4.1.15-2.0.0): 
You are about to install the SDK to "/opt/fsl-imx-x11/4.1.15-2.0.0". Proceed[Y/n]? 
Extracting SDK...............................................................................................................................................................done
Setting it up...done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
 $ . /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

设置环境变量

每次重开一个终端,都需要设置环境变量

. /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

查看 gcc 版本

arm-poky-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-poky-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/lto-wrapper
Target: arm-poky-linux-gnueabi
Configured with: ../../../../../../work-shared/gcc-5.3.0-r0/gcc-5.3.0/configure --build=x86_64-linux --host=x86_64-pokysdk-linux --target=arm-poky-linux-gnueabi --prefix=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr --exec_prefix=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr --bindir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi --sbindir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi --libexecdir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi --datadir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/share --sysconfdir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/etc --sharedstatedir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/com --localstatedir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/var --libdir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/lib/arm-poky-linux-gnueabi --includedir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/include --oldincludedir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/include --infodir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/share/info --mandir=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/share/man --disable-silent-rules --disable-dependency-tracking --with-libtool-sysroot=/home/diskc/home/liyue/poky/fsl-arm-yocto-bsp/build-fb/tmp/sysroots/x86_64-nativesdk-pokysdk-linux --with-gnu-ld --enable-shared --enable-languages=c,c++ --enable-threads=posix --enable-multilib --enable-c99 --enable-long-long --enable-symvers=gnu --enable-libstdcxx-pch --program-prefix=arm-poky-linux-gnueabi- --without-local-prefix --enable-lto --enable-libssp --enable-libitm --disable-bootstrap --disable-libmudflap --with-system-zlib --with-linker-hash-style=gnu --enable-linker-build-id --with-ppl=no --with-cloog=no --enable-checking=release --enable-cheaders=c_global --without-isl --with-gxx-include-dir=/not/exist/usr/include/c++/5.3.0 --with-build-time-tools=/home/diskc/home/liyue/poky/fsl-arm-yocto-bsp/build-fb/tmp/sysroots/x86_64-linux/usr/arm-poky-linux-gnueabi/bin --with-sysroot=/not/exist --with-build-sysroot=/home/diskc/home/liyue/poky/fsl-arm-yocto-bsp/build-fb/tmp/sysroots/imx6ulevk --enable-poison-system-directories --with-mpfr=/home/diskc/home/liyue/poky/fsl-arm-yocto-bsp/build-fb/tmp/sysroots/x86_64-nativesdk-pokysdk-linux --with-mpc=/home/diskc/home/liyue/poky/fsl-arm-yocto-bsp/build-fb/tmp/sysroots/x86_64-nativesdk-pokysdk-linux --enable-nls --with-arch=armv7-a
Thread model: posix
gcc version 5.3.0 (GCC)

最后看到 gcc version 5.3.0 (GCC) 说明安装成功了。

编译 helloworld

新建一个 hello.c 文件,内容是

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

设置环境变量之后,编译工具用 $CC 表示,所以执行

$CC hello.c -o hello

生成一个可执行文件 hello。将编译好的可执行文件复制到开发板上执行,可得到输出 Hello, World!。 如果将这个文件放在实机里执行就会报错 bash: ./hello: 无法执行二进制文件:可执行文件格式错误 ,同样的代码,编译器不同,那生成的可执行文件也就不同了。执行

gcc hello.c -o hello1

对比两个可执行文件

file hello
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=cfd361c10dcbc51b8d324bc1ef5db3423399a686, not stripped
file hello1
hello1: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=a37c63bc9ce790c1d84a27b13e19f4c750e5cef2, for GNU/Linux 3.2.0, not stripped

可以看到,系统架构,位数,系统版本统统不一样,所以可执行文件也只能在对应得环境下运行。

更多回帖

发帖
×
20
完善资料,
赚取积分