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

嵌入式Linux开发与桌面开发最大的区别在于交叉编译与目标板通信。本章将系统搭建一套完整的开发环境,涵盖交叉编译工具链的安装、TFTP/NFS服务的配置,以及串口终端Minicom的使用。这套环境是后续内核移植、设备树调试和驱动开发的基础。

环境概览:主机为 x86_64 Ubuntu 22.04 LTS,目标板为 ARM Cortex-A7/A9 平台。所有工具链和服务均在此主机上配置。

2.1 交叉编译工具链安装

交叉编译工具链允许我们在高性能的x86主机上编译出ARM架构的可执行文件。根据目标平台的不同,工具链的获取方式也有所区别。

2.1.1 工具链选择与下载

工具链类型 适用平台 下载/安装方式 前缀示例
Linaro GCC ARMv7-A (Cortex-A系列) apt 安装或官网下载 arm-linux-gnueabihf-
ARM GCC (官方) ARMv8-A (Cortex-A53/72) apt 安装或官网下载 aarch64-linux-gnu-
Buildroot 生成 自定义平台 Buildroot 编译生成 arm-buildroot-linux-uclibcgnueabihf-
SoC厂商提供 特定SoC (如全志、瑞芯微) 厂商SDK包内 arm-poky-linux-gnueabi-

2.1.2 安装步骤(以Linaro ARMv7为例)

  1. 更新系统包索引:sudo apt update
  2. 安装交叉编译工具链:sudo apt install gcc-arm-linux-gnueabihf
  3. 验证安装:arm-linux-gnueabihf-gcc --version
  4. 测试编译:编写一个简单的C程序,使用交叉编译器编译。
# 编写测试文件
echo '#include <stdio.h>
int main() { printf("Hello ARM!\n"); return 0; }' > test.c

# 交叉编译
arm-linux-gnueabihf-gcc -o test_arm test.c

# 查看生成文件的架构
file test_arm
# 输出应包含:ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV)
关键点:交叉编译器的前缀决定了目标架构。arm-linux-gnueabihf- 中的 "hf" 表示硬浮点,适用于带有硬件浮点单元的ARM Cortex-A处理器。

2.1.3 工具链路径与环境变量

为了在任意目录下都能调用交叉编译器,建议将工具链路径添加到 PATH 环境变量中。如果使用apt安装,工具链通常位于 /usr/bin/,无需额外配置。如果手动解压到特定目录,则需要配置:

# 假设工具链解压在 /opt/toolchains/gcc-arm-10.3-2021.07-x86_64-arm-linux-gnueabihf
export PATH=/opt/toolchains/gcc-arm-10.3-2021.07-x86_64-arm-linux-gnueabihf/bin:$PATH

# 永久生效:将上述命令添加到 ~/.bashrc 或 ~/.profile
echo 'export PATH=/opt/toolchains/gcc-arm-10.3-2021.07-x86_64-arm-linux-gnueabihf/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

2.2 TFTP/NFS服务配置

在嵌入式开发中,TFTP和NFS是两种最常用的网络服务,用于将内核、设备树和根文件系统传输到目标板。

2.2.1 TFTP服务(Trivial File Transfer Protocol)

TFTP用于在U-Boot引导阶段快速下载内核镜像(zImage/uImage)和设备树文件(.dtb)。

  1. 安装TFTP服务器:sudo apt install tftpd-hpa
  2. 配置TFTP目录:编辑 /etc/default/tftpd-hpa,设置 TFTP_DIRECTORY="/srv/tftp"
  3. 创建目录并设置权限:sudo mkdir -p /srv/tftp && sudo chmod 777 /srv/tftp
  4. 重启服务:sudo systemctl restart tftpd-hpa
  5. 测试服务:在 /srv/tftp 下放置一个测试文件,在目标板U-Boot中使用 tftp 0x82000000 test.txt 下载。
常见问题:TFTP服务默认使用UDP 69端口。如果目标板无法下载,请检查主机防火墙是否放行该端口:sudo ufw allow 69/udp。

2.2.2 NFS服务(Network File System)

NFS用于在开发阶段将主机的根文件系统目录挂载到目标板上,避免反复烧写Flash,极大提高调试效率。

  1. 安装NFS服务器:sudo apt install nfs-kernel-server
  2. 配置导出目录:编辑 /etc/exports,添加一行:/srv/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)
  3. 创建根文件系统目录:sudo mkdir -p /srv/nfs/rootfs,并将构建好的根文件系统解压到此目录。
  4. 重启NFS服务:sudo systemctl restart nfs-kernel-server
  5. 验证挂载:在目标板内核启动参数中设置 root=/dev/nfs nfsroot=192.168.1.100:/srv/nfs/rootfs。
参数说明:no_root_squash 允许目标板以root身份访问NFS共享,这是嵌入式开发中的常见需求。生产环境中应谨慎使用。

2.2.3 TFTP与NFS工作流程

TFTP/NFS 在嵌入式开发中的工作流程 开发主机 (x86) Ubuntu 22.04 目标板 (ARM) Cortex-A7/A9 TFTP 服务器 /srv/tftp U-Boot 引导 tftp 下载内核/DTB NFS 服务器 /srv/nfs/rootfs 内核挂载根文件系统 nfsroot 参数 TFTP (UDP 69) zImage + .dtb NFS (TCP 2049) 根文件系统

2.3 串口终端与Minicom使用

串口是嵌入式开发中最基本、最可靠的调试接口。通过串口终端,我们可以查看U-Boot启动日志、内核打印信息(printk),并进入系统Shell。

2.3.1 硬件连接与识别

通常使用USB转串口适配器(如CH340、CP2102、FT232)连接目标板的UART接口。连接方式如下:

目标板接口 USB转串口适配器 说明
TXD RXD 交叉连接
RXD TXD 交叉连接
GND GND 共地
VCC (可选) VCC (3.3V/5V) 部分适配器可为目标板供电

连接后,在主机上使用 ls /dev/ttyUSB* 或 ls /dev/ttyACM* 查看设备节点。

2.3.2 Minicom安装与配置

  1. 安装Minicom:sudo apt install minicom
  2. 启动配置:sudo minicom -s
  3. 配置串口参数:进入 "Serial port setup",按以下参数设置:
    • A - Serial Device:/dev/ttyUSB0(根据实际设备修改)
    • B - Lockfile Location:/var/lock
    • E - Bps/Par/Bits:115200 8N1(波特率115200,8数据位,无校验,1停止位)
    • F - Hardware Flow Control:No
    • G - Software Flow Control:No
  4. 保存配置:选择 "Save setup as dfl",然后选择 "Exit" 进入终端界面。
快速启动:配置保存后,后续只需执行 sudo minicom 即可直接连接。如果遇到权限问题,将当前用户加入 dialout 组:sudo usermod -a -G dialout $USER,然后重新登录。

2.3.3 Minicom常用操作

快捷键 功能
Ctrl+A 然后 Z 打开帮助菜单
Ctrl+A 然后 X 退出Minicom
Ctrl+A 然后 L 捕获日志到文件
Ctrl+A 然后 O 进入配置菜单
Ctrl+A 然后 W 换行开关(用于查看长行日志)

2.3.4 串口调试流程

串口终端调试流程 1. 硬件连接 TXD↔RXD, GND↔GND 2. 识别设备 ls /dev/ttyUSB* 3. 配置Minicom 115200 8N1 4. 连接 sudo minicom 串口输出示例 U-Boot 2023.04 (Jan 01 2024 - 12:00:00 +0000) DRAM: 512 MiB | NAND: 256 MiB | MMC: 8 GiB Hit any key to stop autoboot: 0

2.4 环境验证与常见问题

2.4.1 验证清单

完成上述配置后,建议按以下清单逐项验证,确保环境可用:

验证项 验证方法 预期结果
交叉编译器 arm-linux-gnueabihf-gcc -v 显示版本信息,无错误
TFTP服务 在目标板U-Boot执行 tftp 0x82000000 test.txt 显示 "Bytes transferred = xx"
NFS服务 在目标板执行 mount -t nfs 192.168.1.100:/srv/nfs/rootfs /mnt 挂载成功,可列出文件
串口通信 目标板上电,观察Minicom窗口 显示U-Boot启动日志

2.4.2 常见问题与解决

  • Minicom无法打开串口:检查用户是否在 dialout 组,或使用 sudo 运行。
  • TFTP传输超时:检查主机防火墙(sudo ufw status),确认目标板IP与主机在同一网段。
  • NFS挂载失败:检查 /etc/exports 语法,重启NFS服务后使用 showmount -e 验证导出目录。
  • 交叉编译报错"cannot find crt1.o":工具链路径配置错误,或使用了错误的架构前缀。
网络配置提示:开发主机与目标板建议使用静态IP,并连接到同一交换机或直连网线。主机IP示例:192.168.1.100,目标板IP示例:192.168.1.200,子网掩码:255.255.255.0。