Site Overlay

小试RV1126

编译固件

前言

RV1126使用的是我们熟悉的buildroot作为其文件系统的基底,并且提供了一套脚本,只需调用脚本就可以完成编译。

考虑到目前需要编译的程序较多,不得不考虑可能有的依赖冲突的问题,最近我一直在思考如何对依赖进行隔离,想到的方法有虚拟机、docker和NixOS这三种。

虚拟机方案目前已经在使用了,就是我家里的专门用来编译NJURadio的buildroot的服务器,但是虚拟机毕竟笨重,而且家里服务器的硬盘容量开始捉襟见肘,尝试一个新的方案是有必要的。

NixOS是从一个大佬那边听说的,包管理软件Nix可以做到完全由一个文件配置系统的所有组件,可以保证两台机器通过同一个配置文件进入完全一样的环境,也可以在一台机器上通过切换配置文件快速切换所有的环境。Nix也可以在其他发行版上运行,不过Nix的参考资料相对少,而且Nix本身就是一种独特的语言,学习成本较高,同时Nix不遵守FHS,对于千奇百怪的嵌入式厂商代码可能有兼容性问题,所以暂缓一下。

Docker相对来说比较轻便,部署很快,同时功能强大,因此这次固件编译会尝试在Docker上完成。

另外,我还想到了chrootfakeroot这类方案,也许之后会尝试一下可行性。

准备Docker环境

其实使用docker run命令就已经足够简便了,但是如果能再偷懒一些自然是更好的。

在解压好的sdk目录下创建docker-compose.yml文件:

version: '3'
services:
  compile:
    image: "ubuntu:18.04"
    volumes:
      - .:/code

理论来说,可以使用Dockerfile配合,实现自动化编译,不过PoC阶段还是先手动启动吧:

docker-compose run --rm compile 

其中--rm参数表示在退出后会直接删除容器。

这样就进入了容器内部的shell,首先配置一下apt镜像,然后就可以按照官方文档编译了:

cd /code

apt install repo gitk git-gui gcc-arm-linux-gnueabihf u-boot-tools device-tree-compiler gcc-aarch64-linux-gnu mtools parted libudev-dev libusb-1.0-0-dev python-linaro-image-tools linaro-image-tools autoconf autotools-dev libsigsegv2 m4 intltool libdrm-dev curl sed make binutils build-essential gcc g++ bash patch gzip gawk bzip2 perl tar cpio python unzip rsync file bc wget libncurses5 libqt4-dev libglib2.0-dev libgtk2.0-dev libglade2-dev cvs git mercurial rsync openssh-client subversion asciidoc w3m dblatex graphviz python-matplotlib libssl-dev expect fakeroot cmake flex bison liblz4-tool libtool keychain expect-dev libdb1-compat tzdata # libc6:i386被替换为了libdb1-compat tzdata

./build.sh cleanall

source envsetup.sh # 选择rockchip_rv1126_rv1109
./build.sh lunch # 选择BoardConfig-aybering.mk(谁能告诉我为什么是lunch)

./build.sh

虽然报了个错,不过看起来需要的update.img已经生成了,也许不影响?先看看再说。

./build.sh: line 774: .repo/repo/repo: No such file or directory
ERROR: Running build_save failed!
ERROR: exit code 127 from line 774:
    .repo/repo/repo forall -c "$TOP_DIR/device/rockchip/common/gen_patches_body.sh"

A311D需要先装这些:

apt install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
apt install file texinfo

移植Tengine

这个Tengine不是那个阿里魔改的NGINX

本想先测试下编译出的固件,但是发现官方提供的烧写工具似乎都要在Windows下运行,复古的界面设计理念让我梦回恩山和koolshare,实在是难绷,另一边学长希望我能先研究一下Tengine的交叉编译,看看能否移植上板子,所以就先看看这个。

其实在之前大四的时候接触过Tengine,当时是上的方元老师的一节课,用的是ARM中国出的一个OpenAILab的开发板,好像加速硬件是放在SoC里面的,虽然那门课是第一年开,授课方式是启发式的,但是对于我理解嵌入式AI加速的整个流程还是很有作用的。

交叉编译

RV1126使用的NPU是VeriSilicon提供的Vivante NPU方案,Tengine已经支持了VeriSilicon的TIM-VX(Tensor Interface Module for OpenVX, OpenVX 张量接口模块),只需要按照教程编译就行。

参考:Tengine/compile_timvx.md at tengine-lite · OAID/Tengine · GitHub

测试

使用官方的提供的mobilenet模型和小猫图片测试:

调用CPU计算:

[root@RV1126_RV1109:/tengine]# tm_classification -m ./mobilenet.tmfile -i ./cat.jpg -r 10
Image height not specified, use default 224
Image width not specified, use default  224
Scale value not specified, use default  0.0, 0.0, 0.0
Mean value not specified, use default   104.0, 116.7, 122.7
tengine-lite library version: 1.5-dev

model file : ./mobilenet.tmfile
image file : ./cat.jpg
img_h, img_w, scale[3], mean[3] : 224 224 , 0.017 0.017 0.017, 104.0 116.7 122.7
Repeat 10 times, thread 1, avg time 1605.65 ms, max_time 1634.16 ms, min_time 1600.97 ms
--------------------------------------
8.574152, 282
7.880113, 277
7.812574, 278
7.286448, 263
6.357489, 281
--------------------------------------

调用NPU计算,需要注意的是NPU使用的是uint8,需要使用uint8的模型文件,否则会报错。

[root@RV1126_RV1109:/tengine]# tm_classification_timvx -m ./mobilenet_uint8.tmfile -i ./cat.jpg -r 10
Image height not specified, use default 227
Image width not specified, use default  227
Scale value not specified, use default  1.0, 1.0, 1.0
Mean value not specified, use default   104.0, 116.7, 122.7
tengine-lite library version: 1.5-dev

model file : ./mobilenet_uint8.tmfile
image file : ./cat.jpg
img_h, img_w, scale[3], mean[3] : 227 227 , 1.000 1.000 1.000, 104.0 116.7 122.7
Repeat 10 times, thread 1, avg time 5.00 ms, max_time 5.73 ms, min_time 4.48 ms
--------------------------------------
5.680568, 611
5.600560, 281
4.960496, 326
4.880488, 282
4.400440, 324
--------------------------------------

速度有很明显的提升,不过似乎启动前摇相比CPU更强,不清楚是由于TIM-VX接口本身的原因还是demo程序的设计。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据