欢迎来到系统移植专栏的第一篇文章,本文介绍了嵌入式开发中交叉编译环境的搭建方法。首先解释了交叉开发环境的概念,即在PC上编译程序、在目标开发板上运行的开发模式,并分析了其必要性。然后详细说明了交叉编译工具链arm-linux-gnueabihf-gcc的组成、下载安装步骤及环境变量配置方法。最后重点讲解了NFS网络文件系统的搭建过程,包括NFS服务器的安装、共享目录配置和本地测试方法,以实现在开发阶段避免频繁烧写存储设备的目的。这些内容是嵌入式系统开发的基础环境配置,为后续开发工作奠定基础。专栏后续还会持续发布关于更详尽的干货内容,欢迎大家持续关注!!!


一、交叉编译环境的概率

1.交叉环境是什么?

在嵌入式开发中,交叉开发是很重要的一个概念,开发的第一个环节就是搭建环境,第一步不能完成,后面的步骤从无谈起,这里所说的交叉开发环境主要指的是:在开发主机(PC)上编写、编译程序,在目标机(开发板)上运行程序的环境。


2.为什么需要交叉开发环境?

原因1:嵌入式硬件资源有限(CPU主频低、内存小),PC开发效率更高。

原因2:目标机架构(如ARM)与主机(x86)不同,需用交叉编译工具生成对应指令集的程序。


3.交叉开发环境的硬件组成主要由以下几大部分

  • 开发主机
  • 目标机(开发板)
  • 二者的链接介质,常用的主要有3种方式:串口线 、USB线 、网线

4.对应的硬件介质,还必须要有相应的软件“介质”支持:

  • 串口:Putty、串口调试助手等

  • USB:芯片厂商提供的驱动(如三星DNW)

  • 网线:依赖网络协议,常用两种服务

    • tftp:将bootloader、内核、文件系统下载到内存运行,避免频繁烧写Flash

    • nfs:将主机上的根文件系统挂载到开发板,方便测试,无需烧录


    二、认识交叉编译工具链(arm-linux-gnueabihf-gcc)

    最常用的ARM交叉编译器是 arm-linux-gnueabihf-gcc,其中:

    • arm:目标架构

    • linux:目标操作系统

    • gnueabihf:使用glibc库,硬件浮点(hard float)支持

    我们在本系列中使用的是 4.9.4 版本

    工具链中还包含了:

    • arm-linux-gnueabihf-ld:链接器

    • arm-linux-gnueabihf-objcopy:格式转换

    • arm-linux-gnueabihf-gdb:调试器

    • 等等


    三、安装交叉编译工具链的流程

    1.下载与解压交叉编译工具链

    通常工具链可由厂家提供,或从 Linaro 官网下载。假设我们已获得压缩包 gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

    # 创建工作目录(可选)
    mkdir ~/tools
    cd ~/tools

    # 解压(根据压缩格式选择参数,.tar.xz使用-Jxvf)
    tar -Jxvf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

    # 解压后会生成一个目录,例如 gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf


    2.配置环境变量(永久生效)

    为了让系统在任何路径下都能找到交叉编译工具,需要将工具链的 bin 目录添加到 PATH 环境变量中。

    vim ~/.bashrc

    # 在文件末尾添加以下内容(根据你的实际路径修改)
    export PATH=$PATH:/home/your_username/tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin

    # 保存退出后,执行
    source ~/.bashrc   //在当前终端会话中,重新加载并执行 ~/.bashrc 文件里的所有命令。

    验证环境变量是否添加成功:应能看到你添加的路径出现在输出中。

    echo $PATH

    PATH 是 Linux/Unix 系统中的一个环境变量,它保存了一系列目录路径(用冒号 : 分隔)。当你在终端输入一个命令(比如 lsgccarm-linux-gnueabihf-gcc)时,系统会按照 PATH 中列出的目录顺序,依次在这些目录里寻找与命令同名的可执行文件,并执行第一个找到的。

    echo $PATH 的作用

    • echo 是输出字符串的命令。

    • $PATH 表示引用变量 PATH 的值($ 是取值符号)。

    • 整体作用就是把当前 PATH 的内容打印到屏幕上,方便你查看系统会在哪些路径下查找命令。


    3.验证交叉编译工具链是否安装成功

    输入以下命令,能看到版本信息即表示成功:

    arm-linux-gnueabihf-gcc  -v


    四、搭建NFS网络文件系统

    1.什么是NFS?

    NFS(Network File System,网络文件系统) 是一种分布式文件系统协议,允许一台计算机(客户端)通过网络访问另一台计算机(服务器)上的文件和目录,就像访问本地存储一样。

    2.为什么需要NFS?
    在系统移植调试阶段,我们经常需要快速更新根文件系统。通过NFS(Network File System)将Ubuntu上的某个目录作为开发板的根文件系统挂载,可以避免反复烧写EMMC/SD卡,极大提高开

    发效率。

    3.安装NFS服务器

    sudo apt-get update
    sudo apt-get install nfs-kernel-server -y

    4.配置导出目录(/etc/exports)

    假设我们将 /home/linux/nfs/rootfs 作为共享的根文件系统目录。

    sudo mkdir -p /home/linux/nfs/rootfs
    sudo vim /etc/exports

    添加以下内容(根据你的实际IP网段调整):

    /home/linux/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)
    • * :允许所有客户端访问(谨慎用于开发环境,也可限制为特定网段,如192.168.1.0/24)

    • rw :读写权限

    • sync :同步写入

    • no_root_squash :允许客户端root用户拥有服务器上对应目录的root权限(开发用)

    5.重启NFS服务

    sudo /etc/init.d/nfs-kernel-server restart

    6. 本地测试NFS挂载

    在Ubuntu本机上测试是否能够挂载刚刚导出的目录:

    sudo mount -t nfs localhost:/home/linux/nfs/rootfs /mnt
    ls /mnt   # 查看内容,应该能看到rootfs下的文件(可能目前为空)
    sudo umount /mnt   #以超级用户权限卸载挂载在 /mnt目录上的文件系统

    如果挂载成功,说明NFS服务已正常工作。后面在uboot中设置 bootargs 即可让开发板通过NFS挂载根文件系统(将在本专栏后续文章详细讲解)。

    Logo

    openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

    更多推荐