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)

  1. 更新软件源并安装依赖
sudo apt update
sudo apt install -y build-essential flex bison libncurses-dev
sudo apt install -y libssl-dev libelf-dev bc
  1. 下载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/
  1. 配置环境变量
echo 'export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin' >> ~/.bashrc
source ~/.bashrc
  1. 验证安装
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目录。

2.1.3 交叉编译工具链组件

交叉编译工具链组件结构 arm-linux-gnueabihf-* 编译器 (gcc/g++) 汇编器/链接器 (as/ld) 库/头文件 (glibc/linux) .o / .ko 目标文件 .elf / .bin 可执行文件 .dtb 设备树二进制 工具链前缀 arm-linux-gnueabihf- 后接 gcc/ld/objcopy/objdump 等命令

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"
  1. 创建TFTP根目录并设置权限
sudo mkdir -p /srv/tftp
sudo chmod 777 /srv/tftp
  1. 重启服务并验证
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权限
  1. 应用配置并重启服务
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

配置步骤:

  1. 选择 Serial port setup
  2. 按 A 修改串口设备:/dev/ttyUSB0
  3. 按 E 设置波特率:115200 8N1
  4. 按 F 关闭硬件流控(Hardware Flow Control: No)
  5. 按 G 关闭软件流控(Software Flow Control: No)
  6. 选择 Save setup as dfl 保存为默认配置
  7. 选择 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 开发环境整体架构

宿主机-目标板开发环境架构 宿主机 (x86_64 Ubuntu) 交叉编译工具链 TFTP服务 (udp:69) NFS服务 (tcp:2049) Minicom串口终端 目标板 (ARM Cortex-A) U-Boot引导程序 Linux内核 NFS Rootfs 串口控制台 TFTP: zImage/dtb NFS: rootfs 串口: 115200 8N1 工作流程:宿主机编译内核 → TFTP下载到目标板 → NFS挂载rootfs → 串口输出调试信息 所有服务通过以太网(TFTP/NFS)和USB串口线连接

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 进入终端界面,无报错