第二章 开发环境搭建:工欲善其事,必先利其器

说实话,搭建开发环境这事儿,看着琐碎,但真不能马虎。我见过太多新手,一上来就急着写代码,结果编译报错、烧录失败,折腾半天发现是工具链没装对。嗯,咱们还是先把地基打牢。

这一章,我会带你一步步搞定三件事:交叉编译工具链TFTP/NFS服务、以及Buildroot/Yocto环境。这三样东西,说白了就是你跟瑞芯微芯片沟通的「翻译官」和「快递员」。

2.1 安装交叉编译工具链(gcc-arm)

交叉编译是什么?简单说,就是你在电脑上写代码,编译出来的程序却要在ARM芯片上跑。你的电脑是x86架构,芯片是ARM架构,这中间就需要一个「翻译官」——交叉编译工具链。

我个人习惯用gcc-arm-10.3-2021.07这个版本,瑞芯微官方推荐,稳定可靠。你问我为什么选这个?我在项目里踩过坑,用太新的版本有时会跟内核不兼容,太老的又缺特性。这个版本,刚刚好。

2.1.1 下载与解压

先到ARM官网或者瑞芯微的Github仓库下载。我建议直接去ARM官网,链接稳定,不会被墙。

# 下载
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz

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

解压完你会得到一个文件夹,里面就是完整的工具链。嗯,这里要注意,/opt目录需要root权限,别偷懒用普通用户解压,不然后面权限问题够你头疼的。

2.1.2 配置环境变量

解压完只是第一步,你得让系统知道这个工具链在哪。配置环境变量,说白了就是告诉系统:「嘿,我的编译器在这儿呢!」

# 编辑 ~/.bashrc 或 ~/.zshrc
vim ~/.bashrc

# 在文件末尾添加
export PATH=$PATH:/opt/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin

# 使配置生效
source ~/.bashrc
小技巧:我个人习惯把工具链路径单独写到一个脚本里,比如 /opt/env_setup.sh,然后在 .bashrc 里 source 它。这样换工具链版本时,只改一个文件就行,干净利落。

2.1.3 验证安装

配置完,验证一下。运行下面命令,看看能不能看到版本信息。

arm-none-linux-gnueabihf-gcc --version

如果看到类似 gcc version 10.3.1 20210621 (ARM GNU Toolchain ...) 的输出,恭喜你,工具链装好了。

注意:我曾经遇到过一个问题——明明配置了环境变量,但运行命令还是提示「command not found」。后来发现是终端没重启,或者 source 没执行。你想想看,环境变量只在当前shell生效,新开一个终端窗口,得重新加载。所以,要么 source,要么重启终端。

2.2 配置TFTP/NFS服务

工具链装好了,接下来要解决「怎么把编译好的程序送到开发板上跑」的问题。这里有两个常用服务:TFTPNFS

  • TFTP:简单文件传输协议,常用于网络启动时下载内核和设备树。
  • NFS:网络文件系统,可以把开发板上的目录挂载到电脑上,方便调试。

说白了,TFTP是「一次性快递」,NFS是「共享文件夹」。两者配合使用,开发效率能翻倍。

2.2.1 安装与配置TFTP

在Ubuntu上安装TFTP服务很简单:

sudo apt-get install tftp-hpa tftpd-hpa

安装完,配置一下。编辑 /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"

这里 TFTP_DIRECTORY 是TFTP的根目录,我习惯用 /tftpboot。记得创建这个目录并给权限:

sudo mkdir -p /tftpboot
sudo chmod 777 /tftpboot

重启服务:

sudo systemctl restart tftpd-hpa
避坑指南:我曾经因为防火墙没关,TFTP死活连不上。检查一下防火墙状态:sudo ufw status。如果开着,要么关掉,要么开放69端口。

2.2.2 安装与配置NFS

NFS的安装同样简单:

sudo apt-get install nfs-kernel-server

配置NFS共享目录,编辑 /etc/exports

/nfsroot *(rw,sync,no_subtree_check,no_root_squash)

创建目录并重启服务:

sudo mkdir -p /nfsroot
sudo chmod 777 /nfsroot
sudo systemctl restart nfs-kernel-server

这里 no_root_squash 是关键——允许开发板以root权限访问共享目录。不然你写文件时会提示权限不足,别问我怎么知道的。

2.3 搭建Buildroot/Yocto环境

Buildroot和Yocto,这两个东西是干嘛的?简单说,它们是用来定制Linux系统的工具。你想让开发板跑什么软件、用什么内核、文件系统多大,都由它们说了算。

我个人更推荐新手从Buildroot入手,配置简单,编译快。Yocto功能更强大,但学习曲线陡峭,适合有经验后再挑战。

2.3.1 搭建Buildroot环境

先下载Buildroot源码。我习惯用长期支持版,比如2023.02.x:

git clone https://git.buildroot.net/buildroot -b 2023.02.x
cd buildroot

配置Buildroot。瑞芯微官方提供了默认配置,比如RK3568:

make rockchip_rk3568_defconfig

然后开始编译。第一次编译会下载很多依赖包,时间比较长,建议用个好点的网络:

make

编译完成后,输出文件在 output/images/ 目录下。你会看到 u-boot.binzImagerootfs.ext4 等文件。这些就是你要烧录到开发板上的东西。

重要提示:Buildroot编译时,默认会使用单线程。你可以用 make -j$(nproc) 来启用多线程编译,速度能快好几倍。但注意,如果内存不够(小于8GB),建议别用太多线程,否则会卡死。

2.3.2 搭建Yocto环境

Yocto的搭建稍微复杂一些。先安装依赖包:

sudo apt-get install gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev xterm python3-subunit mesa-common-dev

然后下载Yocto的Poky分支和瑞芯微的BSP层:

git clone git://git.yoctoproject.org/poky -b kirkstone
git clone https://github.com/rockchip-linux/meta-rockchip.git

初始化构建环境:

cd poky
source oe-init-build-env build

编辑 conf/bblayers.conf,添加瑞芯微的BSP层:

BBLAYERS ?= " \
  /path/to/poky/meta \
  /path/to/poky/meta-poky \
  /path/to/poky/meta-yocto-bsp \
  /path/to/meta-rockchip \
  "

编辑 conf/local.conf,设置目标机器:

MACHINE ??= "rockchip-rk3568"

然后开始编译:

bitbake core-image-minimal

Yocto的编译时间比Buildroot长得多,我第一次编译RK3568的镜像,用了将近4个小时。所以,建议你找个空闲时间跑,或者用个性能好点的电脑。

注意:Yocto编译过程中,网络一定要稳定。它会在编译时下载大量源码包,一旦断网,整个构建可能失败。我建议用个代理或者提前把源码包下载好。

2.4 本章小结

这一章的内容,说白了就是三件事:装工具链、配网络服务、搭构建环境。每一步都不难,但每一步都容易出错。我个人建议你按照顺序来,每完成一步就验证一下,别一口气全搞完再回头查问题。

嗯,环境搭好了,下一章咱们就开始真正写代码了。到时候你会发现,前面这些准备工作,花得值。