第二章 开发环境搭建:工欲善其事,必先利其器
说实话,搭建开发环境这事儿,看着琐碎,但真不能马虎。我见过太多新手,一上来就急着写代码,结果编译报错、烧录失败,折腾半天发现是工具链没装对。嗯,咱们还是先把地基打牢。
这一章,我会带你一步步搞定三件事:交叉编译工具链、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 ...) 的输出,恭喜你,工具链装好了。
source 没执行。你想想看,环境变量只在当前shell生效,新开一个终端窗口,得重新加载。所以,要么 source,要么重启终端。
2.2 配置TFTP/NFS服务
工具链装好了,接下来要解决「怎么把编译好的程序送到开发板上跑」的问题。这里有两个常用服务:TFTP 和 NFS。
- 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
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.bin、zImage、rootfs.ext4 等文件。这些就是你要烧录到开发板上的东西。
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个小时。所以,建议你找个空闲时间跑,或者用个性能好点的电脑。
2.4 本章小结
这一章的内容,说白了就是三件事:装工具链、配网络服务、搭构建环境。每一步都不难,但每一步都容易出错。我个人建议你按照顺序来,每完成一步就验证一下,别一口气全搞完再回头查问题。
嗯,环境搭好了,下一章咱们就开始真正写代码了。到时候你会发现,前面这些准备工作,花得值。