第一章 嵌入式Linux开发环境搭建

做嵌入式Linux开发,第一件事就是把环境搭好。这步要是没弄利索,后面调试起来会非常痛苦。我在瑞芯微平台上折腾了几年,踩过不少坑,今天就把这些经验分享给你。

本章核心目标:搭建一套完整的嵌入式Linux开发环境,包括交叉编译工具链、TFTP/NFS服务器、串口终端。这套环境会贯穿整个课程,请务必一次搞定。

1.1 交叉编译工具链安装

说白了,交叉编译就是在你的PC上编译出能在ARM芯片上跑的程序。瑞芯微官方提供了完整的工具链,我们直接用就行。

1.1.1 获取工具链

我个人习惯从瑞芯微官方GitHub仓库下载,版本号清晰,不容易出错。

# 下载RK3588交叉编译工具链
wget https://github.com/rockchip-linux/toolchain/raw/master/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz

# 解压到/opt目录
sudo tar -xvf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt/

我的建议:别把工具链放家目录,放/opt下路径固定,多项目切换时方便。我曾经因为路径混乱,编译A项目用了B项目的工具链,折腾了半天才找到问题。

1.1.2 配置环境变量

每次编译都敲一长串路径太麻烦,配到.bashrc里一劳永逸。

# 编辑~/.bashrc,在末尾添加
export PATH=/opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin:$PATH
export ARCH=arm64
export CROSS_COMPILE=aarch64-none-linux-gnu-

# 使配置生效
source ~/.bashrc

# 验证安装
aarch64-none-linux-gnu-gcc --version

看到版本号输出,说明工具链装好了。嗯,这里要注意:ARCH=arm64和CROSS_COMPILE这两个变量,后面编译内核和uboot时都会用到,提前设好能省不少事。

1.2 TFTP/NFS服务器配置

开发板跑起来后,怎么把程序传上去?怎么挂载根文件系统?TFTP和NFS就是干这个的。你想想看,每次改代码都插拔SD卡,那效率得多低。

1.2.1 TFTP服务器

TFTP用来传内核和设备树,轻量级,够用就行。

# 安装TFTP服务器
sudo apt-get install tftpd-hpa

# 创建TFTP根目录
sudo mkdir -p /srv/tftp
sudo chmod 777 /srv/tftp

# 配置TFTP
sudo vim /etc/default/tftpd-hpa

配置文件内容如下:

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure -c -s"

避坑指南:我曾经在配置TFTP时忘了加-c参数,结果开发板只能下载不能上传,查了半天日志才发现。这个参数允许创建新文件,调试阶段一定要加上。

1.2.2 NFS服务器

NFS用来挂载根文件系统,开发阶段用这个最方便。代码在PC上改,开发板直接跑,不用反复烧写。

# 安装NFS服务器
sudo apt-get install nfs-kernel-server

# 创建NFS共享目录
sudo mkdir -p /srv/nfs/rootfs
sudo chmod 777 /srv/nfs/rootfs

# 配置导出
sudo vim /etc/exports

在exports文件中添加:

/srv/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)

参数说明:

  • rw:读写权限
  • sync:同步写入,保证数据一致性
  • no_root_squash:允许root用户访问,这个很重要,不然开发板上的进程可能没权限写文件
# 重启NFS服务
sudo systemctl restart nfs-kernel-server

# 验证挂载
showmount -e localhost

1.3 串口终端与Minicom使用

串口是嵌入式开发的生命线。板子起不来、内核panic、uboot交互,全得靠它。我见过不少新手,板子没反应就慌了,其实先看看串口有没有输出,八成问题就出在那。

1.3.1 硬件连接

瑞芯微开发板通常用USB转串口,接法很简单:

开发板接口 USB转串口模块
GND GND
TXD RXD
RXD TXD

注意:TX和RX要交叉连接,这是新手最容易犯的错。我曾经帮同事排查问题,折腾了半小时,最后发现是线接反了。

1.3.2 Minicom配置

Minicom是老牌串口工具,稳定可靠。我个人习惯用它,虽然界面简陋了点,但胜在功能扎实。

# 安装Minicom
sudo apt-get install minicom

# 启动配置
sudo minicom -s

进入配置界面后,按以下步骤设置:

  1. 选择"Serial port setup"
  2. 按A键,修改串口设备为/dev/ttyUSB0(根据实际情况调整)
  3. 按E键,设置波特率为115200
  4. 按F键,关闭硬件流控
  5. 按G键,关闭软件流控
  6. 回车返回,选择"Save setup as dfl"保存为默认配置

我的习惯:保存配置后,下次直接sudo minicom就能用。如果遇到乱码,八成是波特率不对,瑞芯微平台默认都是115200。

1.3.3 常用操作

串口连上后,你会看到uboot启动信息,然后是内核打印,最后进入系统。这里有几个常用快捷键:

  • Ctrl+A + Z:打开Minicom帮助菜单
  • Ctrl+A + X:退出Minicom
  • Ctrl+A + L:清屏
  • Ctrl+A + W:开启/关闭换行

1.4 环境验证

所有东西配好后,我们来做个快速验证。把开发板上电,串口应该能看到类似这样的输出:

U-Boot 2017.09 (Jan 10 2024 - 15:30:00 +0800)

DRAM:  8 GiB
MMC:   mmc@fe2c0000: 1, mmc@fe2e0000: 0
Loading Environment from MMC... OK
In:    serial
Out:   serial
Err:   serial
Net:   eth0: ethernet@fe2a0000
Hit any key to stop autoboot:  0

看到这个界面,说明串口通了。接下来在uboot里测试TFTP:

=> setenv serverip 192.168.1.100    # PC的IP
=> setenv ipaddr 192.168.1.10      # 开发板的IP
=> tftp 0x02000000 Image           # 下载内核

如果下载成功,TFTP也配好了。NFS的测试等后面挂载根文件系统时再做,这里先确认网络通就行。

本章小结:环境搭建是嵌入式开发的第一步,也是最容易出问题的一步。工具链、TFTP、NFS、串口,这四个东西配好了,后面的开发就会顺畅很多。我建议你把配置过程记下来,下次换电脑或重装系统时能省不少时间。

嵌入式Linux开发环境架构图 主机PC (Ubuntu) 交叉编译工具链 TFTP服务器 NFS服务器 串口终端 (Minicom) 瑞芯微开发板 ARM Cortex-A系列 Linux内核 + 根文件系统 编译内核/uboot/驱动 传输内核/设备树 挂载根文件系统 调试输出/交互 开发流程 PC上编译 → TFTP传内核 NFS挂载文件系统 → 串口调试 一次配置,全程受益