3. 开发环境搭建:NVIDIA SDK Manager 安装、JetPack 刷机、交叉编译工具链配置

说实话,做汽车电子域控制器开发,环境搭建这一步最容易被低估。很多人觉得不就是装个软件嘛,结果一上手就卡住好几天。我当年第一次给 Orin 刷机,愣是折腾到凌晨三点——后来发现只是 USB 线质量不行。嗯,这节课咱们就把这些坑一个个填平。

3.1 NVIDIA SDK Manager 安装

SDK Manager 是 NVIDIA 官方的一站式工具。说白了,它就是帮你搞定驱动、库、工具链的「管家」。我个人习惯在 Ubuntu 20.04/22.04 上跑它,Windows 虽然也能用,但坑比较多。

安装步骤:

  1. 去 NVIDIA 官网下载 SDK Manager 的 .deb 包
  2. 终端执行:sudo dpkg -i sdkmanager_*.deb
  3. 如果报依赖错误,跑 sudo apt --fix-broken install
  4. 启动:sdkmanager(或者从应用菜单里点)
注意: 我曾经因为系统语言没设成英文,导致 SDK Manager 界面乱码。建议把系统语言切到 English (US),否则有些路径解析会出问题。

登录你的 NVIDIA 开发者账号。这一步必须要有账号,没有的话去注册一个。我建议用 Chrome 浏览器登录,Firefox 有时候会卡在 OAuth 认证那一步。

3.2 JetPack 刷机

JetPack 是什么?它是一整套软件包的集合,包含 Linux 内核、Bootloader、CUDA、cuDNN、TensorRT 等等。你想想看,如果没有 JetPack,你得手动一个个装这些组件,版本还得自己配——那画面太美我不敢看。

刷机流程:

  1. 把 Orin 开发板用 USB-C 线连到主机(注意:一定要用原装线,我吃过亏)
  2. 让 Orin 进入强制恢复模式:按住 RECOVERY 键,再按一下 RESET,保持 RECOVERY 键 2 秒后松开
  3. 在主机上执行 lsusb,如果看到 0955:7023 之类的设备,说明连接成功
  4. 打开 SDK Manager,选择你的硬件平台(比如 Jetson AGX Orin)
  5. 勾选需要的组件:至少选 Jetson Linux、CUDA、cuDNN、TensorRT
  6. 点击「Flash」开始刷机

关键参数表(以 Orin NX 16GB 为例):

组件推荐版本说明
Jetson LinuxR35.4.1内核 5.15,支持 PREEMPT_RT
CUDA11.8域控制器推理常用版本
cuDNN8.9.4配合 TensorRT 8.6 使用
TensorRT8.6.1支持 INT8 量化,对车载场景很关键

刷机大概需要 20-40 分钟,取决于你的 USB 速度和 SD 卡性能。我建议用 SSD 做系统盘,别用 eMMC——车载日志写起来,eMMC 寿命扛不住。

小技巧: 刷机完成后,第一次启动会进入初始设置界面。记得把用户密码设成你常用的,后面交叉编译要用到 SSH 免密登录。

3.3 交叉编译工具链配置

为什么要交叉编译?因为 Orin 的算力虽然强,但编译大型项目(比如 Autoware、深度学习模型)还是太慢。你想想看,在 Orin 上编译一个 TensorRT 插件可能要 10 分钟,在 PC 上只要 2 分钟。所以咱们在 x86 主机上编译,生成 aarch64 的可执行文件,再传到 Orin 上跑。

工具链安装:

# 下载 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

# 设置环境变量(建议写到 ~/.bashrc)
export CROSS_COMPILE=aarch64-linux-gnu-
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH

这里有个坑:GCC 版本要和 JetPack 里的保持一致。JetPack R35.4.1 用的是 GCC 9.3,你用 7.5 编译出来的东西可能跑不起来。我建议直接从 SDK Manager 安装的 aarch64-linux-gnu-gcc 走,省心。

验证工具链:

aarch64-linux-gnu-gcc --version
# 输出应该类似:aarch64-linux-gnu-gcc (Linaro GCC 7.5-2019.12) 7.5.0

写个简单的测试程序:

// hello_domain.c
#include <stdio.h>

int main() {
    printf("Hello from Domain Controller!\n");
    return 0;
}

// 编译
aarch64-linux-gnu-gcc -o hello_domain hello_domain.c

// 查看文件类型
file hello_domain
// 输出:ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV)

把编译好的文件传到 Orin 上:

scp hello_domain nvidia@192.168.1.100:~/
ssh nvidia@192.168.1.100
./hello_domain
避坑指南: 我曾经在交叉编译 OpenCV 时,忘了把 -march=armv8-a 加上,结果在 Orin 上跑起来直接段错误。记住,编译参数一定要匹配目标架构。

3.4 环境验证与常见问题

环境搭好了,怎么确认没问题?我一般跑三个测试:

  1. CUDA 测试: 在 Orin 上跑 nvidia-smi,看能不能识别到 GPU
  2. TensorRT 测试: 跑一个简单的 ONNX 模型推理,确认推理结果正确
  3. 交叉编译测试: 在 PC 上编译一个带 CUDA 的程序,传到 Orin 上运行

常见问题速查:

问题原因解决
刷机时 USB 设备找不到线材问题或驱动没装换原装线,装 udev 规则
交叉编译的程序运行报错动态库版本不匹配ldd 检查依赖,从 Orin 上拷贝 .so 文件
SDK Manager 下载慢网络问题挂代理,或者用离线包
Orin 启动后风扇狂转散热模组没装好检查导热硅脂,确保风扇线插紧
我的习惯: 每次刷完机,第一件事就是备份整个系统镜像。用 dd 命令把 SD 卡或 eMMC 全盘备份,万一后面搞崩了,直接恢复就行。别问我为什么知道要备份——说多了都是泪。

好了,环境搭建这块就到这儿。下一章咱们开始写第一个域控制器程序,到时候你会感谢今天把环境配好的自己。