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/
小提示: 版本别追新。7.5.0这个版本我用了两年,稳定得很。太新的工具链有时会跟老内核不兼容,我在项目中吃过这个亏。

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

看到版本信息,就说明装好了。

注意: 如果你用的是Ubuntu 20.04及以上,也可以直接 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密钥登录,省得每次输密码。用 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,输入密码,就能看到桌面了。

性能优化: VNC默认画质很高,但延迟也大。在BEV模型调试时,我一般把画质调到“低”,帧率能到30fps,够用了。

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 生效。

注意: 别跟局域网里其他设备IP冲突。我建议用 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模型推理框架的骨架——也就是核心的代码结构。到时候你会看到,前面这些准备工作,都是值得的。