1. RV1106开发板初体验:从开箱到点亮
第一次拿到RV1106开发板时,我被它紧凑的尺寸和丰富的接口所吸引。这款基于RISC-V架构的嵌入式开发平台,尺寸仅有信用卡大小,却集成了1GHz主频的双核处理器、512MB DDR3内存和NPU加速单元。拆开防静电袋后,我注意到板载的40pin GPIO排针与树莓派兼容,这意味着可以复用大量现有扩展模块。
开发板配件清单中包含了Type-C电源线、散热片和简易天线。我特别检查了电源规格——要求5V/2A输入,使用手机充电器供电时发现电压不稳会导致启动异常,后来换用稳压电源后问题解决。串口调试用的是板载CH340芯片,通过microUSB连接电脑,在Linux下自动识别为/dev/ttyUSB0设备。
重要提示:RV1106的Type-C接口仅用于供电,数据传输需通过旁边的microUSB口,这个设计容易让人混淆,我第一次使用时花了半小时排查连接问题。
2. 开发环境搭建全记录
2.1 工具链安装与配置
官方推荐的开发环境是Ubuntu 18.04,但我实测在20.04上也能正常运行。首先需要安装交叉编译工具链:
bash复制wget https://rv1106-sdk.rock-chips.com/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz
tar xf gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz
echo 'export PATH=$PATH:/opt/toolchain/bin' >> ~/.bashrc
这个过程遇到两个坑:一是压缩包解压需要10GB磁盘空间,我的虚拟机最初分配空间不足;二是工具链版本必须严格匹配,尝试使用其他版本会导致链接错误。
2.2 系统镜像烧写实战
官方提供了四种固件类型:
- loader模式镜像(最小系统)
- uboot镜像(带bootloader)
- rootfs镜像(完整文件系统)
- OTA升级包
我选用SD卡烧录方式,先用fdisk创建两个分区:
code复制/dev/sdb1 # 16MB FAT32分区,存放uboot
/dev/sdb2 # 剩余空间 ext4分区,存放rootfs
使用dd命令烧写时要注意设备号不能搞错,有次误操作导致我的移动硬盘数据被清空。烧录完成后,通过串口看到系统启动日志的那一刻特别有成就感。
3. Linux系统深度定制指南
3.1 内核配置与编译技巧
RV1106使用Linux 4.19内核,配置界面中几个关键选项:
code复制CONFIG_CGROUPS=y # 必须开启,否则Docker无法运行
CONFIG_PREEMPT=y # 启用抢占式调度,提升实时性
CONFIG_CMA=y # 连续内存分配器,优化多媒体性能
编译命令看似简单:
bash复制make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- -j8
但实际会遇到的问题包括:
- 编译中途报错通常是因为内存不足,建议增加swap空间
- 修改配置后需要先执行
make clean - 内核版本号变更会导致模块兼容性问题
3.2 文件系统裁剪优化
原始rootfs有800MB,通过以下步骤精简到200MB:
- 删除冗余locale文件:
rm -rf /usr/share/locale/* - 清理文档和man页面:
rm -rf /usr/share/{doc,man} - 使用busybox替代coreutils
- 静态编译应用程序减少so依赖
优化后系统启动时间从15秒缩短到7秒,但要注意某些动态库被误删会导致apt无法运行。我制作了一个备份脚本,每次修改前自动创建快照。
4. 嵌入式开发实战案例
4.1 GPIO控制LED呼吸灯
硬件连接示意图:
code复制GPIO3_C5 -> 220Ω电阻 -> LED -> GND
对应的sysfs操作路径:
bash复制echo 125 > /sys/class/pwm/pwmchip0/export
echo 1000000 > /sys/class/pwm/pwmchip0/pwm0/period
echo 500000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
用Python实现渐变效果:
python复制import time
with open('/sys/class/pwm/pwmchip0/pwm0/duty_cycle', 'w') as f:
for i in range(0, 1000000, 10000):
f.write(str(i))
time.sleep(0.01)
实测发现PWM频率高于2kHz时LED会出现频闪,这是肉眼暂留效应的限制。
4.2 视频采集与NPU加速
RV1106的NPU支持INT8量化推理,典型使用流程:
- 用v4l2采集摄像头数据
- 通过RGA引擎做图像格式转换
- 调用rknn-toolkit加载预训练模型
- 使用NPU执行推理
一个完整的人脸检测示例:
bash复制gst-launch-1.0 v4l2src ! video/x-raw,format=NV12,width=640,height=480 ! \
tee name=t ! queue ! kmssink t. ! queue ! rknn inference model=face_detection.rknn ! \
videoconvert ! xvimagesink
这个管道命令的帧率能达到30FPS,而相同算法在CPU上只有5FPS。需要注意的是NPU内存有限,输入图像尺寸不能超过1080P。
5. 开发陷阱与性能调优
5.1 常见问题排查手册
-
串口无输出:
- 检查TX/RX线序是否接反
- 确认波特率设置为1500000(这个非标准值容易设错)
- 测量UART电压应为3.3V
-
WiFi连接不稳定:
bash复制iwconfig wlan0 power off # 关闭省电模式 echo "options rtl8189fs ht40_2g=1" > /etc/modprobe.d/rtl8189fs.conf -
NPU推理异常:
- 使用rknn-toolkit的debug模式查看层输出
- 检查模型输入尺寸与训练时一致
- 确认量化参数正确加载
5.2 性能优化 checklist
- [ ] CPU调频策略设为performance模式
- [ ] 使用
CONFIG_HZ_1000内核配置提升响应速度 - [ ] DMA缓冲区对齐到64字节边界
- [ ] 禁用不必要的后台服务(bluetoothd、avahi-daemon)
- [ ] 使用
rt-tests测试实时性指标
通过上述优化,我的一个图像处理项目延迟从120ms降低到45ms。最关键的发现是默认的CFS调度器不适合实时任务,改用SCHED_FIFO策略后抖动减少了70%。
6. 进阶开发技巧
6.1 外设驱动开发实录
为某款I2C温度传感器编写驱动时,发现官方文档的寄存器地址有误。通过逻辑分析仪抓取的波形显示,实际需要先发送0xAC命令字才能读取数据。最终驱动核心代码如下:
c复制static int temp_read(struct i2c_client *client, u8 *buf)
{
u8 cmd[2] = {0xAC, 0x00};
struct i2c_msg msgs[2] = {
{client->addr, 0, 2, cmd},
{client->addr, I2C_M_RD, 1, buf}
};
return i2c_transfer(client->adapter, msgs, 2);
}
这个案例教会我:硬件文档不可全信,实际测试才是王道。后来我养成了用示波器验证所有外设通信协议的习惯。
6.2 系统监控方案实现
利用RV1106内置的硬件监控单元,我搭建了温度-频率关联分析系统:
python复制import psutil, time
while True:
temp = open('/sys/class/thermal/thermal_zone0/temp').read()
freq = open('/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq').read()
print(f"{time.time()},{temp.strip()},{freq.strip()}")
time.sleep(1)
收集的数据显示,当芯片温度超过80℃时,CPU会自动降频到800MHz。为此我改进了散热方案:在芯片表面涂覆导热硅脂,并加装微型散热风扇,使满负载温度控制在65℃以下。
在项目后期,我还实现了通过MQTT远程监控多个开发板状态的功能。使用Paho-MQTT库时需要注意设置合理的keepalive时间,否则在弱网环境下会出现虚假断开。