4. 开发环境搭建

旭日X5 是一颗面向边缘视觉推理的 SoC,其 CPU 为 ARM64 架构,而开发主机通常是 x86_64 的 Ubuntu。这意味着在主机上直接编译出的可执行文件无法在板端运行,必须使用交叉编译工具链生成 ARM64 目标程序。本节围绕“主机侧工具链 → 交叉编译配置 → 板端运行环境”这条主线,把开发环境一次搭稳,避免后续反复返工。

核心认知:旭日X5 的视觉推理链路通常由三部分组成——主机负责模型转换与交叉编译,板端负责加载模型并调用 BPU 推理,摄像头/视频源提供输入。三者版本必须对齐,尤其是 BPU 工具链、系统镜像与驱动版本。

一、整体环境架构与依赖关系

下图展示了从开发主机到旭日X5 板端的完整环境拓扑。主机侧包含交叉编译工具链、模型转换工具与部署包;板端侧包含系统镜像、BPU 驱动、运行时库与推理程序。两侧通过 scp、NFS 或串口进行文件传输与调试。

旭日X5 开发环境拓扑:主机交叉编译 → 板端运行 开发主机(x86_64 Ubuntu 20.04/22.04) 交叉编译工具链 gcc-aarch64-linux-gnu / aarch64-linux-gnu-g++ 模型转换与量化工具 hb_mapper / onnx2horizon / 校准数据集 部署包与运行时库 libdnn.so / libhbrt.so / hb_model 头文件 传输与调试通道 scp / NFS / SSH / 串口 minicom 旭日X5 板端(ARM64 Linux) 系统镜像与内核 Ubuntu 22.04 rootfs + 官方内核 BPU 驱动与固件 bpu driver / hbmem / ion 模块 运行时依赖库 libdnn.so / libhbrt.so / OpenCV 推理程序与模型 可执行文件 + .bin 模型 + 测试图片 部署 scp / NFS 日志回传 SSH / 串口

二、主机侧工具链安装

推荐使用 Ubuntu 20.04 或 22.04,先安装基础编译依赖,再安装 ARM64 交叉编译器。以下命令可直接执行:

sudo apt update
sudo apt install -y build-essential cmake git wget \
    gcc-aarch64-linux-gnu g++-aarch64-linux-gnu \
    pkg-config libopencv-dev python3-pip

# 验证交叉编译器
aarch64-linux-gnu-gcc --version
aarch64-linux-gnu-g++ --version

若使用官方提供的工具链压缩包,解压后需将 bin 目录加入 PATH,并确认 aarch64-linux-gnu-gcc 能正常输出版本号。工具链版本建议与板端 glibc 版本匹配,否则可能出现 GLIBC_2.xx not found 错误。

三、交叉编译配置

交叉编译的核心是让 CMake 或 Makefile 明确使用目标平台的编译器与系统根目录。推荐编写 toolchain.cmake:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)

set(CMAKE_C_COMPILER   aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)

set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

编译时通过 -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake 引入。若项目依赖 OpenCV 或 BPU 运行时库,需要把板端对应的 include 与 lib 目录拷贝到主机,并在 CMake 中通过 target_include_directories 与 target_link_directories 指定,避免误链接主机 x86 库。

建议在 CMake 中显式设置 -march=armv8-a 与 -O2,并关闭主机侧不需要的测试程序,减少交叉编译时的依赖冲突。

四、板端运行环境准备

板端环境准备分为四步:烧录系统镜像、安装 BPU 驱动、部署运行时库、验证推理程序。烧录镜像后首次启动,建议先通过串口确认内核启动日志,再配置网络与 SSH。

  1. 烧录镜像:使用官方烧录工具将 Ubuntu 镜像写入 TF 卡或 eMMC,启动后确认 uname -a 显示 aarch64。
  2. 安装 BPU 驱动:将驱动包拷贝到板端,执行 insmod 或 dkms 安装,确认 /dev/bpu* 设备节点存在。
  3. 部署运行时库:把 libdnn.so、libhbrt.so 等放入 /usr/lib,执行 ldconfig 刷新缓存。
  4. 验证推理:运行官方示例程序,观察是否输出检测框与耗时日志。
# 板端检查 BPU 设备节点
ls /dev/bpu*
# 查看驱动模块
lsmod | grep bpu
# 刷新动态库缓存
sudo ldconfig
# 运行示例
./yolov5_demo --model model.bin --image test.jpg

五、关键参数与常见误区对照

环节 关键参数/对象 正确做法 常见误区
工具链 aarch64-linux-gnu-gcc 版本与板端 glibc 对齐 用主机 gcc 直接编译
交叉编译 CMAKE_TOOLCHAIN_FILE 显式指定目标平台与根目录 遗漏 toolchain,链接到 x86 库
模型转换 hb_mapper / 校准集 校准集覆盖真实场景分布 用少量随机图校准,精度骤降
板端驱动 /dev/bpu* 确认设备节点与驱动版本 只拷贝库,未装驱动
运行时库 libdnn.so / libhbrt.so 放入 /usr/lib 并 ldconfig 库版本与模型不匹配

六、案例与复盘

某次部署中,主机交叉编译通过,但板端运行时报 error while loading shared libraries: libdnn.so: cannot open shared object file。排查发现库文件被放到了 /home/root/lib,而 LD_LIBRARY_PATH 未包含该路径。解决方式是将库放入 /usr/lib 并执行 ldconfig,或临时设置 export LD_LIBRARY_PATH=/home/root/lib:$LD_LIBRARY_PATH。

另一个高频问题是模型转换时校准集与推理输入尺寸不一致,导致板端输出异常。复盘结论是:主机侧工具链、模型转换参数、板端驱动与运行时库必须作为一套版本组合统一管理,建议在项目根目录维护 env_version.md,记录工具链版本、驱动版本、模型转换命令与板端库版本,便于复现与排障。

不要混用不同版本的 BPU 工具链与板端驱动。版本不匹配时,模型可能加载失败或推理结果错误,且日志往往只提示“模型解析失败”,不易定位。

完成以上步骤后,主机具备交叉编译能力,板端具备 BPU 推理运行条件,后续即可进入模型转换与部署环节。建议先用官方示例跑通“编译—传输—运行”闭环,再替换为自己的视觉推理程序。