【EASY EAI Nano开源套件试用体验】2.C_C++开发环境搭建 大信(QQ:8125036)
电子发烧友和灵眸科技退出了EASY EAI Nano 开发板试用。该开发板是基于Rockchip 的RV1126 AIoT处理器开发,采用四核32位Cortex®-A7架构,集成2.0TOPs AI算力的NPU,可以作为为工业嵌入式处理器,开发板还支持多路视频编解码,有丰富的扩展接口,能够广泛适用物联网边缘计算以及智能应用,如人脸闸机、车载录像、安防监控等方面。 同时EASY EAI Nano开发板提供了开发环境和SDK,为了充分的了解这些功能,就需要使用这些开发工具开发应用,才能更好的体验到该开发板的特性。
一、下载技术文档
开发板所有资源在百度云盘上,首先下载工具和开发环境 https://pan.baidu.com/s/1AjOIu77mzFM4cDA0MMVr2A#list/path=%2F
提取资料码: 5ttf
开发环境下几个文件都要下载
其中工具和源码和例程是对开发需要的,可以把他们下载下来。还有一些AI算法的例程和算法模型也有,这些算法模型在后面的AI测试开发中会使用到,也下载下来。
开发中所有文档内容都在 https://www.easy-eai.com/document_details/3/138这个网址下。
在线文档对应了EasyEAI nano开发板相应的软硬件资料,包括开发板刷机,入门指南,开发工具使用,开发实例非常丰富。同时该开发板支持基于QT的图形界面的开发。 二、开发主机环境准备
开发板文档里使用Ubuntu做为开发主机上的操作系统,提供一个在线的VMware的导出镜像包,可以直接下载下来导入本地的VMware里直接使用,非常方便。 首先在资料库的百度云盘里把虚拟机文件夹里所有文件下载下来,建议下班后使用百度客户端下载,这样第二天早上就可以看到下载的东西了J
把几个文件下载到本地后,找一个空间大的硬盘空间,准备导入到VMware里。 启动vmware,然后点文件选择打开:
找到 EASY-EAI-Develop.ovf文件,点确定。
然后会提示自动导入到VMware里,在提示导入的虚拟机文件保存位置时要注意,默认是C盘,而虚拟机文件又很大,展开后有 40G 之巨,因此很容易造成windows C 盘空间爆满,因此这里选择一个空间大的盘位置来放置虚机文件。,
导入成功后,点中该虚拟机,选择属性进行必要的配置,再在设置里根据电脑的性能,为只分配好虚拟CPU数与内存数,这里设置4核,4GB:
配置网络连接为网桥模式,为了和网络里其它主机在同一个网段,方便后面的网络应用测试。
再打开共享文件,把windows下的EASY-EAI工作目录设置为Ubuntu共享文件夹,作为windows与Ubuntu系统文件交换的空间。
做完以上设置后,即完成了虚机的开发基本环境的准备工作。 三、安装开发工具包
配置完Vmware后,启动虚机就可以进入虚机的Ubuntu环境,通过ssh连接到虚机的命令行环境,可以看到开发虚机里的系统。
再把Easy-EAI开发环境设置脚本 develop_environment.sh 放到home目录下,修改一下该脚本内容如下:
查看环境的 path目录设置如下:
经过后续的实际使用,发现该集成开发环境中的SDK缺少rkMedia库,因此许多例程无法编译通过。因此需要重新安装以下新的开发SDK,SDK文件单独放在这个目录下,因此找一个时间最新的版本下载下来,我下载的是:rv1126_rv1109_compiler_20221025_142156.tar.gz 压缩包。
下载完后,copy到虚拟机的opt目录下,即和原来SDK放在同一个位置,这样许多脚本都不需要修改就可以使用最新的SDK了。 为了避免新版的SDK缺少老板的库,这里把系统内带的老版的SDK目录改名为 rv1126_rv1109_sdk.1/,则新版解压后,同样改名为 rv1126_rv1109_sdk.2,再建立一个软链接,指向.2版本,这样就可以使用新版的SDK了,如果一些例程只能在老版SDK下编译,同样只要改一下这个链接指向即可,这样很方便。
在使用中发现虚拟机内容的 ARM-linux-gcc 安装了多个版本,一个版本在 /usr/bin下, 另一个版本在 /opt/rv1126_rv1109_sdk/buildroot/output/rockchip_face_board/host/bin路径下,而两个版本不一致,而又都在系统默认的路径中,导致在编译时,时常会出编译链接警告异常,不同版本的编译器链接到对方的gcc运行时库上。为了避免这样的问题,需要把低版本的,即在 /usr/bin 下的arm-linux-gcc 编译工具整个删除掉。这样系统只剩一个: 最后编译工具路径下的文件内容如下: cd /opt/rv1126_rv1109_sdk/buildroot/output/rockchip_face_board/host/bin
至此开发编译工具安装完成。
四、开发环境检查
安装好了开发板的编译开发环境后,可以先进行一下检查,根据,看一下交叉编译的工具的版本信息: 首先执行切换进入交叉环境: sourceeasy-eai-dev.sh
然后查看一下环境中的 $CC 编译器名,以及SDK头文件目录,库目录等信息,如下:
交叉编译环境变量:
C编译器版本:
C++ 编译器版本
五、开发测试程序
同样搭建好了开发环境以后,就可以做先一个简单的c和c++程序的测试程序。 写一个hello测试程序:
- #include
- int main()
- {
- printf("n");
- printf("Hello, EASY-EAI-NANO devkit!");
- printf("n");
- return 0;
- }
复制代码
再写一个Makefile
- target=hello
- all: main.o
- ${CC} -o $(target) $^ -L/mnt/hgfs/EASY-EAI-NANO/proj/rkmedia-sdk/rkmedia-master/build/src
- main.o:
- ${CC} -O3 -I . -c main.c -I/mnt/hgfs/EASY-EAI-NANO/proj/rkmedia-sdk/rkmedia-master/include
-
- scp:
- scp $(target) root@192.168.50.233:/userdata
-
- clean:
- rm -rf *.o *.bak $(target)
复制代码
然后编译,上传,运行,结果如下图:
板上运行得到正确的结果:
再写一个C++代码,找使用 bbp 算法计算1000位圆周率的代码,如下:
- #include
- #include
- #include
- #include <time.h>
- using namespace std;
- double bbp(int n,int k,int l)
- {
- int i;
- long b=1;
- double c=1;
- if(n>k)
- {
- for(i=n-k;i!=0;i--)
- b=(b*16+0)%(8*k+l);
- return(((double)b)/((double)(8*k+l)));
- }
- else
- if(n==k)
- return(((double)1)/((double)(8*k+l)));
- else
- {
- for(i=0;i<(k-n);i++)
- c=c/16;
- return(c/(8*k+l));
- }
- };
- void pi(int m,int n,int p[])
- {
- double a=0;
- int k=0;
- while(k<(n+8))
- {
- a+=4+4*bbp(n,k,1)-2*bbp(n,k,4)-bbp(n,k,5)-bbp(n,k,6);
- a=a-(int)a;
- k++;
- }
- for(k=0;k
- {
- a*=16;
- p[k]=(int)a;
- a=a-(int)a;
- }
- }
- void div(int p[])
- {
- int i,j=0;
- for(i=0;i<300;i++)
- {
- p[i]=j*10000+p[i];
- j=p[i]%2;
- p[i]=p[i]/2;
- }
- }
- void add(int a[],int b[])
- {
- int i,j=0;
- for(i=299;i>=0;i--)
- {
- a[i]=a[i]+b[i]+j;
- if(a[i]>=10000)
- {
- a[i]-=10000;
- j=1;
- }
- else
- j=0;
- }
- }
- void pi_calc()
- {
- int i,j,p[1100]={0},r[300]={0};
- short q[4000];
-
- for(i=0;i<125;i++)
- pi(8,i*8,p+i*8);
-
- for(i=0;i<1000;i++)
- {
- j=p[i];
- q[i*4+3]=j%2;
- j=j/2;
- q[i*4+2]=j%2;
- j=j/2;
- q[i*4+1]=j%2;
- j=j/2;
- q[i*4+0]=j%2;
- p[i]=0;
- }
- p[0]=10000;
- for(i=0;i<4000;i++)
- {
- div(p);
- if(q[i])
- add(r,p);
- }
- //cout<<3<<" ";
- printf("3.");
- for(i=0;i<250;i++)
- printf("%04d", r[i]);
-
- for(i=0;i<0;i++)
- {
- if(r[i]<10)
- cout<<"000";
- else
- if(r[i]<100)
- cout<<"00";
- else
- if(r[i]<1000)
- cout<<"0";
- cout<
- }
- cout<
- }
- int main() {
- clock_t start, finish;
- double duration;
- printf( "Time start...n ") ;
- start = clock();
- pi_calc();
- finish = clock();
- duration = (double)(finish - start) / CLOCKS_PER_SEC;
- printf( "Escaping %f secondsn", duration );
- return 0;
- }
复制代码
再在上面Makefile基础上修改一下,写一个c++程序的编译脚本,如下:
- target =pi
- src =pi_bbp.cpp
- objs =$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(src)))
- .phony: all
- all:$(objs) $(target)
- %.o:%.cpp
- $(CXX) -I . -c -o $@ [ DISCUZ_CODE_234 ]lt;
-
- $(target): $(objs)
- $(CXX) -o $(target) $(objs)
- scp:
- scp $(target) root@192.168.50.233:/userdata
- clean:
- @rm -rf *.o $(target) *.bak
复制代码
然后编译,上传,运行,结果如下:
板上运行:
从运行测试结果看,计算1000位圆周率只用了1.18秒,其运行速度是armv7的近5倍,性能非常强悍。
六、C++开发测试总结 EASY-EAI-Nano开发板的开发上手比较容易,不过因为虚机的开发环境比较老,而新的SDK版本比较多,每个版本的差异细节等没有介绍,只能在实践中去摸索。同时开发系统内编译工具存在多个版本,也会给编译造成异常。这个对于ARM Linux 嵌入式工作开发者来说有一定的困惑。建议开发方全面测试开发环境后,再对外释放,同时每次更新版本时,附上必要的说明,记录下更新的内容,避免使用者疑惑。 在阅读它的开发文档后,看出此开发板具有丰富的接口,还提供了非常多的开发文档资料,并且给出了很多AI的实际应用的例程,方便开发者快速的体验AI的功能。 该开发板载多媒体,QT开发方面也提供支持,不过开发环境中存在多个QT开发版本,使用的时候需要注意,不容用错版本,造成编译出错。
|