2. 开发环境搭建:安装交叉编译工具链、配置TFTP/NFS服务、搭建串口终端
嵌入式Linux开发采用宿主机-目标机分离模式。宿主机(x86_64 PC)上安装交叉编译工具链生成ARM可执行代码,通过TFTP/NFS与目标板交换文件,串口终端提供调试控制台。本章完整搭建这三层基础设施。
2.1 交叉编译工具链安装
ARM平台无法直接运行x86编译程序,必须使用gcc-arm-linux-gnueabihf交叉工具链。该工具链运行在x86宿主机上,生成ARM Cortex-A系列硬浮点(hard-float)指令。
2.1.1 工具链版本选择
| 属性 | 推荐值 | 说明 |
|---|---|---|
| 工具链前缀 | arm-linux-gnueabihf- |
gnueabihf 表示 ARM EABI + 硬浮点 |
| GCC版本 | 10.3.0 / 11.2.0 | 与Linux内核5.10~6.1兼容性最佳 |
| glibc版本 | 2.31 / 2.35 | 匹配目标板rootfs的libc版本 |
| Linux内核头 | 5.10.x | 编译内核模块时需与目标内核一致 |
2.1.2 安装步骤(Ubuntu 22.04 LTS)
- 更新软件源并安装依赖
sudo apt update
sudo apt install -y build-essential flex bison libncurses-dev
sudo apt install -y libssl-dev libelf-dev bc
- 下载Linaro预编译工具链
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
- 验证安装
arm-linux-gnueabihf-gcc --version
arm-linux-gnueabihf-objdump --version
验证输出示例:
arm-linux-gnueabihf-gcc (Linaro GCC 7.5-2019.12) 7.5.0
若提示"command not found",检查PATH路径是否包含bin目录。
arm-linux-gnueabihf-gcc (Linaro GCC 7.5-2019.12) 7.5.0
若提示"command not found",检查PATH路径是否包含bin目录。
2.1.3 交叉编译工具链组件
2.2 TFTP服务配置
TFTP(Trivial File Transfer Protocol)用于U-Boot引导阶段从宿主机下载内核镜像(zImage)、设备树(.dtb)到目标板内存。配置简单,无认证,适合嵌入式调试。
2.2.1 安装与配置
sudo apt install -y tftpd-hpa
# 编辑配置文件
sudo vim /etc/default/tftpd-hpa
配置文件内容:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"
- 创建TFTP根目录并设置权限
sudo mkdir -p /srv/tftp
sudo chmod 777 /srv/tftp
- 重启服务并验证
sudo systemctl restart tftpd-hpa
sudo systemctl enable tftpd-hpa
sudo systemctl status tftpd-hpa
防火墙注意:若宿主机启用UFW,需放行UDP 69端口:
sudo ufw allow 69/udp
2.2.2 测试TFTP传输
# 在TFTP目录放置测试文件
echo "TFTP Test" | sudo tee /srv/tftp/test.txt
# 本地回环测试
tftp localhost
tftp> get test.txt
tftp> quit
# 查看下载的文件
cat test.txt
2.3 NFS服务配置
NFS(Network File System)用于目标板挂载宿主机上的rootfs目录,实现内核启动后直接使用宿主机文件系统,避免反复烧写Flash。调试阶段效率极高。
2.3.1 安装与配置
sudo apt install -y nfs-kernel-server
# 创建NFS导出目录(存放目标板rootfs)
sudo mkdir -p /srv/nfs/rootfs
# 编辑导出文件
sudo vim /etc/exports
添加导出规则:
/srv/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)
| 选项 | 含义 |
|---|---|
* |
允许所有客户端挂载(调试阶段) |
rw |
读写权限 |
sync |
同步写入,保证数据一致性 |
no_subtree_check |
禁用子树检查,提升性能 |
no_root_squash |
允许目标板root用户保留root权限 |
- 应用配置并重启服务
sudo exportfs -ra
sudo systemctl restart nfs-kernel-server
sudo systemctl enable nfs-kernel-server
2.3.2 验证NFS挂载
# 宿主机上自测
sudo mount -t nfs 127.0.0.1:/srv/nfs/rootfs /mnt
ls /mnt
sudo umount /mnt
生产环境建议:将
* 替换为目标板IP(如 192.168.1.100),提高安全性。
2.4 串口终端搭建(Minicom)
串口是嵌入式开发最可靠的调试通道。目标板通过UART转USB线连接宿主机,Minicom作为终端软件提供交互控制台。
2.4.1 硬件连接与驱动
- 连接方式:目标板UART_TX → USB转串口模块RXD,UART_RX → TXD,GND → GND
- 驱动确认:CH340/PL2303/CP2102模块在Ubuntu下自动识别
# 查看串口设备
ls -l /dev/ttyUSB*
# 若没有设备,检查驱动
lsmod | grep usb_serial
2.4.2 安装与配置Minicom
sudo apt install -y minicom
# 进入配置界面
sudo minicom -s
配置步骤:
- 选择 Serial port setup
- 按 A 修改串口设备:
/dev/ttyUSB0 - 按 E 设置波特率:
115200 8N1 - 按 F 关闭硬件流控(Hardware Flow Control: No)
- 按 G 关闭软件流控(Software Flow Control: No)
- 选择 Save setup as dfl 保存为默认配置
- 选择 Exit 进入终端
2.4.3 串口参数速查表
| 参数 | 典型值 | 说明 |
|---|---|---|
| 波特率 | 115200 | U-Boot和内核默认串口波特率 |
| 数据位 | 8 | 标准8位数据 |
| 停止位 | 1 | 1位停止位 |
| 校验位 | None | 无校验 |
| 流控 | None | 关闭硬件/软件流控 |
2.4.4 Minicom常用操作
- 退出Minicom:
Ctrl+A然后按X,选择Yes - 打开/关闭回显:
Ctrl+A然后按E - 发送文件:
Ctrl+A然后按S,选择协议(zmodem) - 清屏:
Ctrl+A然后按C
权限问题:若提示
重新登录后生效。
Cannot open /dev/ttyUSB0,将当前用户加入dialout组:sudo usermod -a -G dialout $USER重新登录后生效。
2.5 开发环境整体架构
2.6 环境验证清单
完成上述配置后,执行以下验证步骤确保环境就绪:
| 序号 | 验证项 | 命令/方法 | 预期结果 |
|---|---|---|---|
| 1 | 交叉编译器可用 | arm-linux-gnueabihf-gcc --version |
显示版本号,无报错 |
| 2 | TFTP服务运行 | systemctl status tftpd-hpa |
active (running) |
| 3 | TFTP文件传输 | tftp localhost -c get test.txt |
文件下载成功 |
| 4 | NFS服务运行 | systemctl status nfs-kernel-server |
active (exited) |
| 5 | NFS导出正确 | showmount -e localhost |
显示 /srv/nfs/rootfs |
| 6 | 串口设备识别 | ls -l /dev/ttyUSB* |
显示 ttyUSB0 等设备 |
| 7 | Minicom可启动 | minicom |
进入终端界面,无报错 |