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为例)
- 更新系统包索引:
sudo apt update - 安装交叉编译工具链:
sudo apt install gcc-arm-linux-gnueabihf - 验证安装:
arm-linux-gnueabihf-gcc --version - 测试编译:编写一个简单的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)。
- 安装TFTP服务器:
sudo apt install tftpd-hpa - 配置TFTP目录:编辑
/etc/default/tftpd-hpa,设置TFTP_DIRECTORY="/srv/tftp" - 创建目录并设置权限:
sudo mkdir -p /srv/tftp && sudo chmod 777 /srv/tftp - 重启服务:
sudo systemctl restart tftpd-hpa - 测试服务:在
/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,极大提高调试效率。
- 安装NFS服务器:
sudo apt install nfs-kernel-server - 配置导出目录:编辑
/etc/exports,添加一行:/srv/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash) - 创建根文件系统目录:
sudo mkdir -p /srv/nfs/rootfs,并将构建好的根文件系统解压到此目录。 - 重启NFS服务:
sudo systemctl restart nfs-kernel-server - 验证挂载:在目标板内核启动参数中设置
root=/dev/nfs nfsroot=192.168.1.100:/srv/nfs/rootfs。
参数说明:
no_root_squash 允许目标板以root身份访问NFS共享,这是嵌入式开发中的常见需求。生产环境中应谨慎使用。
2.2.3 TFTP与NFS工作流程
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安装与配置
- 安装Minicom:
sudo apt install minicom - 启动配置:
sudo minicom -s - 配置串口参数:进入 "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
- A - Serial Device:
- 保存配置:选择 "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 串口调试流程
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。