APP下载

基于ARM的高性能串口服务器的研究与实现

2012-11-30范永刚刘绍方崔兰清

计算机工程与设计 2012年4期
关键词:内核高性能串口

范永刚,刘绍方,董 晶,崔兰清

(1.华北计算技术研究所,北京100083;2.太极计算机股份有限公司,北京100083)

0 引 言

随着以以太网为基础的TCP/IP网络的广泛应用,网络已经成为了企业构建信息化系统的一种主导方式,但是目前广泛使用的传统设备如RFID读写器、调制解调器[1]等大多串口进行通信,并且大量新研制的工控设备一般首先提供串口与这些设备进行通信,业界提出了采用串口服务器将这些串口设备接入到以太网络。串口服务器能够提供一种将串口中的数据和以太网中传送的TCP/IP数据包之间进行转换的桥梁,使通过串口传输的数据能够通过以太网进行传送和共享,因此串口服务器成为了业界将串口设备接入到以太网的一种主要方式。

但是传统的串口服务器一般采用100M以太网接口,随着接入设备和请求传输数据量的增加,采用1000M以太网络接口已经成为了主要趋势,但串口的低速特性严重影响了以太网络接口的性能的提高,因此如何高效的利用串口服务器提供的高速网络接口进行数据的传输并提高串口服务器的通信效率成为了串口服务器中需要解决的一个主要问题[2]。

本文分析了影响串口服务器通信效率的原因,并指出了影响串口通信效率的因素在于内核态和用户态之间的数据拷贝,据此本文提出了通过修改内核网络协议栈在内核态将网络接受到的数据传送到串口,并修改内核中的串口驱动将串口收到的数据在内核态直接传送到网络协议栈,避免了大量数据在用户态和内核态之间的拷贝进而大大提高串口服务器的传输效率的解决方案。又分别介绍了高性能串口服务器的硬件和软件体系结构,并提出了高性能串口服务器的软件体系结构的设计思想和实现方案。论文依据系统性能理论研究中提出的性能技术指标对高性能串口服务器的性能进行了实验并对实验结果进行了分析,结果表明一定程度上提高了串口服务器的性能。

1 系统性能理论研究

1.1 网络性能研究

评价网络性能的主要技术指标包括数据传输率、吞吐率、网络利用率、传输延迟、响应时间、负载能力、扩展性和适应性、互连与兼容性、可靠性和可维护性等[2]。

在高性能串口服务器的实现过程中,网络采用1000Mbps以太网络作为串口服务器的网络连接接口,同时根据串口服务器的实际需求是使一个或多个工作站以最快的速度将网口接受到的数据发送到串口并将串口接收到的数据发送到网口,因此系统主要从网络利用率、响应时间和负载能力等3个方面对网络性能进行衡量。

1.1.1 网络利用率

网络利用率是指网络传输的有效信息量与网络能够传输的最大信息量之比,在高性能串口服务器设备中,高性能串口服务器采用1000Mbps以太网络作为串口服务器的网络连接接口,因此网络能够传输的最大信息量为1000Mbps,网络传输的有效信息量可以用发送数据密度即每秒发送数据的次数与每次发送数据中包含的数据帧数以及帧长度和帧中有效数据率来表示,则高性能串口服务器的网络利用率采用公式表示如下

1.1.2 响应时间

响应时间是指从工作站发出一个命令到命令得到应答的时间间隔,在高性能串口服务器设备中,响应时间是指从网口发送命令数据包到串口服务器并由串口服务器将网络数据包转发到串口并从串口收到响应数据包并将响应数据包转发到网口的时间延迟,由于系统可以假设高性能串口服务器的响应时间与连接到串口的设备本身的处理能力无关,因此将连接到串口的设备的处理时间考虑到响应时间中不影响对高性能串口服务器本身性能的评估。因此论文中采用多次响应时间的算术平均值对高性能串口服务器的响应时间进行计算,计算公式如下

响应时间 = [(te1-ts1)+ … + (teN-tsN)]/N

1.1.3 负载能力

负载能力是指随着工作站的增加吞响应时间的变化量,在高性能串口服务器设备中,负载能力是指当连接到高性能串口服务器的工作站的数量增加时,工作站响应时间的变化率,若M>N则,则负载能力可以表示如下,在实际计算过程中可以逐渐增加M和N之间的步长得到不同的负载能力,并对负载能力进行算术平均从而能够更加准确的对高性能串口服务器的负载能力进行评估。

1.2 串口性能研究

1.2.1 UART硬件接口性能分析

串口传输数据[3]的性能通常采用波特率或比特率进行表示,波特率 (用S表示)是指数据信号对载波的调制速率,通常采用单位时间内载波调制状态的改变次数来表示,其单位为波特,比特率 (用I表示)是指每秒钟传送二进制的位数,通常作为衡量信息传输速率的标准,二者之间的关系表示为

比特率 = 波特率 * 单个调制状态对应的二进制位数

采用公式表示为:I=S*log2N,其中I表示比特率,S表示波特率,N表示单位载波负载的信息量,log2N以比特为单位。因此,为了从物理上提高串口的性能,应该从提高串口的波特率和单位载波负载的信息量等两个方面进行考虑。

串口波特率的计算公式如下:Br=fsys_clk/ [C1*(Brs+C2)],其中fsys_clk是系统时钟频率,C1是系统频率的分频,Brs是串口寄存器中设置的值,C2的值通常为1,因此串口的波特率仅与硬件和串口寄存器中设置的值相关[4]。单位载波负载的信息量与串口通信的调制方式相关,串口通信的调制方式通常包括相移键控 (Phase-Shift-Keying,PSK)、幅移键控 (Amplitude-Shift-Keying,ASK)、频移键控 (Frequency-Shift-Keying,FSK),其中PSK使用最为广泛,因此在串口调制方式固定的情况下,单位载波负载的信息量也随之确定。综上所述采用修改硬件的手段提高串口通信性能的方式存在较大的局限性。

1.2.2 嵌入式Linux中串口操作性能分析

嵌入式Linux操作系统中进行串口通信的方式包括以下几个步骤:打开串口,设置串口属性,以文件方式对串口进行读写,关闭串口[5]。

嵌入式Linux操作系统中的打开串口操作通过采用系统提供的系统调用open函数进行。Linux下的串口文件位于/dev设备目录中,其中串口文件分别采用ttyS0,ttyS1等文件名表示,因此通过标准的系统调用open即能够完成对串口的打开操作,涉及的系统开销主要包括,将设备文件名和设备操作类型从用户态拷贝到内核态,采用中断方式完成操作,并将内核态的文件描述符返回到用户态,整个打开操作的系统开销表示如下:Topen=Tu2k1+Tsyscall1+Tk2u1,其中Tu2k1表示从用户态将pathname拷贝到系统态引起的开销,Tsyscall1表示系统调用引起的开销,Tk2u1表示将设备描述符从系统态拷贝到用户态引起的开销[6]。

嵌入式Linux操作系统中在用户态维护串口属性的通用结构体为struct termios2,Linux2.6内核中在系统态中维护串口属性的结构体为struct ktermios,嵌入式Linux操作系统中对串口属性进行操作的函数接口为tcgetattr和tcsetattr[12]。

目前嵌入式Linux操作系统内核支持36种串口波特率最低为50bps,最高为4 000 000bps,串口波特率的设置采用cfsetispeed和cfsetospeed系统调用完成串口属性的设置。

因此配置串口属性操作引起的系统开销可以表示为

式中:Tu2k2——将struct termios结构体从用户态拷贝到系统态引起的开销,Tswitch2kern——从用户态切换到内核态引起的开销,Tswitch2usr——从内核态切换到用户态引起的开销,Tkfonfig——在内核态进行串口设置的开销。

串口的读写操作采用read系统调用和write系统调用进行。串口读操作的函数原型可以表示为ssize_t read(int fd,void*buf,size_t count),串口读操作引起的系统开销可以表示为Tread=Tsyscall2+Trecv+Tk2u3+Tswitch2usr,其中Tsyscall2表示引发read系统调用的开销,Trecv表示从串口接收数据的开销,Tk2u3表示从内核态拷贝数据到用户态的开销,Tswitch2usr表示从系统态切换到用户态的开销;串口写操作的函数原型可以表示为ssize_t write(int fd,const void*buf,size_t count),串口写操作引起的系统开销可以表示为Twrite=Tsyscall3+Tu2k4+Tsend+Tswitch2usr,其中Tsyscall3表示引发write系统调用的开销,Tu2k4表示将数据从用户态拷贝到内核态引起的开销,Tsend表示发送数据缓冲区中的数据引起的开销,Tswitch2usr表示从系统态切换到用户态的开销。

嵌入式Linux操作系统中的关闭串口采用系统调用close进行,close函数原型为int close(int fd),其中fd为open系统调用得到的文件描述符,因此系统开销可以表示为Tclose=Tsyscall4,其中Tsyscall4为close所引起的开销。

综上所述,一次完整的串口发送和串口接受数据的操作引起的系统开销如下

其中包括4次系统调用,3次从用户态到内核态的数据拷贝操作,2次送内核态到用户态的数据拷贝操作和4次内核态和用户态之间的上下文切换。在高性能串口服务器操作过程中打开串口操作、配置串口操作和关闭串口操作一般只进行一次,因此用户态和内核态之间的数据拷贝操作是串口读写操作中的主要时间开销,综上所述在高性能串口服务器中减少用户态和内核态之间的数据拷贝操作是提高串口服务器性能的主要途径。

1.3 系统性能研究

高性能串口服务器的一般连接模型如图1所示,串口处理设备通过串口连接到高性能串口服务器,串口服务器通过1000M以太网连接到交换机,不同的工作站连接到交换机并通过网络对高性能串口服务器进行访问[7]。

图1 高性能串口服务器网络模型

高性能串口服务器的性能主要是对工作站来说的,因此高性能串口服务器的性能主要表现为网络性能,但串口服务器对外表现的网络性能受到串口服务器本身处理能力的制约和串口服务器与串口处理设备之间数据传输效率的制约,因此系统的整体性能为:P=min(Pnic,Pcpu,Pttys),其中P表示系统的整体性能,Pnic表示网口的传输数据的性能,Pcpu表示高性能串口服务器的处理性能,Pttys表示串口传输数据的性能。

论文中实现的高性能串口服务器的硬件采用1000Mbps以太网口作为网络接口,采用ATMEL AT91RM9200QU作为高性能串口服务器处理器,处理器主频为260MHz,串口采用最高波特率支持为115 200bps的UART串口芯片,操作系统内核采用Linux 2.6.24,因此整个系统的性能瓶颈在于串口[8],有效的提高串口的通信效率是提高系统整体性能的有效途径,上一节中理论分析显示影响串口通信效率的关键因素在于大量的数据在内核态和用户态之间的拷贝,因此减少内核态和用户态之间的数据拷贝将提高串口的通信效率,从而克服系统的瓶颈并提高系统的整体性能[9]。

2 系统设计与实现

2.1 系统硬件体系结构设计

高性能串口服务器的硬件以ARM9200开发板为基础[10],开发板主处理器采用AT91RM9200ARM处理器,AT91RM9200ARM处理器内嵌ARM920T核心,带有全性能的MMU,ARM9200开发板由核心板和主控板组成,核心板包括AT91RM9200ARM处理器、64MSDRAM、4MNorFlash、32MNandFlash、1个10/100/1000MDAVICOM公司的DM9702超高速以太网络芯片、1个ST16C554串口芯片、RTC、1个JTAG接口和1个外部扩展总线,主控板上包括1个USB接口、1个SD卡接口、1路CAN总线接口、1个RS485、1个8×8的键盘、1个320×240的触摸屏LCD接口。高性能串口服务器硬件体系结构如图2所示。

图2 高性能串口服务器硬件体系结构

高性能串口服务器在实现中只使用了核心板,核心板上的64M的SDRAM用于系统运行过程中的内存,4M的NorFlash用于存放Bootloader和Linux Kernel代码,32M的NandFlash用于存放jffs2根文件系统,系统采用10/100/1000M高速以太网络芯片DM9702作为系统的网络接口,采用ST16C554串口芯片作为系统的串口芯片,该芯片与16C550串口芯片兼容,支持最高波特率达到115200bps。

2.2 系统软件体系结构设计

2.2.1 DM9702网卡芯片驱动与网络子系统体系结构

高性能串口服务器中的DM9702网卡芯片驱动针对系统采用的Linux 2.6.24内核编写,驱动在编写过程中与传统网络接口驱动程序相似,驱动模块初始化函数和清除函数代码分别如下:

清除函数为:

由于驱动在分配设备结构时调用的是alloc_etherdev函数,因此驱动采用了内核中提供的ether_setup函数完成了对DM9702以太网络接口设备驱动结构的大多数默认操作,Linux操作系统采用register_netdev函数完成以太网接口设备驱动的注册。

Linux内核中的网络子系统被设计成完全与协议无关的,但高性能串口服务器在实现过程中主要采用的是TCP/IP协议栈,因此论文主要研究了Linux网络子系统中的TCP/IP协议栈,Linux网络子系统TCP/IP协议栈体系结构如图3所示。

用户应用程序使用Linux提供的套接字接口进行网络传输,当进程A需要将数据传送到进程B时,应用程序创建所需要传输的数据,然后打开套接字接口并向接口中写入数据并处理需要传输的数据,套接字缓冲拥有数据的引用并通过各层将其向下传递,在每一层中都会执行如解析数据包头、添加修改数据包头、检查大小、路由操作、分片等,当套接字缓冲通过这些层向下传递时,其数据本身不会被复制到每个层,内核通过及时修改套接字缓冲的引用并传递到下一层来减少开销,最后内核通过调用驱动程序中的hard_start_xmit函数将数据发送到进程B的网络接口中,若数据包的目标物理地址与进程B所在主机的网卡的MAC地址吻合,数据包会被转到网卡的缓冲区中,然后内核将数据包拷贝到套接字缓冲并向CPU发送一个硬中断,最后CPU处理数据包并通过所有层向上传递直到其达到应用程序的端口[11]。

图3 Linux网络子系统TCP/IP协议栈体系结构

2.2.2 ST16C554串口芯片驱动与串口子系统体系结构

高性能串口服务器中的ST16C554串口芯片驱动主要针对系统采用的Linux 2.6.24内核编写,驱动在编写过程中与通用串口驱动程序相似,驱动模块初始化函数和清除函数代码分别如下:

对st16c554_port[i]串口的操作函数、地址映射类型、访问地址、中断类型、时钟和缓冲区大小等进行初始化:

清除函数为:

Linux内核采用uart_register_driver函数完成对串口设备驱动的注册。

Linux串口子系统采用层次式结构组织整个驱动程序,Linux串口子系统体系结构如图4所示。

图4 Linux内核串口子系统体系结构

Linux内核串口子系统分为三层,分别是tty核心层、tty线路规程层和tty驱动程序层,其中tty核心层对应的数据结构是struct uart_driver,tty线路规程层在内核中对应的数据结构是struct ktermios,tty驱动程序层对应的数据结构是struct tty_driver。

在通过串口发送数据的过程中[12],tty核心层从用户得到数据,并发送给tty线路规程层程序,然后传递给tty驱动程序层,并格式化数据,最后发送给硬件;在通过串口接收数据的过程中串口硬件设备将数据回溯到tty驱动程序层,进入tty线路规程驱动,然后流入到tty核心层,最后被用户获取。在串口通信过程中,tty驱动程序层也可以直接与tty核心层进行通信和数据传输,但大多数时候数据传输需要通过tty线路规程层驱动程序进行转换[13]。

2.3 高性能串口服务器软件体系结构与实现

高性能串口服务器主要在Linux内核中对Linux网络子系统和Linux串口子系统进行了修改[14],从而使得网络子系统中收到的数据不经过内核态到用户态的拷贝直接在内核态发送到串口子系统中,从而大大提高了高性能串口服务器的性能。高性能串口服务器软件体系结构如图5所示。

图5 高性能串口服务器软件体系结构

在系统实现过程中,对于网络子系统中,主要修改了TCP/IP协议栈中的传输层的代码使得传输的数据不用拷贝到接收缓冲区中就发送到串口子系统的内核缓冲区中;在串口子系统中,主要是修改了tty核心层,tty核心层在内核态直接接收网络子系统中的在内核态中的传输层数据包,并通过tty线路规程层和tty驱动程序将其发送到物理串口设备中,同时tty核心层将从物理串口设备中接收到的数据在内核态发送到网络子系统中的传输层,从而实现串口和网络间数据的高速传输[15]。

3 实验与结果分析

本文第1.3节指出高性能串口服务器的主要性能瓶颈在于网络数据和串口数据在内核态和用户态之间的数据拷贝操作,由高性能串口服务器的网络模型图可知,高性能串口服务器对用户可见的性能主要表现在网络性能上,因此根据第1.1节中提出的3个网络性能指标分别对系统实现的高性能串口服务器的网络利用率、响应时间和负载能力等进行测试。

在系统测试过程中,系统采用1.3节中提出的网络模型,通过4台PC和H3CS5100系列交换机与高性能串口服务器进行连接,并将高性能串口服务器的串口和900MHz的RFID读写器进行了连接。测试过程中保持串口的连接属性为波特率115 200bps、8位数据位、1位停止位、无奇偶校验和无流控。

3.1 网络利用率

在网络利用率的测试过程中,系统通过采用1.3节中提出的网络模型,在其中一台PC上对和高性能串口服务器相连的接口的流量进行监控,将监控得到的流量数据文件进行保存,然后采用1.1.1节中提出的网络利用率计算方法对高性能串口服务器的网络利用率进行测试,测试实验结果如图6所示。

图6 内核修改前后网络利用率的对比

实验结果表明利用修改后的内核能够比修改前的内核的网络利用率方面提高约5%左右,因此在一定程度上提高了网络的利用率。

3.2 响应时间

在对高性能串口服务器的响应时间的测试过程中,系统通过多台PC客户端不断的连接高性能串口服务器并通过串口服务器发送数据包和接收数据包,并记录每次发送数据包和接收数据包的延时并保存到一个数据文件,测试实验结果如图7所示。

实验结果表明高性能串口服务器在修改内核后比修改内核前的发送数据和接收数据的响应时间缩短了约0.4ms,因此在一定程度上提高了通过串口服务器进行数据通信的效率。

3.3 负载能力

在测试高性能串口服务器的负载过程中,采用不断增加客户端从而达到增加通过高性能串口服务器的网络流量从而使得网络出现响应时间超过3s的方法对高性能串口服务器的负载能力进行测试,测试的实验结果如图8所示。

实验结果表明串口服务器修改后的内核比修改前的内核在网络负载上提高了约4.5MB,因此达到了提高串口服务器网络负载的目标,并在一定程度上提高了串口服务器的性能。

4 结束语

本文对网络和串口的性能进行了研究,并分析了影响串口服务器性能的因素,即串口通信,而影响串口通信效率的因素为内核态和用户态之间的频繁数据拷贝。通过修改内核中的串口驱动将数据直接传送到网络协议栈,提高了数据的传输效率,并给出了系统的硬件和软件体系结构,详细地介绍了系统的实现方案。最后对改进的串口服务器进行实验,结果表明,改进的系统提高了网络的利用率和负载能力,并减少了网络响应时间,提高了高性能串口服务器的性能。

[1]Joseph Yiu.The definitive guide to the ARM Corter-M3 [M].SONG Yan,transl.Beijing:Beihang University Press,2009:30-98 (in Chinese).[Joseph Yiu.ARM Cortex-M3权威指南 [M].宋岩,译.北京:北京航空航天大学出版社,2009:30-98.]

[2]YANG Shuiqing,ZHANG Jian,SHI Yunfei.Embedded Linux system development for ARM [M].Beijing:Publishing Houser of Electronics Industry,2008:245-323(in Chinese). [杨水清,张剑,施云飞.ARM嵌入式Linux系统开发技术详解[M].北京:电子工业出版社,2008:245-323.]

[3]YAN Liming,HU Likun,WANG Qingchao.Temporal analysis for master node of UART-based Mster/SLAVE communication [J].Electrical Measurement &Instrumentation,2006,43 (7):51-54(in Chinese). [严利明,胡立坤,王庆超.基于UART的主从通信方式的主节点时序分析 [J].电测与仪表,2006,43 (7):51-54.]

[4]HU Likun.UART-based reliable communication and performance analysis[J].Computer Engineering,2006,32 (10):15-17 (in Chinese).[胡立坤,王庆超.基于UART的可靠通信与性能分析 [J].计算机工程,2006,32 (10):15-17.]

[5]Michael R Sweet.Serial programming guide for POSIX operating systems [EB/OL].http://www.easysw.com/~mike/serial/serial.html,2011.

[6]HUANG Fengqi,WANG Yingchun.Design of embedded communication and control system platform based on ARM9+Linux [J].Measurement & Control Technology,2008,27 (9):36-38 (in Chinese).[黄风奇,王迎春.基于ARM9+Linux的嵌入式通信检测平台的设计 [J].测控技术,2008,27 (9):36-38.]

[7]ZOU Yingting,LI Shaorong.Transplant of the Linux system on ARM9 [J].Computer Applications,2009,28 (6):43-45(in Chinese).[邹颖婷,李绍荣.ARM9上的嵌入式Linux系统移植 [J].计算机应用,2009,28 (6):43-45.]

[8]ZU Dan,REN Changming.The initialization designing of the embedded system based on the ARM946E-S [J].Microprocessors,2009,30 (3):95-97 (in Chinese). [祖丹,任长明.基于ARM946E-S的嵌入式系统初始化设计 [J].微处理机,2009,30 (3):95-97.]

[9]YAO Hongxin,HUANG Bing.Study of IRQ interrupt programming mechanism based on ARM9 [J].Computer Engineering and Desing,2009,30 (12):2848-2851 (in Chinese).[姚宏昕,黄冰.基于ARM9内核的IRQ异常中断编程机制的研究 [J].计算机工程与设计,2009,30 (12):2848-2851.]

[10]LIAN Jia.The research on technology of processor management SDSM operating system based on ARM [D].Beijing:Beijing Jiaotong University,2008:25-38 (in Chinese). [连嘉.基于ARM的SDSM操作系统处理机管理技术研究 [D].北京:北京交通大学,2008:25-38.]

[11]Eduardo Ciliendo,Takechika Kunimasa.Linux performance and tuning guidelines [EB/OL].http://www.redbooks.ibm.com/abstracts/redp4285.html,2011.

[12]Jonahan Corbet.Linux device drivers[M].WEI Yongming,GENG Yue,transl.Beijing:China Electric Power Press,2006 (in Chinese).[Jonahan Corbet.LINUX设备驱动程序[M].魏永明,耿岳,译.北京:中国电力出版社,2006.]

[13]Philipp K Janert.Gnuplot in action:understanding data with graphs[M].America:Manning Publications,2009:43-153.

[14]LI Junqiang,LI Dongsheng,LI Yilei.A design to implement UART interface of communication based on FPGA [J].Microprocessors,2009,30 (6):20-23(in Chinese).[李军强,李东生,李鸾磊.基于FPGA的UART通信接口设计与实现[J].微处理机,2009,30 (6):20-23.]

[15]JIANG Yanhong.Design and application of UART based on FPGA [J].Computer Engineering,2008,34 (21):225-229(in Chinese).[蒋艳红.基于FPGA的UART设计与应用 [J].计算机工程,2008,34 (21):225-229.]

猜你喜欢

内核高性能串口
强化『高新』内核 打造农业『硅谷』
浅谈AB PLC串口跟RFID传感器的通讯应用
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
一款高性能BGO探测器的研发
高性能砼在桥梁中的应用
微生物内核 生态型农资
USB接口的多串口数据并行接收方法探索
基于蓝牙串口适配器的GPS接收机与AutoCAD的实时无线通信
SATA推出全新高性能喷枪SATAjet 5000 B