1. 项目概述:RV1126B 是什么,解决什么问题
1.1 一颗为视觉而生的 SoC:规格与定位
做嵌入式视觉这几年,经手的处理芯片少说也有二三十颗,但真正让我愿意专门写一篇长文来聊的,RV1126B 算一个。这颗瑞芯微(Rockchip)的视觉处理器 SoC,在安防 IPC、AIoT 边缘盒子和工业检测设备上出镜率极高,几乎每周都有同行拿着它来问我选型、烧录和模型移植的细节。它把四核 Arm Cortex-A7、2TOPS 算力的 NPU、ISP 图像信号处理器和 H.264/H.265 视频编解码单元集成到同一颗芯片上,单芯片就能完成从摄像头采图、图像增强、AI 识别到视频推流的完整闭环。
适合谁来用?我认为主要是三类人:正在做智能摄像头产品但还在用 MCU 硬扛的嵌入式工程师;想把现有模拟/普通网络相机升级成带本地 AI 识别能力,又不想上太贵方案的硬件负责人;以及做边缘计算盒子、需要低功耗低成本跑目标检测算法的小团队。RV1126B 对比 FPGA 方案,开发门槛低得多;对比纯 ARM 板卡,又多出了专门的视觉加速单元,属于典型的花小钱办大事。
我实际用它做了一台四路 IPC 样机,从画板回板到跑通第一个人形检测模型,大概用了两周。这里说的“跑通”不是实验室转一转 demo,而是连续运行 72 小时以上不掉链子的那种。后面我会把整个过程里涉及到的选型逻辑、启动链路、烧录细节、设备树修改、模型部署以及各类翻车现场全部摊开讲。
1.2 我为什么选择 RV1126B 而不是其他型号
选型阶段我对比过海思 Hi3516、君正 T40,以及瑞芯微自家 RV1106 和 RK3588。海思的编码器和成本确实有吸引力,但授权和供货链条在项目周期里变数太大,不是小团队能完全掌控的因素;RV1106 主打极低功耗,适合电池类户外相机,可它的 NPU 算力跑稍微大一点的检测模型明显吃紧;RK3588 性能强到没话说,但整板成本、功耗和 PCB 设计要求都高一大截,用在一个两百元档的 IPC 上属于杀鸡用牛刀。
RV1126B 正好卡在“算力够用、成本可控、设计难度低”这个甜点区。我拿到的开发板丝印是 RV1126B-P,和 RV1126B 在 SDK、设备树、烧录工具上完全通用。按代理的说法,-P 主要对应某些行业定制封装或温度等级,采购时按具体物料编码下单即可,软件层面不需要单独适配。我自己使用过程中从来没有区分过这两个型号,所以后面所有内容都按 RV1126B 统一讲,个别涉及变体的地方我会单独提示。
2. 核心架构与关键技术拆解
2.1 CPU/GPU/NPU 三引擎架构与算力分配
先看整颗芯片的引擎分布。CPU 部分是四核 Arm Cortex-A7,最高主频 1.5GHz 左右,平时按负载动态调频。今天看这个规格不算抢眼,但跑 Linux、跑网络协议栈、做视频流封装转发完全够用。RV1126B 没有像手机 SoC 那样追大核性能,原因很简单:视觉 SoC 的算力重心不在 CPU,而在后面两个引擎。
第二个引擎是这颗芯片最值得说的地方——NPU。RV1126B 集成了一颗支持 INT8 量化的神经网络加速单元,官方标称算力 2TOPS。这是什么概念?拿最常用的 YOLOv5s 目标检测模型来说,输入 640x640、INT8 量化后,我在板端实测能稳定跑在 25 到 35FPS 之间,做安防领域的实时人车识别绰绰有余。作为对比,用树莓派 4B 跑同一个模型,CPU 推理只有每秒几帧,差距非常直观。
第三个引擎是视频编解码单元,再往下是 ISP。这几个大模块通过芯片内部总线连接,数据流的典型路径是:Sensor 出 RAW 图,ISP 做处理,之后兵分三路——一路送编码器生成 H.265 码流、一路送 NPU 做推理、一路送 RTSP 推流或者显示。整条链路硬件化,CPU 只做控制和协议处理,所以一颗 A7 级别的芯片也能同时扛住多路视频负载。这种异构分工架构,就是我常跟人说的“视觉 SoC 和普通 MCU 最本质的区别”。
2.2 ISP 与视频编解码:AI 视觉的真正主力
很多第一次用视觉 SoC 的朋友会忽略 ISP 的重要性,觉得摄像头模组自带 ISP 就够了。实际上,IPC 场景光照复杂,逆光、夜间低照度、强光源全都在考验 ISP 的 3A 算法,也就是自动曝光、自动白平衡、自动对焦。RV1126B 的 ISP 支持宽动态、去噪、坏点校正这些常规功能,关键是它和后面的编码器、NPU 是同一个硬件流水线,延迟可控,不像外置 ISP 方案那样多出一截通信和供电的成本。
视频编解码方面,RV1126B 支持 H.264 和 H.265 的编码与解码,具体帧率和分辨率跟码流设置、DDR 带宽有关。我在项目里常用的是四路 1080p25 的 H.265 编码,码率压在 4Mbps 左右,画质和存储成本都能接受。如果只做单路产品,余量更大,甚至可以把编码器配置成更高帧率或更高分辨率。这里有个实战细节:H.265 编码前先做好图像缩放和裁剪,别让编码器处理超大分辨率再硬缩,否则 CPU 参与过多,整机功耗会明显上升。
2.3 一次搞清楚启动链路与固件结构
搞清启动链对排查问题太重要了。RV1126B 的启动顺序大致是:芯片内部 BootROM 上电,从 eMMC、SPI NOR 或 SD 卡读取 Loader 阶段程序,U-Boot 初始化 DDR 和外设,然后加载内核镜像和设备树,最后挂载 rootfs。中间任何环节出问题,现象都是串口没有输出或者卡在特定位置的打印信息,能快速定位到烧录、配置还是硬件问题。
瑞芯微的固件使用 Rockchip 私有打包格式,常见分区包括 parameter 分区表、uboot、boot 即内核加 dtb、rootfs、misc 等。用官方工具烧录时,会按照 parameter 里定义的分区表把各部分写到指定位置。这也是为什么烧录后一定要保留好和你 SDK 配套的 update.img,版本一旦错位,系统启动失败的概率非常大。下面的章节我会把烧录过程中最常见的问题逐个列出来。
3. 开发环境搭建与烧录实战
3.1 搭建 SDK 环境与编译前准备
瑞芯微现在的芯片基本走统一 SDK 路线,开源部分放在 GitHub 和 GitLab 上,完整 BSP 一般需要和代理商签协议获取。我手头这套基于 Linux,根文件系统用 Buildroot 组织,目录结构大致包含 kernel、u-boot、buildroot、rknn 几个核心仓库。拿到 SDK 后第一件事不是急着编译,而是先装宿主机依赖。
sudo apt-get install -y git ssh make gcc libssl-dev libncurses5-dev \ device-tree-compiler lz4 python2 python3 file然后按 SDK 里的 README 做仓库同步,编译一般走这几个脚本:./build.sh lunch选择板型配置,./build.sh kernel编内核,./build.sh rootfs编文件系统,./build.sh firmware打包 update.img。第一次全量编译时间取决于机器性能,我的工作站大概四十分钟。重点提醒一句:SDK 版本和烧录工具版本要匹配,官方经常同步升级,混用老工具烧新固件会出现分区表解析错乱,那是相当头疼的问题。
3.2 烧录进板:RKDevTool、驱动与 Mode 切换
Windows 下烧录用 RKDevTool。第一次插板子前,先安装 DriverAssitant 并执行驱动安装,再把板子 USB 接到电脑。进入烧录模式有两种常用方法:一是按住板上的 recovery 键不松,然后插 USB 上电;二是开机后短按 reset 的同时执行一条进入 loader 的命令。正常情况下设备管理器里会出现 Rockchip USB 设备,RKDevTool 上方也会显示“发现一个LOADER设备”。
之后操作就简单了:把编译出的 rockdev/update.img 拖进工具,点“一键升级”。如果只想更新内核,可以切换到分区表页签,单独选 boot 分区,填上 boot.img。这里有个细节我踩过好几次坑:USB 线必须用带数据功能的,有些充电线怎么插设备都不识别;另外尽量插主板后置 USB 2.0 口,比前置口和 3.0 口稳定。
Linux 下对应的是 upgrade_tool 命令行工具,最常用的几个操作是upgrade_tool uf update.img全量升级、upgrade_tool di -b boot.img只烧 boot。我的个人习惯是:量产阶段在 Linux 下做脚本化烧录,研发阶段用 Windows 图形工具看日志更方便,两者配合效率最高。
3.3 设备树适配与内核启动日志分析
设备树在这类 SoC 开发里几乎是每天的必修课。换一颗 Sensor、改一个 GPIO、调一个 I2C 地址,都要动 dts。RV1126B 的 SDK 里一般会提供一块官方 EVB 的 dts,比如 rv1126b-evb.dts,项目板卡的信息就在同类文件里改。下面是一个典型的 MIPI Sensor 节点配置片段,关键地方我加了注释。
&i2c2 { status = "okay"; clock-frequency = <400000>; sc3336: sc3336@30 { compatible = "smartsens,sc3336"; reg = <0x30>; clocks = <&cru CLK_MIPICSI_OUT>; clock-names = "xvclk"; pinctrl-names = "rockchip,camera_default"; pinctrl-0 = <&mipi_sensor_clk>; reset-gpios = <&gpio3 RK_PB3 GPIO_ACTIVE_LOW>; power-gpios = <&gpio3 RK_PB4 GPIO_ACTIVE_HIGH>; rockchip,camera-module-index = <0>; rockchip,camera-module-name = "sc3336"; rockchip,camera-module-lens-name = "default"; }; };改完 dts 后要重新编译内核并生成新 boot.img 烧进去,或者用设备树 overlay 机制在 U-Boot 阶段动态加载,后者适合维护多板卡产品线。改完上电第一件事是看启动串口日志,重点搜fdt、ethernet、v4l2等关键词。如果 Sensor 没亮相,多半是 GPIO 复位时序没配对或者 I2C 地址错了;如果网口起不来,优先查时钟和 PHY 复位脚。日志是最诚实的,它会告诉你配置到底有没有生效。
4. 应用场景与同系芯片选型对比
4.1 智能安防与 IP Camera:最成熟的落地场景
RV1126B 出现的最大场景就是网络摄像机。传统 IPC 方案里,Sensor 数据进来后要么只做编码推流,要么用一颗额外 MCU 做简单报警,算法丰富度受限。RV1126B 把编码、推流和 AI 推理整合到一颗芯片上,就可以直接在设备端做人形检测、区域入侵报警、越界检测,甚至口罩佩戴识别。安防项目非常看重漏报率和误报率,板端跑量化模型的精度损失控制不好,白天还行,晚上就会频繁误报。
我自己在样机上跑过一个人形检测模型,白天把置信度阈值调到 0.5,误报率已经很低;到夜间低照度场景,发现检测率明显下降。排查下来不是 NPU 算力不够,而是 Sensor 在弱光下出图质量差,ISP 的降噪参数又偏保守。后来把 ISP 的 IR-CUT 切换策略和去噪强度按夜间场景单独配了一组参数,模型几乎没改就恢复了白天级别的效果。这件事给我的经验是:视觉算法的上限其实由图像质量决定,调 ISP 永远比调模型参数优先。
4.2 AIoT / 边缘计算盒子:本地推理的价值
除了摄像机,RV1126B 常见的形态是边缘计算盒子。一个典型产品是:把 8 路 IPC 的 RTSP 流拉进盒子,用 H.265 硬解之后逐路跑结构化分析,再把结果通过 MQTT 上报到平台。以前这种方案要用 X86 工控机或带 GPU 的嵌入式板卡,成本高、体积大、功耗感人。RV1126B 方案整板功耗可以压在个位数瓦,无风扇设计也能稳定运行,安装位置灵活很多。
盒子里跑模型的方式和开发板完全一样,RKNN 工具链会帮你把模型转换成 .rknn 格式。这类产品有一个常见坑:多路码流同时解码时 CPU 负载会突然飙升,原因是某些协议栈实现把硬解后的 YUV 转换操作放在 CPU 上做。正确做法是让解码器直接输出 NV12,送到后续处理模块,避免多余的拷贝和格式转换。这个优化做不做,实际帧率能差出 20%,是非常值得花时间抠的细节。
4.3 RV1103/RV1106、RV1126、RK3588 怎么选
选型时最容易纠结的是瑞芯微自家产品线怎么选。我整理了一张常用型号对照表,方便你按项目定位快速过滤。
| 型号 | CPU | NPU 算力 | 特性 | 适合场景 |
|---|---|---|---|---|
| RV1103 | 单核 A7 + RISC-V 协处理器 | 0.5TOPS 级别 | 极低功耗,常配小容量 DDR | 电池类低功耗相机、猫眼 |
| RV1106 | 单核 A7 + RISC-V 协处理器 | 1TOPS 级别 | 低功耗,性价比高 | 低端 IPC、AI 带屏猫眼 |
| RV1126B | 四核 Cortex-A7 | 2TOPS 级别 | 性能均衡,接口丰富 | 主流 IPC、边缘盒子 |
| RV1126 | 四核 Cortex-A7 | 2TOPS 级别 | 老型号,物料紧张时可关注 | 兼容替代选型 |
| RK3588 | 八核 A76+A55 | 6TOPS 级别 | 高算力、高功耗、高成本 | 多路视频分析、NVR、大模型端侧部署 |
实战建议是:只有一两路摄像头、对成本极其敏感的选 RV1103 或 RV1106;主流项目直接 RV1126B,开发资料最多;如果要做 16 路以上视频分析或者跑更大的模型,再升级到 RK3588。不要一开始就为了预留性能余量选高配,视觉项目后期瓶颈大多数在 ISP 调优和模型优化,不在 CPU 核数,选高配反而增加发热和整机成本。
5. 常见问题与排查技巧实录
5.1 烧录失败、设备识别不到怎么办
这类问题在社区里每天都能看到,我按排查顺序整理了一张速查表,每一行都是我自己或朋友真实踩过的坑。
| 现象 | 排查重点 | 处理方向 |
|---|---|---|
| 设备管理器找不到 Rockchip 设备 | 驱动是否安装、USB 线是否数据线 | 重装 DriverAssitant,换后置 USB 2.0 口 |
| 能找到设备但一键升级失败 | loader 固件版本和工具不匹配 | 用 SDK 配套的 RKDevTool 版本,重新下载 loader |
| 提示下载 Boot 失败 | eMMC 处于异常分区状态 | 进 MaskRom 模式,先擦除全部 eMMC 再烧 |
| 烧完启动卡在 logo 或黑屏 | parameter 分区表损坏 | 重新全量烧 update.img,不要只烧 boot |
| 启动日志有乱码 | 串口电平或波特率不匹配 | 确认 UART0 波特率 1500000,检查共地 |
MaskRom 模式是最后的救命手段:短接板上的 MaskRom 焊盘或按官方说明使芯片进入底层引导模式,然后用工具擦除 eMMC。这个操作会清掉所有固件,必须在确认能拿到恢复固件的前提下做。我确实见过把客户样机清成砖又找不到原厂固件的惨案,所以这个提醒值回票价。
5.2 NPU 推理报错与算子兼容性
RKNN 工具链整体体验不错,但算子兼容问题仍然存在。最常见的报错是模型里包含某些自定义层或新算子,转换工具不支持。遇到这种情况,先把报错贴到 RKNN 工具的日志里找到具体节点名,然后在源码里把这一层拆成多个原生算子,或者用 CPU 算子兜底。我的经验是:Transformer 类结构的模型在这代 NPU 上兼容性不如 CNN,如果项目必须上 Transformer,先在工具链验证阶段就确认关键算子,否则返工成本很高。
部署阶段的代码框架大致是这样的。
from rknn.api import RKNN rknn = RKNN(verbose=True) rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform='rv1126') ret = rknn.load_rknn('./model.rknn') if ret != 0: print('load rknn failed') exit(ret) ret = rknn.init_runtime(target='rv1126', device_id='adb-xxxx') if ret != 0: print('init runtime failed') exit(ret) outputs = rknn.inference(inputs=[img_ndarray]) rknn.release()这里最容易错的是 target_platform 和 init_runtime 的 device_id。target_platform 要写你转换时对应的芯片平台,init_runtime 的 device_id 要改成实际adb devices里的序列号,不能直接照抄例子。另外,推理前输入图像必须按训练阶段的预处理来做,mean/std、通道顺序、缩放尺寸差一点,输出精度都会明显变差。很多人模型转换没问题,推理结果却乱七八糟,十有八九是预处理环节偷了懒。
5.3 功耗、散热与长时间运行稳定性
RV1126B 虽然定位低功耗,但持续跑 NPU 推理时不能掉以轻心。我实测跑一路 1080p 编码加一路 YOLOv5s 推理,整板功耗大概 2.5W 左右,在密闭外壳里如果散热没做,一小时后芯片表面温度能升到 60 度以上。长期高温对 eMMC 和 DDR 的寿命都不友好,工业项目至少加一块小散热片,再在系统里把 CPU 频率策略配成 ondemand 或 schedutil。
还有几个值得注意的稳定性细节:一是给设备加独立的硬件看门狗,产品侧跑模型没有看门狗,死机一次用户就流失一个;二是 4G 模块和 Wi-Fi 模块共地处理不好时,会在视频推流时产生偶发花屏,排查起来非常隐蔽;三是长时间写日志要限制 log 分区大小,否则 rootfs 写满后各种怪问题都会冒出来。
最后分享一个小技巧:我在 SD 卡上常备一份最小 rootfs 和对应 dtb,恢复系统时不用拆机烧 eMMC,直接改启动顺序从 SD 启动,确认环境没问题后再把正式固件写回板载存储。做开发板级调试这几年,这个习惯帮我省下来的时间不是一星半点。