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