Petalinux的网络数据传输性能测试

摘要: 介绍一种针对MicroBlaze软核处理器特别开发的嵌入式操作系统Petalinux,成功地实现了其在ML507开发板上的移植,并且通过LabVIEW软件在该系统上实现了基于TCP/IP协议的网络数据收发。同时,测试了该嵌入式系统的网络数据传输性能。

引言
  嵌入式系统是指以应用为中心,以计算机技术为基础,软件硬件可裁减,能够适应应用系统,并对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。主要由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户应用软件等部分组成[1]。Petalinux是由PetaLogix公司专门为在Xilinx FPGA的MicroBlaze软核处理器上运行而开发的嵌入式Linux。Petalinux的发布版本中包含定制的Linux2.4/2.6内核原码、Uboot内核编码、相关的开发工具,以及开发板参考硬件平台配置,极大地方便了开发人员的使用,缩短了产品的开发周期。

  针对如何在嵌入式系统上实现远程数据传输的问题,本文给出了一种基于Xilinx ML507开发板的嵌入式网络数据传输系统的设计与实现方案。通过LabVIEW编程软件编写客户端,成功实现了开发板与PC机的实时网络数据传输,同时测试了Petalinux操作系统的网络数据传输性能。

1 系统平台的搭建
1.1 开发板的选取与硬件平台的设计

  本设计方案采用Xilinx EDK 10.1在ML507开发板搭建一个简化的硬件平台,平台结构如图1所示。

  各部件在FPGA内部以IP核的形式构建,并通过SPLB总线、XCL(Xilinx缓存链路)总线相互连接。系统以带有32位MicroBlaze软核处理器为控制中心,CF卡用于存放文件系统和应用程序配置文件;中断控制器用来实现中断控制;串口模块可在调试时输出系统的运行信息;三态以太网媒体访问控制器用来实现以太网功能;双倍速率同步动态随机存储器通过XCL总线与MicroBlaze处理器相连,用于对片外存储器进行访问[2]。

图1 硬件平台结构框图

图1 硬件平台结构框图

1.2 软件平台的配置
  在移植Petalinux之前,必须配置BSP(Board Support Package)。所谓BSP,就是为给定的板子提供特定操作系统支持的代码,是介于主板硬件和操作系统之间的一层,应该说是属于操作系统的一部分。主要目的是为了支持操作系统,使之能够更好地在硬件主板运行。

  Xilinx EDK已经包括相应的BSP产生器,因此按下面步骤配置软件平台:
① 把解压的Petalinux文件夹下~/hardware/edk_user_repository/PetaLogix/bsp/petalinux_v1_00_b文件夹拷贝到EDK文件夹下的“~\\sw\\lib\\bsp”目录下。

② 打开已建立的硬件工程,点击Software菜单,启动Software Platform Setting。对Software Platform窗口进行配置,点击Software Platform,在OS&Library settings子窗口中,打开OS的下拉菜单,选择Petalinux,版本只有1.00.b。如果第一步没有完成,那么再打开OS的下拉菜单后,将没有Petalinux选项,其余选项保持默认。

③ 选中OS and Library可配置选项,这里主要是针对开发板对uclinux的BSP进行配置,包括Flash与Memory,以及输入/输出调试端口的配置。在这里,主要对以下参数进行修改:
  Lmb memory:dlmb_crtlr
  Main memory:DDR_SDRAM
  Stdin:RS232_Uart
  Stdout:RS232_Uart

  最后,点击OK,退出。基于Petalinux的MicroBlaze软件平台配置完成。

  软件平台配置完后就要根据相应配置生成针对MicroBlaze处理器的BSP和库,使Petalinux与开发板的信息交互成为可能。进入EDK的Software菜单,点击Generate BSP and Libraries,系统会自动生成板级支持包和库。之后就可以在~/microblaze_0/ libsrc/ petalinux_v1_00_b文件夹下生成autoconfig.in文件[3]。

1.3 Petalinux操作系统的移植
  软件平台配置完成后需要对内核进行裁减,嵌入式系统开发一般采用交叉编译的方法,通过PC机上的虚拟机对内核和应用程序进行编译,具体步骤如下[4]:
① 拷贝工程文件夹到Petalinux系统目录;
② 设置Petalinux环境变量;
③ 在内核中新建用户平台;
④ 构建内核Makefile文件;
⑤ 对内核进行配置与编译;
⑥ xmd下载image文件启动系统。

  搭建的底层硬件平台的不同决定了系统内核配置的区别,参考文献[2]中针对ML402开发板中的不同情况给出了较为详细的移植过程,可作为参考,在此不再展开叙述。

  使用EDK提供的调试工具xmd下载image文件,启动Petalinux后,通过串口超级终端可以看到系统启动过程。

2 TCP/IP服务器端程序的创建
  Petalinux移植成功后,紧接着开发所需的服务器程序。在虚拟机终端下进入petalinuxdist文件夹目录,输入命令petalinuxnewapp speedtest。其中,speedtest为服务器端程序名。创建成功后,在~/petalinux/software/userapps文件夹下新建了以程序speedtest为名的文件夹,里面包括.C的应用程序、Makefile的编译规则和readme的帮助文件。接下来进入speedtest文件夹目录,输入命令gedit speedtest.c,打开文本编辑器,对.C的应用程序进行编辑。

  TCP/IP协议是目前最通用的网络协议,因此,本程序也使用该协议实现网络的互联。在Linux系统中,通过提供Socket接口进行网络编程。Socket接口是TCP/IP网络的API,其定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。

  常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式Socket是一种面向连接的Socket,针对于面向连接的、无差错的、发送先后顺序一致的、包长度不限和非重复的TCP服务应用;数据报式Socket是一种无连接的Socket,主要是以独立的数据报进行网络传输,数据报的最大长度为32 KB,传输不保证顺序性、可靠性和无重复性,它通常用于单个报文传输或可靠性不重要的场合。根据以上特点,本应用选择流式Socket。

  本文设计的网络服务器,主要用于接收客户端传送的指令,然后发送数组给客户端,具体流程如图2所示。

图2 服务器端通信流程

图2 服务器端通信流程

服务器端speedtest.c主要代码如下[5]:
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){ //创建套接字Socket函数可以调用Socket函数,该函数返回一//个类似于文件描述符的句柄
  fprintf(stderr,"socket error!\\n");
  exit(1);
}
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1){ //Bind函数将Socket与本机上的一个端//口相关联,在该端口监听服务请求
  fprintf(stderr,"bind error!\\n");
  exit(1);
}
if(listen(sockfd,10)==-1){// listen函数将一个套接字转换为被动倾听套接字
  fprintf(stderr,"listen error!\\n");
  exit(1);
}
if((connfd=accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==-1){//Accept函数从倾听套接字的完成连接队列中接收客户端连接请求
  fprintf(stderr,"accept error!\\n");
  exit(1);
}
printf("server:got connection from %s\\n",inet_ntoa(their_addr.sin_addr));
printf ("successfully connect.\\r\\n");//显示连接成功,开始接收客户端请求
if ((recfd=recv(connfd,buffer,recbufsize,0))==-1){// recv函数用来控制对套接字的读操作;
  recfd=recv(connfd,buffer,recbufsize,0);
}
printf("\\n收到字符串%d\\n");
for (i=1;i<=N;i++) a[i]=i;
b=sizeof(a);
if(send(connfd,a,b,0)==-1){//控制对套接字的写操作,发送1到4 999数组
  fprintf(stderr,"send error!\\n");
  exit(1);
  printf("%d",b);
}
while(1){//方便测试网络传输速度
  send(connfd,a,b,0);
}
printf ("send successfully\\r\\n");
close(sockfd); //关闭一个套接字描述符

图3 TCP/IP客户端LabVIEW仿真图

图3 TCP/IP客户端LabVIEW仿真图

启动服务器在程序编写好后重新编译,生成image.bin文件,下载该文件。

打开超级终端看到系统启动后,输入用户名与密码,进入Petalinux系统执行下列命令:
  ls /bin
  speedtest
  可以看到服务器端启动语句输出:
  SOCKET: Creating socket..done.
  SOCKET: start bind socket..done.
  SOCKET: start listen..done.
  说明服务器已经处于监听状态,等待客户端的连接请求。

3 TCP/IP客户端程序的创建
  服务器端编写完毕后,通过LabVIEW编程软件编写PC机客户端,仿真图如图3所示。

  设置服务器IP地址:192.168.0.10,端口:8000。点击运行按钮,可以看到当PC机客户端向开发板上服务器端发出连接请求时,服务器端通过串口输出:
SOCKET:start accept..server:got connection from 192.168.0.1
Successfully connect

  随即服务器向PC机客户端发送0~4 999个数组,在PC机上通过LabVIEW软件开发可视化图形界面,查看数据传输内容,以及数据传输过程中的丢包情况,界面如图4所示。

  图4中输出数据转化为波形图后显示为一条上升的直线,中间无跳变点,说明数据无丢失。同样,也可以通过右侧的data数据框看到每一个输出的数值,观察结果同样显示数据发送完整。

图4 服务器端与客户端连通后客户端输出界面

图4 服务器端与客户端连通后客户端输出界面

为了测试系统的数据传输速度,服务器端程序通过添加循环语句使其能够持续地发送数组,并通过多特Netpersec网速测试软件来测试系统的网络传输速度,界面如图5所示。

  可以看出使用Petalinux操作系统时,本系统的网络传输速率平均为20.9 Mb/s。至此完成了客户端与服务器端网络数据的传输,并测试了Petalinux的传输速度,结果表明Petalinux操作系统能够满足一般的数据传输需要,后续就可以接入外围设备对系统进行进一步的开发与完善了。
结语
  本文简单介绍了Petalinux系统的开发与移植过程,以及TCP/IP客户端与服务器端通信程序的创建过程,实现了PC机与Petalinux操作系统的实时数据传输,同时测试了系统的传输性能。实验证明Petalinux的稳定性和实时性较好,为接下来在该系统上进行网络应用程序开发打下了基础。

图5 PetaLinux操作系统网络数据传输速度

图5 PetaLinux操作系统网络数据传输速度

参考文献
[1] 华清远见嵌入式培训中心.嵌入式Linux C编程入门[M].北京:人民邮电出版社,2009.
[2] 薛慧敏,武传华,路后兵,等. MicroBlaze处理器的Petalinux操作系统移植[J].单片机与嵌入式系统应用,2011(4):6769.
[3] 薛小刚,葛毅敏.Xilinx ISE9.x FPGA/CPLD设计指南[M].北京:人民邮电出版社,2007.
[4] John Williams.2010 Xilinx Professor Workshop—Embedded Linux on Xilinx MicroBlaze,2010.
[5] 李俊.嵌入式Linux设备驱动开发详解[M].北京:人民邮电出版社,2008.
杨谢(硕士研究生)、路后兵(讲师),主要研究方向为嵌入式系统开发;武传华(教授)、钱怡(讲师),主要研究方向为软件无线电技术应用。

作者:杨谢,武传华,路后兵,钱怡 合肥电子工程学院,合肥