2、开发环境搭建:交叉编译工具链安装、TFTP/NFS服务配置、串口终端与Minicom使用

说实话,做嵌入式Linux开发,第一步往往是最磨人的。我记得刚入行那会儿,光搭环境就折腾了两天,最后发现是路径写错了。嗯,这节课咱们就把这些基础打牢,后面写代码才不慌。

2.1 交叉编译工具链:为什么非得"交叉"?

你想想看,咱们的PC是x86架构,而PDA通常是ARM架构。PC上编译出来的程序,ARM芯片根本跑不了。这时候就需要交叉编译工具链——在PC上编译出ARM能跑的可执行文件。

我个人习惯用Linaro提供的工具链,稳定且社区活跃。安装步骤其实很简单:

# 下载ARM交叉编译工具链
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

# 解压到指定目录
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/

# 配置环境变量
export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin
小提示:建议把环境变量写到 ~/.bashrc 里,这样每次打开终端就不用重新 export 了。我吃过这个亏,重启终端后编译报错,查了半天才发现是环境变量丢了。

验证是否安装成功,跑一下这个命令:

arm-linux-gnueabihf-gcc --version

如果能看到版本号,说明工具链已经就绪。我曾经在项目里遇到过工具链版本不匹配的问题——编译出来的程序在PDA上段错误,折腾了两天才发现是glibc版本不一致。所以,一定要确认工具链的glibc版本和板子上的系统一致

2.2 TFTP服务:让板子从网络加载文件

开发阶段,你不可能每次改个代码就烧写一次Flash。太慢了。TFTP(Trivial File Transfer Protocol)就是用来干这个的——板子通过网络从PC上拉文件。

安装TFTP服务端:

sudo apt-get install tftpd-hpa

配置文件在 /etc/default/tftpd-hpa,我一般这么配:

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"
注意:TFTP目录的权限一定要给对。我曾经犯过一个低级错误——目录权限是755,但文件是root用户的,板子下载时直接报"Permission denied"。正确的做法是:
sudo chmod -R 777 /srv/tftp

启动服务:

sudo systemctl restart tftpd-hpa
sudo systemctl enable tftpd-hpa

测试一下,在板子的U-Boot里:

tftp 0x82000000 uImage

如果能正常下载,说明TFTP通了。说白了,这就是开发阶段的"快递员"——PC是发货方,板子是收货方。

2.3 NFS服务:让板子挂载PC的目录

TFTP适合传单个文件,但如果你要调试一个完整的文件系统,用NFS(Network File System)更方便。板子可以直接把PC上的某个目录挂载成自己的根文件系统。

安装NFS服务端:

sudo apt-get install nfs-kernel-server

编辑 /etc/exports,添加共享目录:

/srv/nfs 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)

重启服务:

sudo exportfs -a
sudo systemctl restart nfs-kernel-server

在板子的U-Boot里设置内核启动参数:

setenv bootargs 'console=ttyS0,115200 root=/dev/nfs nfsroot=192.168.1.100:/srv/nfs ip=192.168.1.101'
关键点:这里 no_root_squash 很重要。如果不加这个选项,板子上的root用户会被映射成nobody,很多操作会没权限。我刚开始做项目时就踩过这个坑,板子上执行 mount 都报错,排查了半天。

2.4 串口终端与Minicom:和板子"对话"

嵌入式开发离不开串口。说白了,串口就是你和板子之间的"电话线"。Minicom是Linux下最常用的串口工具。

安装Minicom:

sudo apt-get install minicom

配置串口参数:

sudo minicom -s

进入配置菜单后,设置以下参数:

参数 说明
波特率 115200 大多数开发板默认值
数据位 8 标准设置
停止位 1 标准设置
校验位 通常不需要
硬件流控 关闭 否则可能无法输入
实用技巧:我习惯把配置保存为默认配置,这样每次启动Minicom直接连上。保存方法:在配置菜单里选择"Save setup as dfl"。

连接板子:

minicom -D /dev/ttyUSB0

如果没反应,检查一下设备权限:

sudo usermod -a -G dialout $USER

然后注销重新登录。嗯,这个坑我也踩过——第一次用Minicom时,怎么按键盘都没反应,后来发现是当前用户没有串口权限。

2.5 避坑指南:我踩过的那些坑

  • 工具链路径问题:我曾经把工具链解压到带空格的目录下,结果编译时各种奇葩错误。建议路径里不要有空格和中文。
  • TFTP超时:如果板子下载文件时一直超时,先ping一下PC。很多时候是防火墙没关,或者网线没插好。
  • NFS挂载失败:检查PC上的 /etc/exports 语法,多一个空格都可能报错。用 exportfs -v 查看当前共享状态。
  • Minicom乱码:波特率设置不对。115200是主流,但有些老开发板可能是9600或38400。

好了,环境搭好了,下一章咱们就开始编译内核和文件系统。记住一句话:环境搭得好,开发没烦恼。磨刀不误砍柴工嘛。