1. 项目背景与核心价值
RV1106G3是瑞芯微电子推出的一款高性能、低功耗的AIoT处理器芯片,主要面向边缘计算和嵌入式视觉处理场景。这款芯片采用双核ARM Cortex-A7架构,内置0.5Tops NPU加速器,支持1080p视频编解码,在智能摄像头、门禁系统、工业检测等场景有广泛应用。
在实际项目中,我们经常需要在开发板端完成从系统移植到应用部署的全流程工作。不同于x86平台的标准化部署,嵌入式Linux环境下的部署需要考虑交叉编译、驱动适配、性能优化等特殊环节。以RV1106G3为例,完整的板端部署涉及:
- 定制化Linux系统镜像构建(通常基于Buildroot或Yocto)
- 神经网络模型转换与量化(RKNN-Toolkit工具链)
- 板端推理引擎部署(RKNN Runtime环境)
- 硬件加速接口调用(RGA/VOP等专用模块)
这个过程中最大的挑战在于如何充分发挥芯片的NPU加速能力,同时保证系统稳定性和实时性。下面我将结合三个实际项目经验,详细拆解每个环节的技术要点和避坑指南。
2. 开发环境搭建与系统定制
2.1 交叉编译工具链配置
RV1106G3采用armv7l架构,官方推荐使用gcc-linaro-6.3.1工具链。在实际操作中发现,更高版本的gcc可能导致某些内核模块编译失败。建议按以下步骤配置:
bash复制# 下载官方工具链
wget https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabihf/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xz
# 解压并设置环境变量
tar -xvf gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xz
export PATH=$PATH:/path/to/toolchain/bin
关键验证:执行
arm-linux-gnueabihf-gcc -v应显示"gcc version 6.3.1 20170404"
2.2 Buildroot系统定制
相比Yocto,Buildroot更适合快速构建轻量级系统。推荐使用2021.02.x版本(与内核兼容性最佳):
bash复制git clone https://github.com/buildroot/buildroot -b 2021.02.x
make rockchip_rv1106_defconfig
需要特别注意的配置项:
-
Toolchain:
- Toolchain type = External toolchain
- Toolchain = Custom toolchain
- Toolchain path = 指向上述linaro工具链
-
内核选项:
- Kernel version = Custom tarball
- Kernel binary format = zImage
- Device tree support = Enabled
-
文件系统:
- Filesystem images = ext4 + squashfs
- exact size = 256M (适配常见eMMC容量)
常见问题:如果出现"undefined reference to `__atomic_exchange_4'"错误,需在Target packages中勾选libatomic
2.3 内核与驱动适配
RV1106G3的Linux内核建议使用4.19.193版本,这是官方长期维护的分支。关键驱动配置:
bash复制# 克隆内核仓库
git clone https://github.com/rockchip-linux/kernel -b release-4.19-rk1106
# 关键配置项
make ARCH=arm rockchip_linux_defconfig
make ARCH=arm menuconfig
必须启用的驱动模块:
- CONFIG_DRM_ROCKCHIP=y
- CONFIG_RK_VCODEC=y
- CONFIG_RKNPU=y
- CONFIG_ROCKCHIP_RGA=y
编译完成后,通过tftp烧录测试:
bash复制tftp 0x62000000 zImage
tftp 0x63000000 rv1106-evb.dtb
bootz 0x62000000 - 0x63000000
3. AI模型部署实战
3.1 模型转换与量化
使用RKNN-Toolkit2进行模型转换(以YOLOv5s为例):
python复制from rknn.api import RKNN
rknn = RKNN()
rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]])
# 加载ONNX模型
ret = rknn.load_onnx(model='yolov5s.onnx')
ret = rknn.build(do_quantization=True, dataset='./dataset.txt')
# 导出RKNN模型
ret = rknn.export_rknn('yolov5s.rknn')
量化注意事项:
- 数据集应包含200-300张典型场景图片
- 图片尺寸需与模型输入严格一致
- 避免使用全黑/全白等极端样本
3.2 板端推理优化
RV1106G3的NPU调度需要特殊优化:
c复制// NPU核心绑定
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(0, &mask); // 绑定到第一个A7核心
sched_setaffinity(0, sizeof(mask), &mask);
// 内存预分配
rknn_input_output_mem input_mem[3];
for(int i=0; i<3; i++){
input_mem[i] = rknn_create_mem(ctx, input_attrs[i].size);
}
性能对比数据(1080p输入):
| 优化措施 | 推理耗时(ms) | 内存占用(MB) |
|---|---|---|
| 默认配置 | 152 | 217 |
| 核心绑定 | 138 | 217 |
| 内存预分配 | 121 | 189 |
| 双缓冲 | 98 | 156 |
3.3 视频处理流水线
利用RGA加速图像预处理:
c复制// 配置RGA转换参数
rga_info_t src = {0};
rga_info_t dst = {0};
src.fd = -1;
src.virAddr = camera_buffer;
dst.fd = -1;
dst.virAddr = model_input_buffer;
// 执行格式转换+resize
c_RkRgaBlit(&src, &dst, NULL);
典型流水线时序:
- Camera捕获(V4L2驱动)
- RGA转换(NV12→RGB + resize)
- NPU推理
- RGA绘制OSD
- VO输出显示
4. 系统调优与问题排查
4.1 内存管理策略
RV1106G3的256MB内存需要精细管理:
- CMA配置:
bash复制# 内核启动参数添加 cma=64M@0x4000000 - ION内存池:
bash复制echo 32768 > /sys/class/ion/ion0/heaps/cma - 用户空间限制:
bash复制ulimit -m 16384 # 限制单个进程内存
4.2 常见故障排查
问题1:NPU推理结果异常
- 检查模型量化是否成功(查看rknn_output日志)
- 验证输入数据范围(应为0-255或归一化后范围)
- 测试FP32模式是否正常(do_quantization=False)
问题2:视频流水线卡顿
bash复制# 查看各环节耗时
cat /proc/vcodec/enc/venc_info
cat /proc/rknpu/load
dmesg | grep rga
问题3:系统随机崩溃
- 检查内存分配(free -m)
- 监控温度(cat /sys/class/thermal/thermal_zone*/temp)
- 测试电源稳定性(示波器测量核心电压)
4.3 性能优化技巧
-
中断亲和性设置:
bash复制echo 1 > /proc/irq/78/smp_affinity # VICAP中断绑定到CPU0 echo 2 > /proc/irq/79/smp_affinity # RGA中断绑定到CPU1 -
DVFS调频策略:
bash复制echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor echo 1008000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq -
DMA缓冲区优化:
c复制// 分配连续物理内存 buf = dma_alloc_coherent(dev, size, &dma_handle, GFP_KERNEL);
5. 量产部署方案
5.1 固件打包与签名
使用Rockchip的打包工具:
bash复制./afptool -pack ./image ./update.img
./rkImageMaker -RK1106 ./Image ./update.img firmware.img -os_type:androidos
签名流程:
- 生成RSA密钥对
- 将公钥烧录到OTP区域
- 使用私钥签名固件
5.2 安全启动配置
eFuse关键位:
| 位域 | 功能 | 建议值 |
|---|---|---|
| 0-31 | Secure Boot Enable | 0x01 |
| 32-63 | RSA Public Key Hash | 自定义 |
| 64-95 | JTAG Disable | 0x01 |
5.3 生产测试流程
-
自动化烧录:
python复制import pyrockchip tool = pyrockchip.Device() tool.load_config("rv1106.cfg") tool.erase_flash() tool.write_image("firmware.img") -
功能测试项:
- NPU算力验证(运行标准模型)
- 视频编解码测试(h264 1080p@30fps)
- 内存压力测试(memtester 100M)
- 温度循环测试(-20℃~70℃)
-
日志收集:
bash复制dmesg > /mnt/log/kernel.log cat /proc/interrupts > /mnt/log/irq.log
在实际部署中,我们发现RV1106G3的RGA模块对内存对齐要求严格,建议所有图像缓冲区按64字节对齐。另外,NPU在连续推理时会产生约5℃的温度上升,在密闭环境中需要考虑散热设计。通过合理的配置优化,单板可以稳定运行YOLOv5s模型达到25FPS的实时性能,满足大多数边缘视觉应用的需求。