第一章 嵌入式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
进入配置界面后,按以下步骤设置:
- 选择"Serial port setup"
- 按A键,修改串口设备为
/dev/ttyUSB0(根据实际情况调整) - 按E键,设置波特率为
115200 - 按F键,关闭硬件流控
- 按G键,关闭软件流控
- 回车返回,选择"Save setup as dfl"保存为默认配置
我的习惯:保存配置后,下次直接sudo minicom就能用。如果遇到乱码,八成是波特率不对,瑞芯微平台默认都是115200。
1.3.3 常用操作
串口连上后,你会看到uboot启动信息,然后是内核打印,最后进入系统。这里有几个常用快捷键:
Ctrl+A+Z:打开Minicom帮助菜单Ctrl+A+X:退出MinicomCtrl+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、串口,这四个东西配好了,后面的开发就会顺畅很多。我建议你把配置过程记下来,下次换电脑或重装系统时能省不少时间。