第二章 开发环境搭建:嵌入式Linux系统烧录、交叉编译工具链配置、Python与C++运行时环境部署

好,咱们正式开始动手了。这一章我带你把开发环境搭起来。说实话,很多做AI推理的朋友,模型调得再好,板子跑不起来也是白搭。我在项目里见过太多次了——环境没配好,一烧录就变砖,一编译就报错。所以这一章,咱们稳扎稳打。

2.1 嵌入式Linux系统烧录

先说说系统烧录。你手头可能是一块开发板,比如树莓派、RK3588、或者NVIDIA Jetson系列。不管哪块板子,第一步都是把系统装进去。

我个人习惯用SD卡或者eMMC来烧录。为什么?因为方便。SD卡拔下来插电脑上,用工具写镜像,再插回去就能启动。eMMC稍微麻烦点,得用USB线或者网线连电脑。

2.1.1 烧录工具选择

平台 推荐工具 说明
Windows Win32DiskImager / balenaEtcher 简单易用,支持常见镜像格式
Linux dd命令 / bmaptool dd最直接,bmaptool支持增量写入
macOS balenaEtcher / dd balenaEtcher有图形界面,省心

嗯,这里要注意:烧录前一定确认镜像文件没损坏。我建议你下载完镜像后,先校验一下SHA256。我曾经有一次没校验,烧完板子死活起不来,折腾了半天才发现是镜像下载不完整。

烧录步骤(以树莓派为例):

  1. 下载官方镜像(比如Raspberry Pi OS)
  2. 用balenaEtcher选择镜像文件和SD卡
  3. 点击Flash,等进度条走完
  4. 插回板子,上电启动

如果你用的是NVIDIA Jetson系列,烧录方式不太一样。它需要用到NVIDIA官方的SDK Manager,走的是USB直连模式。说白了,就是把板子当U盘一样,往里面写系统。

避坑指南:我曾经在烧录Jetson Nano时,忘记把板子切换到强制恢复模式(Force Recovery Mode),结果电脑死活识别不到设备。后来才发现,得先按住板子上的RECOVERY键,再按一下RST键,最后上电。这个顺序不能错。

2.2 交叉编译工具链配置

接下来是交叉编译。你想想看,你的开发电脑是x86架构,但目标板子是ARM架构。你在电脑上编译出来的程序,板子不认识。怎么办?用交叉编译工具链。

交叉编译工具链,说白了就是一套能在x86上生成ARM可执行文件的工具。我建议你直接用芯片厂商提供的工具链,比如ARM官方的gcc-arm-none-eabi,或者Linaro的gcc-linaro。

2.2.1 安装交叉编译工具链

以Ubuntu系统为例,安装ARM64的交叉编译工具链:

sudo apt-get update
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

装完之后,你可以用这个命令验证一下:

aarch64-linux-gnu-gcc --version

看到版本号就说明装好了。嗯,这里有个小技巧:我习惯把工具链的路径加到.bashrc里,这样每次打开终端就不用再手动设环境变量了。

个人经验:如果你用的是树莓派,其实可以不用交叉编译。直接在树莓派上装gcc,本地编译就行。但如果你用的是性能较弱的板子(比如Cortex-M系列),那交叉编译就是必须的。我在一个项目里用STM32MP1跑AI推理,本地编译一个OpenCV库要两个小时,交叉编译只要十分钟。

2.2.2 编写一个简单的测试程序

工具链装好了,咱们写个Hello World试试:

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

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

用交叉编译器编译:

aarch64-linux-gnu-gcc hello.c -o hello_arm

然后把这个文件传到板子上,运行一下:

./hello_arm

看到输出就对了。如果报错说“无法执行二进制文件”,那八成是架构不对。你检查一下板子的架构,用uname -m看看。

2.3 Python与C++运行时环境部署

好,系统能跑了,交叉编译也通了。接下来咱们部署AI推理需要的运行时环境。这里分两条路:Python和C++。

2.3.1 Python运行时环境

Python在嵌入式设备上做AI推理,最常用的就是ONNX Runtime和TensorFlow Lite。我个人更推荐ONNX Runtime,因为它支持的模型格式多,而且优化得不错。

安装Python和pip:

sudo apt-get install python3 python3-pip

然后安装ONNX Runtime:

pip3 install onnxruntime

注意:板子上的Python版本最好和开发电脑一致。我遇到过Python 3.7和3.9的API有差异,模型加载直接报错。所以建议你统一用Python 3.8或3.9。

验证安装:

python3 -c "import onnxruntime; print(onnxruntime.__version__)"

如果能打印出版本号,说明环境没问题。

2.3.2 C++运行时环境

C++环境稍微复杂一点。你需要安装OpenCV、ONNX Runtime的C++库,还有可能用到TensorRT(如果你用的是NVIDIA的板子)。

安装OpenCV:

sudo apt-get install libopencv-dev

安装ONNX Runtime C++库:

# 下载预编译的ARM64版本
wget https://github.com/microsoft/onnxruntime/releases/download/v1.15.1/onnxruntime-linux-aarch64-1.15.1.tgz
tar -xzf onnxruntime-linux-aarch64-1.15.1.tgz
sudo cp -r onnxruntime-linux-aarch64-1.15.1/include/* /usr/local/include/
sudo cp -r onnxruntime-linux-aarch64-1.15.1/lib/* /usr/local/lib/
sudo ldconfig

嗯,这里要注意:ONNX Runtime的版本要和你的模型兼容。我建议你开发电脑和板子用同一个版本,避免算子支持不一致。

避坑指南:我曾经在RK3588上部署ONNX Runtime,发现官方预编译的ARM64版本不支持NPU加速。后来我改用RKNN Toolkit,才把推理速度提上来。所以,如果你用的是特定芯片(比如瑞芯微、全志),最好用厂商提供的推理框架。

2.3.3 验证C++环境

写一个简单的C++程序,加载ONNX模型:

#include <onnxruntime/core/session/onnxruntime_cxx_api.h>
#include <iostream>

int main() {
    Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test");
    std::cout << "ONNX Runtime version: " << Ort::GetVersionString() << std::endl;
    return 0;
}

编译:

g++ test_onnx.cpp -lonnxruntime -o test_onnx

在板子上运行,看到版本号就说明环境搭好了。

2.4 本章小结

这一章咱们把开发环境从头到尾搭了一遍。从系统烧录到交叉编译,再到Python和C++的运行时环境。你可能会觉得步骤有点多,但相信我,环境搭好了,后面就顺了

我个人的经验是:每做完一步,都验证一下。烧录完系统,先跑个uname -a看看内核版本。装完工具链,编译个Hello World。部署完运行时,写个测试程序。别等到最后才发现问题,那时候排查起来就麻烦了。

下一章,咱们开始讲模型转换和量化。到时候你会用到今天搭好的环境。嗯,先休息一下,喝杯咖啡,然后继续。