
1. 项目概述从零上手瑞芯微RV1106最近在折腾一块基于瑞芯微RV1106芯片的LuckFox Pico Max开发板这玩意儿别看它体积小巧功能可一点不含糊。RV1106这颗芯片定位在边缘AIoT领域集成了ARM Cortex-A7 CPU和一颗NPU主打的就是低功耗下的轻量级视觉智能处理。对于想入门嵌入式AI开发或者想给自己的小项目找个“带脑子”的控制核心的朋友来说RV1106是个性价比很高的选择。我拿到板子后从点亮系统到跑通第一个AI应用中间踩了不少坑也总结了一套相对顺畅的流程。这篇文章我就把自己从环境搭建、系统烧录、到编写第一个“Hello World”级别AI应用的全过程拆解一遍目标是让哪怕只有一点点Linux和编程基础的朋友也能跟着一步步把板子玩起来。整个流程的核心其实就是解决三个问题第一怎么让开发板“活”过来也就是烧录一个可运行的系统第二怎么和这块板子“对话”建立开发调试环境第三怎么利用它内置的NPU跑一个简单的AI模型验证整个链路。我会重点分享在Windows和Linux两种主机环境下操作的异同以及那些官方文档可能一笔带过但实际操作中却至关重要的细节。2. 开发环境全链路搭建与避坑指南上手任何嵌入式开发板第一步永远是把环境理顺。RV1106的开发环境主要分为两部分主机你的电脑的开发环境和目标板RV1106开发板的运行环境。两者通过USB线用于供电、烧录和调试和网络用于文件传输和远程登录连接。2.1 主机侧驱动、工具与交叉编译链在主机上我们需要准备三样东西USB驱动、烧录工具和交叉编译工具链。这是和板子建立物理连接和逻辑沟通的基础。1. USB驱动安装以Windows为例RV1106芯片进入烧录模式MaskRom模式后会被电脑识别为一个特定的USB设备。要让Windows系统正确识别并与之通信必须安装瑞芯微提供的DriverAssitant驱动助手。这一步看似简单却是新手最容易卡住的地方。注意务必在连接开发板之前先安装好驱动助手并完成安装。如果先连板子再装驱动系统可能会自动安装一个错误的通用驱动导致后续工具无法识别设备。操作步骤从LuckFox官方Wiki或瑞芯微开发者网站下载最新的DriverAssitant_vx.x.exe。右键以管理员身份运行点击“驱动安装”。安装完成后必须重启电脑。很多驱动相关问题重启后都能解决。安装成功后你可以打开设备管理器当开发板进入MaskRom模式并连接电脑后会在“通用串行总线控制器”或“便携设备”下看到一个“USB Download Gadget”之类的设备这就表示驱动成功了。2. 烧录工具准备烧录工具我们使用瑞芯微官方的RKDevTool。这个工具负责将编译好的系统镜像一个.img文件写入到开发板的SPI NAND Flash中。同样从官网下载解压即可使用。需要注意的是不同版本的芯片可能需要特定版本的烧录工具对于RV1106使用较新的RKDevTool v2.x版本一般都能兼容。3. 交叉编译工具链部署这是开发的核心。我们的应用程序是在x86架构的电脑上编写的但最终要在ARM架构的RV1106上运行。因此我们需要一个“翻译官”——交叉编译工具链。LuckFox官方SDK里已经包含了针对RV1106优化过的工具链。对于Linux主机用户这是最推荐的方式。你可以直接从LuckFox的Git仓库克隆完整的SDK里面包含了预编译好的工具链通常位于prebuilts/gcc/linux-x86/arm/目录下。之后你需要将工具链的路径添加到系统的PATH环境变量中例如在~/.bashrc文件末尾添加export PATH/your_sdk_path/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin:$PATH。添加后执行source ~/.bashrc使其生效然后在终端输入arm-linux-gnueabihf-gcc -v如果能显示版本信息就说明配置成功了。对于Windows主机用户虽然可以在Windows上安装MSYS2或Cygwin来模拟Linux环境并使用交叉工具链但我强烈不建议这么做。兼容性问题会多到让你怀疑人生。更稳妥的方案是在Windows上安装一个虚拟机如VMware或VirtualBox然后安装一个Ubuntu系统在虚拟机里进行所有编译工作。或者使用Windows 10/11自带的WSL2Windows Subsystem for Linux这也是一个非常优秀的选择。2.2 目标板侧系统镜像获取与选择开发板出厂时通常自带一个极简的测试系统但为了进行完整开发我们需要烧录一个功能更全面的系统镜像。LuckFox为RV1106提供了多种镜像Buildroot镜像这是最常用、最轻量的选择。Buildroot是一个通过交叉编译生成嵌入式Linux系统的工具它生成的系统非常精简没有多余的包适合产品化。官方提供的luckfox_pico_pro_max_image大多基于Buildroot。Ubuntu Core镜像一个更接近桌面体验的系统包管理使用apt安装软件方便但系统体积较大占用更多Flash和内存。Yocto镜像高度可定制化的工业级系统生成框架学习曲线陡峭适合有特定定制化需求的资深开发者。对于初学者和大多数应用开发直接使用官方预编译的Buildroot镜像是最快最好的选择。你可以从官方提供的网盘或GitHub Release页面下载。下载时注意对应你的板型LuckFox Pico Max以及镜像类型SPI NAND Flash用。拿到镜像文件通常是一个.img文件后建议先校验一下MD5或SHA256值确保下载过程没有出错避免烧录后无法启动这种玄学问题。3. 系统烧录实战与关键细节解析环境准备好后我们来执行最激动人心的一步——给开发板“刷机”。这个过程是将系统镜像物理写入Flash芯片的过程。3.1 进入烧录模式MaskRomRV1106芯片有两种启动模式正常启动模式和MaskRom模式。烧录必须在MaskRom模式下进行。进入此模式的方法对于LuckFox Pico Max这类板子通常是开发板不要连接电源或USB线。找到板子上标有BOOT或RECOVERY的按键。按住这个BOOT键不松开。将开发板的USB-C口用于烧录和调试的那个连接到电脑的USB口。等待1-2秒松开BOOT键。此时电脑应该会发出检测到新硬件的提示音。打开设备管理器或RKDevTool如果看到设备被识别就说明成功进入了MaskRom模式。实操心得有时一次操作可能不成功可以多试几次。确保按住的确实是BOOT键并且是在连接USB的同时按住而不是先连再按。如果始终无法识别检查USB线是否支持数据传输有些线只能充电并尝试更换电脑的USB端口。3.2 使用RKDevTool进行烧录打开RKDevTool以管理员身份运行RKDevTool.exe。连接设备将处于MaskRom模式的开发板连接电脑。软件下方日志区域会显示“发现一个MASKROM设备”。加载固件点击“固件”按钮选择你下载解压后的.img镜像文件。软件会解析镜像。勾选与烧录解析完成后在右侧列表中通常需要勾选所有分区如loader,uboot,boot,rootfs等。对于首次烧录或完整升级全选是最稳妥的。然后直接点击“执行”按钮。等待完成烧录过程会有进度条显示并伴有日志输出。整个过程大约需要1-3分钟取决于镜像大小。烧录期间绝对不要断开USB连接或关闭软件否则可能导致板子“变砖”。重启烧录完成后软件会提示“下载完成”。此时可以先关闭RKDevTool软件然后拔掉开发板的USB线再重新插上。这次不需要按BOOT键板子会自动从新烧录的系统启动。3.3 验证系统启动系统启动后我们需要确认它运行起来了。最直接的方式是通过串口登录。RV1106开发板都会引出一个UART串口通常是三根针GND, TX, RX。准备USB转TTL串口线你需要一根这样的线如CH340、CP2102芯片的价格很便宜。连接将串口线的GND接开发板的GNDTX接开发板的RXRX接开发板的TX。注意是交叉连接配置串口终端在电脑上使用串口终端软件Windows用Putty、MobaXtermLinux用minicom或screen。端口号在设备管理器中查看如COM3波特率设置为1500000这是瑞芯微平台常见的波特率不是传统的115200。数据位8停止位1无校验无流控。上电观察给开发板上电通过USB或电源接口在串口终端里应该能看到如海浪般的启动日志最后出现登录提示符比如luckfox login:。输入默认用户名通常是root无需密码即可登录。看到熟悉的Linux命令行提示符#恭喜你系统烧录成功4. 建立高效开发调试环境现在板子能跑了但我们不可能每次修改代码都重新烧录整个系统。一个高效的嵌入式开发环境依赖于稳定的网络连接和便捷的文件传输与调试手段。4.1 网络配置与SSH登录串口登录虽然稳定但传输速度慢不方便复制粘贴。通过SSH over Ethernet或Wi-Fi登录是更佳选择。有线网络以太网将开发板的网口通过网线连接到路由器或者直接与电脑网口用网线直连需要配置静态IP。系统启动后默认可能启用了DHCP。在串口终端里输入ifconfig或ip addr查看eth0接口是否获取到了IP地址如192.168.1.xxx。在主机上使用SSH客户端如PuTTY、MobaXterm或Linux终端下的ssh命令连接这个IPssh root192.168.1.xxx。首次连接会提示保存主机密钥确认即可。无线网络Wi-Fi 如果开发板支持Wi-Fi如LuckFox Pico Max带有SDIO接口可接Wi-Fi模块配置稍复杂但更灵活。扫描Wi-Fiiwlist wlan0 scanwlan0是无线网卡设备名可能不同。生成Wi-Fi配置文件编辑/etc/wpa_supplicant.conf添加如下内容network{ ssid你的Wi-Fi名称 psk你的Wi-Fi密码 }连接Wi-Fiwpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf。获取IPudhcpc -i wlan0。同样用ifconfig wlan0查看获取到的IP然后通过SSH连接。注意事项开发板的Buildroot系统可能默认没有安装iwlist、wpa_supplicant等网络工具。如果遇到命令找不到需要在编译Buildroot根文件系统时在Target packages-Networking applications下勾选相应的包如wpa_supplicantwireless-tools然后重新编译系统镜像。这就是为什么理解系统构建很重要的原因。4.2 文件传输SCP与RSync代码在主机上交叉编译好后需要传输到开发板上。最常用的工具是scp基于SSH的安全拷贝。从主机传到开发板scp ./your_app root192.168.1.xxx:/home/root/从开发板传到主机scp root192.168.1.xxx:/home/root/log.txt ./对于需要频繁同步的目录使用rsync更高效它只传输变化的文件部分rsync -avz ./project_dir/ root192.168.1.xxx:/home/root/project_dir/4.3 交叉编译第一个程序让我们用经典的“Hello, RV1106!”来验证整个交叉编译和部署流程。编写代码在主机上创建一个hello.c文件。#include stdio.h int main() { printf(Hello, RV1106!\n); return 0; }交叉编译使用之前配置好的交叉编译工具链进行编译。注意不是用本机的gcc。# 在Linux主机或WSL2的终端中执行 arm-linux-gnueabihf-gcc -o hello hello.c -static # 静态链接避免依赖问题-static参数很重要它会把程序依赖的库都打包进可执行文件这样编译出来的程序可以直接在开发板上运行无需担心目标板上缺少动态库。传输与运行# 传输到开发板 scp hello root192.168.1.xxx:/tmp/ # SSH登录开发板 ssh root192.168.1.xxx # 在开发板上运行 cd /tmp chmod x hello ./hello如果屏幕上打印出“Hello, RV1106!”那么恭喜你你的交叉编译环境、网络连接和文件传输整个链路都打通了5. RV1106 NPU应用开发入门手写数字识别实战RV1106的精华在于其内置的NPU神经网络处理单元。接下来我们以最经典的MNIST手写数字识别为例走通AI模型在RV1106上部署的全流程。这个过程可以分为三步模型准备与转换、模型部署、编写应用程序调用。5.1 模型准备与RKNN转换RV1106的NPU需要通过瑞芯微提供的RKNN-Toolkit2工具链来运行模型。它不支持直接运行原始的TensorFlow、PyTorch或ONNX模型需要先转换成专用的.rknn格式。1. 安装RKNN-Toolkit2这是一个Python工具包建议在主机上安装可以在Linux主机或Windows的WSL2/Python环境中安装。# 假设已安装Python3和pip pip install rknn-toolkit2安装后可以通过python3 -c from rknn.api import RKNN; print(RKNN-Toolkit2 installed successfully)来验证。2. 模型转换示例以ONNX模型为例假设我们有一个训练好的、用于MNIST手写数字识别的简单卷积神经网络并已导出为mnist.onnx。 我们编写一个Python转换脚本convert.pyfrom rknn.api import RKNN INPUT_SIZE 28*28 # MNIST图像是28x28灰度图 if __name__ __main__: # 1. 创建RKNN对象 rknn RKNN(verboseTrue) # 2. 模型配置 print(-- Config model) rknn.config(mean_values[[0]], std_values[[255]], target_platformrv1106) # mean_values/std_values用于输入归一化。对于[0,255]的灰度图我们这样配置。 # target_platform必须指定为rv1106。 # 3. 加载ONNX模型 print(-- Loading model) ret rknn.load_onnx(model./mnist.onnx, inputs[input], input_size_list[[1, 1, 28, 28]]) # inputs: 模型输入节点名需要根据你的模型定义修改。 # input_size_list: [batch, channel, height, width]这里是1张图1个通道(灰度)28x28大小。 if ret ! 0: print(Load model failed!) exit(ret) # 4. 构建RKNN模型 print(-- Building model) ret rknn.build(do_quantizationTrue, dataset./dataset.txt) # do_quantization: 是否进行量化。量化能显著减小模型体积、提升NPU推理速度是必选项。 # dataset: 量化所需的校准数据集文件。该文件是一个文本文件里面每一行是一个用于量化的图片路径。 if ret ! 0: print(Build model failed!) exit(ret) # 5. 导出RKNN模型 print(-- Export rknn model) ret rknn.export_rknn(./mnist.rknn) if ret ! 0: print(Export rknn model failed!) exit(ret) # 6. 释放资源 rknn.release()关于量化数据集dataset.txt文件需要你自己准备。内容是你收集的一些代表性图片的路径每行一个例如./calib_data/0.jpg ./calib_data/1.jpg ...这些图片用于在量化过程中统计激活值的分布图片数量通常100-200张即可最好能覆盖所有类别。图片格式需要与模型输入要求一致28x28灰度图。运行这个脚本python3 convert.py成功后会生成mnist.rknn文件这就是可以在RV1106 NPU上运行的模型文件。5.2 在RV1106上部署与运行RKNN模型将转换好的mnist.rknn模型文件传输到开发板上。同时瑞芯微提供了在板端运行RKNN模型的C语言API库librknnrt.so和头文件。这些通常已经预装在官方镜像中或者可以在SDK的external/rknpu2/runtime/RV1106/目录下找到。我们编写一个C语言应用程序mnist_demo.c来调用这个模型#include stdio.h #include stdlib.h #include string.h #include “rknn_api.h” // RKNN头文件 #define MODEL_PATH “/home/root/mnist.rknn” #define IMG_SIZE (28*28) int main(int argc, char** argv) { rknn_context ctx; int ret; // 1. 加载RKNN模型 FILE *fp fopen(MODEL_PATH, “rb”); if(fp NULL) { printf(“Open model file failed!\n”); return -1; } fseek(fp, 0, SEEK_END); int model_size ftell(fp); void *model_data malloc(model_size); fseek(fp, 0, SEEK_SET); fread(model_data, 1, model_size, fp); fclose(fp); // 2. 初始化RKNN上下文 ret rknn_init(ctx, model_data, model_size, 0, NULL); if(ret 0) { printf(“rknn_init failed! ret%d\n”, ret); free(model_data); return -1; } free(model_data); // 初始化后模型数据可以释放 // 3. 获取模型输入输出信息 rknn_input_output_num io_num; ret rknn_query(ctx, RKNN_QUERY_IN_OUT_NUM, io_num, sizeof(io_num)); // 这里可以查询输入/输出的维度等信息根据信息准备数据 // 4. 准备输入数据 (假设我们有一个预处理好的图像数组input_data[IMG_SIZE]) // 图像预处理读取图片缩放到28x28转换为灰度归一化到[0,1]等。 unsigned char input_data[IMG_SIZE]; // ... (此处省略图片加载和预处理代码) ... // 假设input_data已经准备好值是0~255 rknn_input inputs[1]; inputs[0].index 0; // 第一个输入 inputs[0].type RKNN_TENSOR_UINT8; // 数据类型根据量化类型定 inputs[0].fmt RKNN_TENSOR_NHWC; // 数据布局 inputs[0].buf input_data; inputs[0].size IMG_SIZE; ret rknn_inputs_set(ctx, 1, inputs); if(ret 0) { printf(“rknn_inputs_set failed! ret%d\n”, ret); rknn_destroy(ctx); return -1; } // 5. 运行推理 ret rknn_run(ctx, NULL); if(ret 0) { printf(“rknn_run failed! ret%d\n”, ret); rknn_destroy(ctx); return -1; } // 6. 获取输出 rknn_output outputs[1]; outputs[0].want_float 1; // 希望以浮点数形式获取输出量化后的模型内部是INT8但API可以转回float outputs[0].is_prealloc 0; // 由API内部分配输出内存 ret rknn_outputs_get(ctx, 1, outputs, NULL); if(ret 0) { printf(“rknn_outputs_get failed! ret%d\n”, ret); rknn_destroy(ctx); return -1; } // 7. 处理输出 (对于MNIST输出是10个类别的概率) float *output_buffer (float *)outputs[0].buf; int max_index 0; for(int i 1; i 10; i) { if(output_buffer[i] output_buffer[max_index]) { max_index i; } } printf(“The predicted digit is: %d, with confidence: %f\n”, max_index, output_buffer[max_index]); // 8. 释放输出和销毁上下文 rknn_outputs_release(ctx, 1, outputs); rknn_destroy(ctx); return 0; }5.3 交叉编译与板端执行交叉编译应用程序 编译时需要链接RKNN运行时库。假设RKNN库和头文件在主机SDK目录下。# 设置交叉编译器和库路径 export CCarm-linux-gnueabihf-gcc export RKNN_LIB/path/to/sdk/external/rknpu2/runtime/RV1106/Linux/rknn_api/armhf/librknnrt.so export RKNN_INC/path/to/sdk/external/rknpu2/runtime/RV1106/Linux/rknn_api/include/ $CC -o mnist_demo mnist_demo.c -I${RKNN_INC} -L$(dirname ${RKNN_LIB}) -lrknnrt -static再次使用-static静态链接避免板端缺少librknnrt.so的动态库依赖。实际上如果板端系统已经安装了该库也可以动态链接。部署与运行将编译好的mnist_demo、mnist.rknn和一个测试用的28x28灰度图如test_digit.jpg传输到开发板。在应用程序中完善图片加载和预处理的代码使用stb_image.h等轻量库或自己写简单的BMP/二进制文件读取。在开发板上运行./mnist_demo程序会加载模型和图片进行推理并打印出识别结果。当你在开发板的终端上看到它正确地识别出了手写的数字那一刻的成就感就是嵌入式AI开发最大的乐趣所在。这个过程涵盖了从模型转换、交叉编译、到NPU API调用的完整链条理解了它你就掌握了在RV1106上进行AI应用开发的核心方法。6. 进阶开发与深度优化方向完成基础功能后你可以朝着更实际、更深入的方向探索这能极大提升你的项目质量和对芯片的理解。6.1 摄像头采集与实时识别RV1106搭配摄像头如SC3336可以实现实时视觉应用。这涉及到V4L2Video for Linux 2框架的使用。打开摄像头设备通常是/dev/videoX。设置采集格式通过ioctl调用设置像素格式如V4L2_PIX_FMT_NV12、分辨率、帧率。申请缓冲区并开始采集使用内存映射mmap方式获取图像数据。图像预处理将采集到的YUVNV12格式图像转换为模型需要的RGB或灰度图并缩放到模型输入尺寸如28x28。这个过程可以在CPU上完成对于性能要求高的场景可以研究使用RGARisc Graphics AcceleratorRV1106内置的2D图形加速器进行高效的色彩空间转换和缩放。流水线化将采集、预处理、推理、后处理如画框、显示放在不同的线程中用生产者-消费者模型组织起来实现高效的流水线避免因某一环节阻塞导致掉帧。6.2 使用RGA加速图像处理RGA是瑞芯微芯片内置的硬件加速器能极大加速图像缩放、旋转、格式转换等操作。对于AI应用常用它来做NV12 - RGB/BGR转换和Resize。使用RGA通常有两种方式调用librockchip_rga库这是一个较上层的封装API相对简单。直接调用内核驱动通过ioctl与/dev/rga设备通信更底层控制更灵活。在应用程序中集成RGA可以将预处理耗时从几十毫秒降低到几毫秒对于高帧率应用至关重要。6.3 性能分析与优化当应用跑起来后你可能会关心NPU的利用率如何CPU负载高吗内存够用吗CPU/NPU负载使用top或htop命令查看整体CPU占用。更细粒度的可以通过读取/sys/class/devfreq/下的节点来查看NPU等硬件单元的频率和负载情况。内存使用free命令查看内存和Swap使用情况。注意RV1106内存不大通常128MB或256MB要警惕内存泄漏。性能热点分析使用perf工具对应用程序进行性能剖析找到最耗时的函数针对性地优化比如将某些预处理从CPU移到RGA。模型优化这是提升性能最有效的一环。在模型转换时尝试不同的量化精度如uint8,int16在精度和速度之间权衡。使用RKNN-Toolkit2提供的性能评估功能在PC上先预估模型在RV1106上的推理时间。6.4 构建自定义根文件系统当你的应用越来越复杂依赖的库越来越多时预编译的镜像可能无法满足需求。这时就需要自己用Buildroot或Yocto构建根文件系统。Buildroot相对简单。在SDK目录下运行make menuconfig进入配置界面你可以增加或删除软件包如增加openssh,python3,ffmpeg。配置内核选项但RV1106的内核配置通常已由SDK提供。添加你自己的应用程序到output/target/目录或者编写一个mk文件将编译好的程序打包进镜像。配置系统启动服务让你的应用在开机时自动运行。修改配置后运行make即可开始编译。整个过程会从网络下载源代码并编译时间较长。最终生成的rootfs.ext2等镜像文件可以用于烧录。7. 常见问题排查与实战心得最后分享一些我踩过坑后总结出来的经验希望能帮你节省大量调试时间。1. 烧录失败工具提示“下载IDB失败”或“校验失败”可能原因1没有正确进入MaskRom模式。重新严格按照步骤操作断电 - 按住BOOT - 上电 - 松开BOOT。可能原因2USB线或USB口有问题。换一根确认能传输数据的USB线换一个电脑USB口优先使用后置主板上的USB口。可能原因3镜像文件损坏。重新下载镜像并校验MD5值。可能原因4板载Flash有坏块或硬件故障。尝试擦除Flash后重试在RKDevTool高级功能中有擦除选项如果多次失败可能是硬件问题。2. 系统启动后串口无任何输出检查接线确认USB转TTL串口线的TX、RX是否与开发板交叉连接TX接RX RX接TXGND是否连接。检查波特率RV1106 UART默认波特率通常是1500000不是115200务必在串口终端软件中设置正确。检查电源确保开发板供电充足。有些USB口供电不足会导致系统无法正常启动。3. SSH连接被拒绝或超时确认IP地址通过串口登录用ifconfig或ip addr确认开发板获取到的IP地址是否正确。检查网络连通性在开发板上ping一下你的电脑IP在电脑上ping一下开发板IP看是否互通。检查SSH服务开发板的Buildroot镜像默认可能未开启SSH。需要确保/etc/init.d/S50sshd存在且可执行或者检查ps | grep sshd是否有进程。如果没有需要在Buildroot配置中勾选OpenSSH并重新编译系统。4. 运行交叉编译的程序提示“No such file or directory”这通常是因为动态链接的程序在开发板上找不到对应的动态库。虽然我们用了-static静态链接来避免这个问题但如果你编译的是动态链接程序就需要将依赖的库如libc.so,libm.so等也拷贝到开发板的/lib目录下。使用file your_app查看程序类型使用arm-linux-gnueabihf-readelf -d your_app | grep NEEDED查看需要的动态库。5. RKNN模型推理结果不对或精度骤降检查预处理这是最常见的问题。确保你的应用程序中对输入图像的预处理归一化、减均值、除标准差与模型转换时rknn.config()中设置的mean_values和std_values完全一致且数据格式NHWC/NCHW一致。检查量化数据集量化校准数据集dataset.txt中的图片是否具有代表性数量是否足够建议100张图片内容是否与真实应用场景一致尝试关闭量化在rknn.build()中设置do_quantizationFalse生成一个浮点模型在NPU上运行速度会慢但精度有参考价值对比结果以判断是否是量化引入的误差。6. 程序运行一段时间后崩溃或内存不足RV1106内存有限。务必检查内存泄漏在C程序中确保malloc/freerknn_init/rknn_destroyrknn_outputs_get/rknn_outputs_release成对调用。栈空间避免在函数内定义过大的局部数组如大尺寸图像缓冲区改用堆内存malloc。监控内存在开发板上使用free命令和cat /proc/meminfo动态观察内存使用情况。嵌入式开发就是这样三分写代码七分调环境、查问题。每一个问题的解决都会让你对系统底层的理解加深一分。RV1106是一个功能强大且性价比极高的平台从简单的GPIO控制到复杂的实时AI视觉应用它都能胜任。希望这篇从零开始的记录能为你打开这扇门提供一块坚实的垫脚石。剩下的就交给你的创意和动手能力了。