2、嵌入式开发环境搭建:交叉编译工具链配置、目标板系统镜像烧录、SSH与串口调试环境建立

说实话,做嵌入式AI开发,第一步往往是最磨人的。你想想看,TensorRT-LLM要在嵌入式设备上跑起来,首先得让代码能在目标板上编译通过。这可不是在PC上装个IDE那么简单。我刚开始搞嵌入式的时候,光配环境就折腾了两天,后来总结出一套流程,今天分享给你。

2.1 交叉编译工具链配置

交叉编译,说白了就是在一台高性能的PC上,生成能在ARM架构嵌入式设备上运行的二进制文件。为什么非要这么干?因为目标板资源有限,跑个GCC编译大型项目,内存分分钟爆掉。我在项目中遇到过,直接在Jetson Orin上编译TensorRT-LLM,编译到一半系统卡死,最后只能硬重启。

2.1.1 工具链选择

不同的目标板,工具链也不同。我整理了一张表,方便你对照选择:

目标平台 架构 推荐工具链 备注
Jetson Orin/AGX aarch64 L4T GCC 11.4 NVIDIA官方推荐
Raspberry Pi 4/5 aarch64 arm-gcc 10.3 Linaro版本稳定
RK3588 aarch64 RK GCC 10.3 Rockchip SDK自带
i.MX8M Plus aarch64 Yocto SDK 需自行编译

我个人习惯用L4T(Linux for Tegra)的官方工具链。为什么?因为NVIDIA对自家芯片的优化最到位,踩过的坑最少。我曾经试过用Linaro的通用工具链编译TensorRT-LLM,结果链接阶段报了一堆符号未定义的错误,查了半天发现是ABI不兼容。

2.1.2 安装与配置

以Jetson Orin为例,我们一步步来。首先下载L4T GCC工具链:

# 下载L4T GCC 11.4
wget https://developer.nvidia.com/embedded/l4t/r35_release_v5.0/toolchain/aarch64--glibc--stable-final.tar.gz

# 解压到指定目录
sudo tar -xvf aarch64--glibc--stable-final.tar.gz -C /opt/

# 设置环境变量
export CROSS_COMPILE=/opt/aarch64--glibc--stable-final/bin/aarch64-linux-gnu-
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export LD=${CROSS_COMPILE}ld
export AR=${CROSS_COMPILE}ar
export AS=${CROSS_COMPILE}as

嗯,这里要注意。环境变量最好写到 ~/.bashrc 里,不然每次开新终端都要重新export。我建议你这样写:

echo 'export PATH=/opt/aarch64--glibc--stable-final/bin:$PATH' >> ~/.bashrc
echo 'export CROSS_COMPILE=aarch64-linux-gnu-' >> ~/.bashrc
source ~/.bashrc
小技巧: 验证工具链是否配置成功,可以运行 aarch64-linux-gnu-gcc --version。如果输出版本信息,说明环境OK。我习惯再写一个简单的hello.c编译测试一下,确保链接器也能正常工作。

2.1.3 验证交叉编译

写个简单的测试程序:

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

int main() {
    printf("Hello from TensorRT-LLM on ARM!\n");
    return 0;
}
# 交叉编译
aarch64-linux-gnu-gcc hello_tensorrt.c -o hello_tensorrt

# 查看生成的文件类型
file hello_tensorrt
# 输出: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV)

看到 ARM aarch64 就对了。我曾经犯过一个低级错误——在PC上直接编译,然后拷到板子上跑,结果报 Exec format error。你想想看,x86的二进制文件怎么能在ARM上跑呢?

2.2 目标板系统镜像烧录

系统镜像烧录,就是把操作系统刷到目标板上。这一步看似简单,但稍有不慎就会变砖。我刚开始做的时候,烧录到一半断电,板子直接不启动了,最后只能短接恢复模式重新刷。

2.2.1 准备工作

你需要准备以下东西:

  • 目标板:比如Jetson Orin NX
  • 主机PC:Ubuntu 20.04/22.04
  • USB数据线:用于连接板子和PC
  • MicroSD卡或NVMe SSD:用于存储系统
  • 电源适配器:确保供电稳定
警告: 烧录过程中千万不要断电!我建议使用UPS不间断电源,或者至少保证笔记本电池满电。曾经有学员烧录到90%时断电,板子直接变砖,花了三天才救回来。

2.2.2 烧录步骤(以Jetson Orin为例)

NVIDIA提供了 sdkmanager 工具,图形化界面操作很方便。但如果你像我一样喜欢命令行,可以用 flash.sh 脚本:

# 下载L4T驱动包和BSP
wget https://developer.nvidia.com/embedded/l4t/r35_release_v5.0/jetson_linux_r35.5.0_aarch64.tbz2
wget https://developer.nvidia.com/embedded/l4t/r35_release_v5.0/tegra_linux_sample-root-filesystem_r35.5.0_aarch64.tbz2

# 解压
tar -xvf jetson_linux_r35.5.0_aarch64.tbz2
sudo tar -xvf tegra_linux_sample-root-filesystem_r35.5.0_aarch64.tbz2 -C Linux_for_Tegra/rootfs/

# 进入目录
cd Linux_for_Tegra/

# 安装必要依赖
sudo ./apply_binaries.sh

# 开始烧录(连接板子到PC,进入恢复模式)
sudo ./flash.sh jetson-orin-nx-devkit internal

烧录过程中,你会看到终端不断输出进度。整个过程大概10-15分钟。我建议你泡杯咖啡,盯着屏幕看也没用,它不会因为你盯着就变快。

2.2.3 首次启动与配置

烧录完成后,板子会自动重启。第一次启动会进入初始化设置:

  • 设置用户名和密码(我习惯用 nvidia/nvidia
  • 配置网络(推荐有线连接,WiFi有时不稳定)
  • 设置时区和语言
  • 更新系统(可选,但建议做)
重要: 首次启动后,建议立即执行 sudo apt update && sudo apt upgrade -y。我遇到过系统自带驱动有bug,更新后才修复。

2.3 SSH与串口调试环境建立

板子跑起来之后,你总不能每次都接显示器和键盘吧?SSH和串口就是你的远程调试利器。我个人更喜欢SSH,毕竟无线操作方便。但串口在系统崩溃时是救命稻草。

2.3.1 SSH配置

首先确保板子和PC在同一个局域网内。查看板子的IP地址:

# 在板子上执行
ip addr show
# 或者
ifconfig

然后开启SSH服务:

# 安装SSH服务器
sudo apt install openssh-server

# 启动并设置开机自启
sudo systemctl enable ssh
sudo systemctl start ssh

# 检查状态
sudo systemctl status ssh

在PC上连接:

ssh nvidia@192.168.1.100
# 输入密码即可登录
小技巧: 我建议配置SSH密钥登录,省去每次输密码的麻烦。执行 ssh-keygen 生成密钥,然后用 ssh-copy-id 拷贝到板子上。这样以后登录就一键直达了。

2.3.2 串口调试配置

串口是最后的防线。当系统内核崩溃、网络不通时,串口是你唯一的调试手段。我曾在调试TensorRT-LLM驱动时,因为加载了错误的内核模块导致系统死机,全靠串口才把日志抓出来。

硬件连接:

  • Jetson Orin的UART接口(J50排针)
  • USB转TTL模块(推荐CP2102或CH340)
  • 接线:GND-GND,TX-RX,RX-TX

PC端配置:

# 安装minicom
sudo apt install minicom

# 配置串口
sudo minicom -s
# 选择 Serial port setup
# 设置 Serial Device: /dev/ttyUSB0
# 设置 Bps/Par/Bits: 115200 8N1
# 保存配置并退出

连接后,重启板子,你会看到完整的启动日志。从U-Boot到内核启动,再到用户空间初始化,所有信息一览无余。

注意: 串口电压是3.3V,千万别用5V的模块!我见过有人把5V直接怼到UART引脚上,结果烧了串口芯片,板子直接报废。买模块时一定要确认是3.3V电平。

2.3.3 调试环境验证

环境搭好了,我们来验证一下。通过SSH登录板子,然后运行一个简单的TensorRT程序:

# 在板子上执行
nvidia@jetson-orin:~$ nvcc --version
# 应该输出CUDA版本信息

nvidia@jetson-orin:~$ python3 -c "import tensorrt; print(tensorrt.__version__)"
# 应该输出TensorRT版本号

如果都能正常输出,恭喜你,开发环境搭建成功了!

说实话,环境搭建这一步最枯燥,但也是最关键的。我见过太多人因为工具链版本不对、系统镜像烧录失败、SSH连不上,卡在这里好几天。按照我上面的步骤来,应该能帮你省下不少时间。

嗯,最后提醒一句:做完每一步都做个记录。比如工具链的版本号、烧录时的选项、SSH的配置参数。这些细节在后续调试中会反复用到。我曾经因为没记录,重装系统时又得重新查一遍资料,浪费了大半天。


公众号:蓝海资料掘金营,微信deep3321