欢迎来到系统移植专栏的第一篇文章,本文介绍了嵌入式开发中交叉编译环境的搭建方法。首先解释了交叉开发环境的概念,即在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 系统中的一个环境变量 ,它保存了一系列目录路径 (用冒号:分隔)。当你在终端输入一个命令(比如ls、gcc、arm-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挂载根文件系统(将在本专栏后续文章详细讲解)。