3、开发环境搭建:交叉编译工具链安装、系统镜像烧录、SSH与VNC远程调试配置
好,咱们正式开始动手了。
这一章,说白了就是给你的开发板“装系统、配环境、连上去”。很多新手在这一步就卡住了,其实没必要。我当年第一次搞嵌入式,光烧录就折腾了一下午——后来发现是SD卡没插紧。嗯,这种坑咱们今天一并避开。
3.1 交叉编译工具链安装
先说说为什么需要交叉编译。你想想看,你的电脑是x86架构,而BEV模型要跑在ARM架构的板子上(比如Jetson Orin、RK3588)。在x86上编译ARM能跑的程序,这就是“交叉编译”。
我个人习惯把工具链放在 /opt 目录下,干净利落。
3.1.1 下载与解压
以ARM64(aarch64)为例,我用的是Linaro提供的GCC工具链:
# 下载
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
# 解压到 /opt
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /opt/
3.1.2 配置环境变量
解压完,得让系统知道它在哪里。编辑 ~/.bashrc:
export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin
export CROSS_COMPILE=aarch64-linux-gnu-
export ARCH=arm64
然后 source ~/.bashrc 让它生效。验证一下:
aarch64-linux-gnu-gcc --version
看到版本信息,就说明装好了。
sudo apt install gcc-aarch64-linux-gnu。但我建议手动装,因为apt源里的版本可能比较老,而且你后面做BEV模型优化时,可能需要特定版本的GCC。
3.2 系统镜像烧录
接下来,给板子“装系统”。我以NVIDIA Jetson Orin为例,其他板子流程类似。
3.2.1 准备工作
- 一张32GB以上的SD卡(或NVMe SSD)
- 读卡器
- 系统镜像文件(从官网下载,比如JetPack 5.1.2)
3.2.2 烧录步骤
我个人推荐用 balenaEtcher 这个工具,图形化,简单粗暴。当然,命令行也行:
# 先查看SD卡设备名
lsblk
# 假设是 /dev/sdb,注意别搞错!
sudo dd if=jetpack_5.1.2_linux_jetson_orin.img of=/dev/sdb bs=4M status=progress
sync
bs=4M 能加快写入速度。status=progress 可以看进度条。我曾经用默认参数烧了40分钟,加了这两个参数后,15分钟搞定。
3.2.3 首次启动
把SD卡插回板子,接上HDMI显示器和键盘鼠标,上电。第一次启动会进入初始化设置——设置用户名、密码、时区等。这里我建议:
- 用户名用
nvidia(默认) - 密码别太复杂,开发机而已,方便为主
- 时区选
Asia/Shanghai
3.3 SSH与VNC远程调试配置
板子接显示器用着不爽,对吧?咱们把它“藏”起来,远程操控。
3.3.1 开启SSH
Jetson Orin默认是开启SSH的。如果没有,手动启动:
sudo systemctl enable ssh
sudo systemctl start ssh
查看IP地址:
ip addr show
然后在你电脑上:
ssh nvidia@192.168.1.100
输入密码,就连上了。
ssh-copy-id 一键搞定。
3.3.2 配置VNC远程桌面
有时候需要图形界面,比如调试BEV模型的可视化部分。VNC就派上用场了。
我推荐用 vino(GNOME自带的VNC服务器):
# 安装
sudo apt install vino
# 开启VNC
gsettings set org.gnome.Vino enabled true
gsettings set org.gnome.Vino prompt-enabled false
gsettings set org.gnome.Vino require-encryption false
# 设置密码
gsettings set org.gnome.Vino authentication-methods "['vnc']"
gsettings set org.gnome.Vino vnc-password $(echo -n "yourpassword" | base64)
然后重启一下:
sudo reboot
在电脑上用VNC Viewer连接 192.168.1.100:5900,输入密码,就能看到桌面了。
3.3.3 固定IP地址
每次重启IP都变,很烦。我习惯在路由器上绑定MAC地址,或者在板子上设置静态IP:
sudo nano /etc/netplan/01-netcfg.yaml
修改为:
network:
version: 2
ethernets:
eth0:
dhcp4: no
addresses:
- 192.168.1.100/24
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 114.114.114.114]
然后 sudo netplan apply 生效。
100-200 之间的地址,一般不会撞车。
3.4 验证环境
最后,写个简单的C程序,交叉编译一下,验证工具链是否正常:
// hello_bev.c
#include <stdio.h>
int main() {
printf("Hello, BEV World!\n");
return 0;
}
编译:
aarch64-linux-gnu-gcc hello_bev.c -o hello_bev
用 file 命令查看:
file hello_bev
# 输出: ELF 64-bit LSB executable, ARM aarch64, ...
然后通过SCP传到板子上运行:
scp hello_bev nvidia@192.168.1.100:~/
ssh nvidia@192.168.1.100 ./hello_bev
看到 Hello, BEV World! 就说明环境全通了。
/workspace 目录,专门放交叉编译好的程序。这样结构清晰,后面做BEV模型推理时也方便管理。
好,环境搭好了。下一章咱们开始搭建BEV模型推理框架的骨架——也就是核心的代码结构。到时候你会看到,前面这些准备工作,都是值得的。