2、嵌入式Linux开发环境搭建

说实话,嵌入式Linux开发最让人头疼的往往不是代码本身,而是环境搭建。我见过太多新手卡在这一步,折腾一整天连个Hello World都跑不起来。今天我就把这几年的经验掰开揉碎,带你一步步把环境搭好。

嵌入式Linux开发环境搭建 - 知识体系 开发环境搭建 交叉编译工具链 网络配置 TFTP/NFS服务 SSH/串口调试 gcc-arm-linux-gnueabihf NFS/静态IP tftp-hpa / nfs-kernel-server openssh-server / minicom 四大核心模块 · 环环相扣 · 缺一不可

2.1 交叉编译工具链安装

交叉编译,说白了就是在你的PC上编译出能在ARM板子上跑的程序。为什么不能直接在板子上编译?嗯,板子的CPU性能太弱了,编译个Linux内核可能要等半天。我刚开始做的时候也想过直接在板子上编译,结果等了一个小时还没编译完...从那以后我就老老实实用交叉编译了。

2.1.1 下载与安装

我个人习惯用Linaro提供的工具链,稳定且社区活跃。以ARM Cortex-A7为例:

# 下载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

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

# 添加环境变量
echo 'export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin' >> ~/.bashrc
source ~/.bashrc
小提示: 我个人建议把工具链放在 /opt 目录下,别放 /usr/local。为什么?因为 /opt 就是专门放第三方软件的,管理起来清晰。我曾经见过有人把工具链散落在各个目录,最后自己都找不到了。

2.1.2 验证安装

# 检查版本
arm-linux-gnueabihf-gcc --version

# 编译一个简单的测试程序
arm-linux-gnueabihf-gcc -o hello hello.c

# 查看生成的文件类型
file hello
# 输出: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV)
关键点: 看到 "ARM" 字样就对了。如果显示的是 "x86-64",说明你用的是本地编译器,不是交叉编译器。

2.2 目标板与宿主机网络配置

网络配置这块,我踩过的坑最多。你想想看,板子和PC之间通信都搞不定,后面还怎么调试?

2.2.1 网络拓扑

最简单的做法:用一根网线直连板子和PC。或者通过路由器/交换机连接。我个人推荐直连,少一层设备少一层故障点。

设备 IP地址 子网掩码 网关
宿主机(PC) 192.168.1.100 255.255.255.0 192.168.1.1
目标板 192.168.1.200 255.255.255.0 192.168.1.1

2.2.2 配置步骤

宿主机端配置:

# 查看网卡名称
ip addr

# 配置静态IP(以eth0为例)
sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0 up

目标板端配置(U-Boot或Linux内核启动后):

# U-Boot中设置
setenv ipaddr 192.168.1.200
setenv serverip 192.168.1.100
saveenv

# Linux内核启动后
ifconfig eth0 192.168.1.200 netmask 255.255.255.0 up
注意: 我曾经犯过一个低级错误——PC和板子的IP冲突了。两台设备IP不能一样,这是常识,但忙起来真会忘。建议把板子的IP写在便利贴上,贴在显示器旁边。

2.3 TFTP/NFS服务搭建

这两个服务是嵌入式开发的"左膀右臂"。TFTP用来快速下载内核和设备树,NFS用来挂载根文件系统。说白了,一个管启动,一个管运行。

2.3.1 TFTP服务

# 安装TFTP服务
sudo apt-get install tftp-hpa tftpd-hpa

# 创建TFTP目录
sudo mkdir -p /tftpboot
sudo chmod 777 /tftpboot

# 配置TFTP
sudo vim /etc/default/tftpd-hpa

# 内容如下:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"

# 重启服务
sudo systemctl restart tftpd-hpa
经验之谈: TFTP目录权限一定要给够。我遇到过好几次,明明文件在目录里,板子就是下载不下来,最后发现是权限问题。chmod 777虽然粗暴,但管用。

2.3.2 NFS服务

# 安装NFS服务
sudo apt-get install nfs-kernel-server

# 创建NFS共享目录
sudo mkdir -p /nfsroot
sudo chmod 777 /nfsroot

# 配置NFS导出
sudo vim /etc/exports

# 添加一行:
/nfsroot *(rw,sync,no_root_squash,no_subtree_check)

# 重启服务
sudo systemctl restart nfs-kernel-server

目标板挂载NFS:

# 在U-Boot中设置内核启动参数
setenv bootargs 'console=ttyS0,115200 root=/dev/nfs nfsroot=192.168.1.100:/nfsroot ip=192.168.1.200'

# 或者在Linux中手动挂载
mount -t nfs -o nolock 192.168.1.100:/nfsroot /mnt

2.4 SSH与串口调试

调试手段就两种:SSH(网络通的时候用)和串口(网络不通的时候用)。我个人的习惯是,只要能SSH就绝不用串口,因为串口速度太慢了,传个文件能急死人。

2.4.1 SSH配置

# 目标板安装SSH服务(如果文件系统里有)
apt-get install openssh-server

# 启动SSH服务
/etc/init.d/ssh start

# 宿主机连接
ssh root@192.168.1.200
注意: 第一次连接会提示确认主机密钥,输入yes就行。如果连不上,先ping一下,看看网络通不通。我遇到过很多次,折腾半天SSH配置,最后发现是网线没插好。

2.4.2 串口调试

串口是最后的保底手段。不管网络通不通,串口总能给你输出点信息。

# 安装串口工具
sudo apt-get install minicom

# 配置minicom
sudo minicom -s

# 串口配置参数:
# 波特率:115200
# 数据位:8
# 停止位:1
# 校验:无
# 流控:无

# 启动串口
sudo minicom -D /dev/ttyUSB0
避坑指南: 我曾经因为串口线的问题折腾了一整天。有些USB转串口线质量很差,丢数据是常事。建议买FTDI芯片的线,贵是贵点,但稳定。另外,串口电压也要注意,3.3V的板子别用5V的串口线,会烧芯片。

2.4.3 串口常见问题排查

现象 可能原因 解决方法
无输出 串口线接反了 交换TX和RX
乱码 波特率不匹配 检查波特率设置
输出不全 流控设置错误 关闭硬件流控
设备找不到 驱动未安装 安装CH340/PL2303驱动

好了,环境搭建这部分就这些内容。说实话,这些步骤看起来多,但熟练了之后十分钟就能搞定。关键是理解每一步在做什么,而不是机械地复制粘贴命令。下次遇到问题,你就能自己排查了。


公众号:蓝海资料掘金营,微信deep3321