EASY EAI灵眸科技
直播中

ALSET

4年用户 286经验值
擅长:可编程逻辑,电源/新能源,嵌入式技术,处理器/DSP
私信 关注
[经验]

【EASY EAI Nano开源套件试用体验】2.C_C++开发环境搭建

【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,为了充分的了解这些功能,就需要使用这些开发工具开发应用,才能更好的体验到该开发板的特性。
111.png

一、下载技术文档

       开发板所有资源在百度云盘上,首先下载工具和开发环境
https://pan.baidu.com/s/1AjOIu77mzFM4cDA0MMVr2A#list/path=%2F
提取资料码: 5ttf
2.png
开发环境下几个文件都要下载
3.png
其中工具和源码和例程是对开发需要的,可以把他们下载下来。还有一些AI算法的例程和算法模型也有,这些算法模型在后面的AI测试开发中会使用到,也下载下来。
4.png
开发中所有文档内容都在
https://www.easy-eai.com/document_details/3/138这个网址下。
5.png
在线文档对应了EasyEAI nano开发板相应的软硬件资料,包括开发板刷机,入门指南,开发工具使用,开发实例非常丰富。同时该开发板支持基于QT的图形界面的开发。
二、开发主机环境准备
    开发板文档里使用Ubuntu做为开发主机上的操作系统,提供一个在线的VMware的导出镜像包,可以直接下载下来导入本地的VMware里直接使用,非常方便。
首先在资料库的百度云盘里把虚拟机文件夹里所有文件下载下来,建议下班后使用百度客户端下载,这样第二天早上就可以看到下载的东西了J
6.png
把几个文件下载到本地后,找一个空间大的硬盘空间,准备导入到VMware里。
启动vmware,然后点文件选择打开:
7.png
找到 EASY-EAI-Develop.ovf文件,点确定。
8.png
然后会提示自动导入到VMware里,在提示导入的虚拟机文件保存位置时要注意,默认是C盘,而虚拟机文件又很大,展开后有 40G 之巨,因此很容易造成windows C 盘空间爆满,因此这里选择一个空间大的盘位置来放置虚机文件。,
9.png
导入成功后,点中该虚拟机,选择属性进行必要的配置,再在设置里根据电脑的性能,为只分配好虚拟CPU数与内存数,这里设置4核,4GB:
10.png
配置网络连接为网桥模式,为了和网络里其它主机在同一个网段,方便后面的网络应用测试。
11.png
再打开共享文件,把windows下的EASY-EAI工作目录设置为Ubuntu共享文件夹,作为windows与Ubuntu系统文件交换的空间。
12.png
做完以上设置后,即完成了虚机的开发基本环境的准备工作。
三、安装开发工具包
     配置完Vmware后,启动虚机就可以进入虚机的Ubuntu环境,通过ssh连接到虚机的命令行环境,可以看到开发虚机里的系统。
13.png
再把Easy-EAI开发环境设置脚本 develop_environment.sh 放到home目录下,修改一下该脚本内容如下:
14.png
查看环境的 path目录设置如下:
15.png
经过后续的实际使用,发现该集成开发环境中的SDK缺少rkMedia库,因此许多例程无法编译通过。因此需要重新安装以下新的开发SDK,SDK文件单独放在这个目录下,因此找一个时间最新的版本下载下来,我下载的是:rv1126_rv1109_compiler_20221025_142156.tar.gz 压缩包。
16.png
下载完后,copy到虚拟机的opt目录下,即和原来SDK放在同一个位置,这样许多脚本都不需要修改就可以使用最新的SDK了。
为了避免新版的SDK缺少老板的库,这里把系统内带的老版的SDK目录改名为 rv1126_rv1109_sdk.1/,则新版解压后,同样改名为 rv1126_rv1109_sdk.2,再建立一个软链接,指向.2版本,这样就可以使用新版的SDK了,如果一些例程只能在老版SDK下编译,同样只要改一下这个链接指向即可,这样很方便。
17.png
在使用中发现虚拟机内容的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
18.png
至此开发编译工具安装完成。

四、开发环境检查
     安装好了开发板的编译开发环境后,可以先进行一下检查,根据,看一下交叉编译的工具的版本信息:
首先执行切换进入交叉环境:
sourceeasy-eai-dev.sh  
19.png
然后查看一下环境中的 $CC 编译器名,以及SDK头文件目录,库目录等信息,如下:
20.png
交叉编译环境变量:
21.png
C编译器版本:
22.png
C++ 编译器版本
23.png
五、开发测试程序
      同样搭建好了开发环境以后,就可以做先一个简单的c和c++程序的测试程序。
写一个hello测试程序:
  1. #include

  2. int main()
  3. {
  4.         printf("n");
  5.         printf("Hello, EASY-EAI-NANO devkit!");
  6.         printf("n");
  7.         return 0;
  8. }
再写一个Makefile
  1. target=hello

  2. all: main.o
  3.         ${CC} -o $(target) $^ -L/mnt/hgfs/EASY-EAI-NANO/proj/rkmedia-sdk/rkmedia-master/build/src

  4. main.o:
  5.         ${CC} -O3 -I . -c main.c -I/mnt/hgfs/EASY-EAI-NANO/proj/rkmedia-sdk/rkmedia-master/include
  6.        
  7. scp:
  8.         scp $(target) root@192.168.50.233:/userdata
  9.        
  10. clean:
  11.         rm -rf *.o *.bak $(target)

然后编译,上传,运行,结果如下图:
24.png
板上运行得到正确的结果:
25.png
再写一个C++代码,找使用 bbp 算法计算1000位圆周率的代码,如下:
  1. #include
  2. #include
  3. #include
  4. #include <time.h>

  5. using namespace std;

  6. double bbp(int n,int k,int l)
  7. {
  8. int i;
  9. long b=1;
  10. double c=1;
  11. if(n>k)
  12. {
  13.   for(i=n-k;i!=0;i--)
  14.    b=(b*16+0)%(8*k+l);
  15.   return(((double)b)/((double)(8*k+l)));
  16. }
  17. else
  18.   if(n==k)
  19.    return(((double)1)/((double)(8*k+l)));
  20.   else
  21.   {
  22.    for(i=0;i<(k-n);i++)
  23.     c=c/16;
  24.    return(c/(8*k+l));
  25.   }
  26. };

  27. void pi(int m,int n,int p[])
  28. {
  29. double a=0;
  30. int k=0;
  31. while(k<(n+8))
  32. {
  33.   a+=4+4*bbp(n,k,1)-2*bbp(n,k,4)-bbp(n,k,5)-bbp(n,k,6);
  34.   a=a-(int)a;
  35.   k++;
  36. }
  37. for(k=0;k
  38. {
  39.   a*=16;
  40.   p[k]=(int)a;
  41.   a=a-(int)a;
  42. }
  43. }
  44. void div(int p[])
  45. {
  46. int i,j=0;
  47. for(i=0;i<300;i++)
  48. {
  49.   p[i]=j*10000+p[i];
  50.   j=p[i]%2;
  51.   p[i]=p[i]/2;
  52. }
  53. }

  54. void add(int a[],int b[])
  55. {
  56. int i,j=0;
  57. for(i=299;i>=0;i--)
  58. {
  59.   a[i]=a[i]+b[i]+j;
  60.   if(a[i]>=10000)
  61.   {
  62.    a[i]-=10000;
  63.    j=1;
  64.   }
  65.   else
  66.    j=0;
  67. }
  68. }

  69. void pi_calc()
  70. {
  71. int i,j,p[1100]={0},r[300]={0};
  72. short q[4000];

  73. for(i=0;i<125;i++)
  74.    pi(8,i*8,p+i*8);
  75.    
  76. for(i=0;i<1000;i++)
  77. {
  78.   j=p[i];
  79.   q[i*4+3]=j%2;
  80.   j=j/2;
  81.   q[i*4+2]=j%2;
  82.   j=j/2;
  83.   q[i*4+1]=j%2;
  84.   j=j/2;
  85.   q[i*4+0]=j%2;
  86.   p[i]=0;
  87. }
  88. p[0]=10000;
  89. for(i=0;i<4000;i++)
  90. {
  91.    div(p);
  92.    if(q[i])
  93.            add(r,p);
  94. }
  95. //cout<<3<<" ";
  96. printf("3.");
  97. for(i=0;i<250;i++)
  98.    printf("%04d", r[i]);
  99.    
  100. for(i=0;i<0;i++)
  101. {
  102.   if(r[i]<10)
  103.    cout<<"000";
  104.   else
  105.    if(r[i]<100)
  106.     cout<<"00";
  107.    else
  108.     if(r[i]<1000)
  109.      cout<<"0";
  110.   cout<
  111. }
  112. cout<
  113. }

  114. int main() {
  115.         clock_t start, finish;
  116.         double duration;
  117.         printf( "Time start...n ") ;
  118.   start = clock();
  119.         pi_calc();
  120.         finish = clock();
  121.   duration = (double)(finish - start) / CLOCKS_PER_SEC;
  122.   printf( "Escaping %f secondsn", duration );
  123.         return 0;
  124. }
再在上面Makefile基础上修改一下,写一个c++程序的编译脚本,如下:
  1. target =pi
  2. src    =pi_bbp.cpp
  3. objs   =$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(src)))

  4. .phony: all

  5. all:$(objs) $(target)

  6. %.o:%.cpp
  7.         $(CXX) -I . -c -o $@ [        DISCUZ_CODE_234        ]lt;
  8.        
  9. $(target): $(objs)
  10.         $(CXX) -o $(target) $(objs)

  11. scp:
  12.         scp $(target) root@192.168.50.233:/userdata

  13. clean:
  14.         @rm -rf *.o $(target) *.bak
然后编译,上传,运行,结果如下:
26.png
板上运行:
27.png
从运行测试结果看,计算1000位圆周率只用了1.18秒,其运行速度是armv7的近5倍,性能非常强悍。

六、C++开发测试总结
      
        EASY-EAI-Nano开发板的开发上手比较容易,不过因为虚机的开发环境比较老,而新的SDK版本比较多,每个版本的差异细节等没有介绍,只能在实践中去摸索。同时开发系统内编译工具存在多个版本,也会给编译造成异常。这个对于ARM Linux 嵌入式工作开发者来说有一定的困惑。建议开发方全面测试开发环境后,再对外释放,同时每次更新版本时,附上必要的说明,记录下更新的内容,避免使用者疑惑。
       在阅读它的开发文档后,看出此开发板具有丰富的接口,还提供了非常多的开发文档资料,并且给出了很多AI的实际应用的例程,方便开发者快速的体验AI的功能。
      该开发板载多媒体,QT开发方面也提供支持,不过开发环境中存在多个QT开发版本,使用的时候需要注意,不容用错版本,造成编译出错。

更多回帖

发帖
×
20
完善资料,
赚取积分