范永剛,劉紹方,董 晶,崔蘭清
(1.華北計算技術(shù)研究所,北京100083;2.太極計算機股份有限公司,北京100083)
隨著以以太網(wǎng)為基礎(chǔ)的TCP/IP網(wǎng)絡(luò)的廣泛應(yīng)用,網(wǎng)絡(luò)已經(jīng)成為了企業(yè)構(gòu)建信息化系統(tǒng)的一種主導(dǎo)方式,但是目前廣泛使用的傳統(tǒng)設(shè)備如RFID讀寫器、調(diào)制解調(diào)器[1]等大多串口進行通信,并且大量新研制的工控設(shè)備一般首先提供串口與這些設(shè)備進行通信,業(yè)界提出了采用串口服務(wù)器將這些串口設(shè)備接入到以太網(wǎng)絡(luò)。串口服務(wù)器能夠提供一種將串口中的數(shù)據(jù)和以太網(wǎng)中傳送的TCP/IP數(shù)據(jù)包之間進行轉(zhuǎn)換的橋梁,使通過串口傳輸?shù)臄?shù)據(jù)能夠通過以太網(wǎng)進行傳送和共享,因此串口服務(wù)器成為了業(yè)界將串口設(shè)備接入到以太網(wǎng)的一種主要方式。
但是傳統(tǒng)的串口服務(wù)器一般采用100M以太網(wǎng)接口,隨著接入設(shè)備和請求傳輸數(shù)據(jù)量的增加,采用1000M以太網(wǎng)絡(luò)接口已經(jīng)成為了主要趨勢,但串口的低速特性嚴重影響了以太網(wǎng)絡(luò)接口的性能的提高,因此如何高效的利用串口服務(wù)器提供的高速網(wǎng)絡(luò)接口進行數(shù)據(jù)的傳輸并提高串口服務(wù)器的通信效率成為了串口服務(wù)器中需要解決的一個主要問題[2]。
本文分析了影響串口服務(wù)器通信效率的原因,并指出了影響串口通信效率的因素在于內(nèi)核態(tài)和用戶態(tài)之間的數(shù)據(jù)拷貝,據(jù)此本文提出了通過修改內(nèi)核網(wǎng)絡(luò)協(xié)議棧在內(nèi)核態(tài)將網(wǎng)絡(luò)接受到的數(shù)據(jù)傳送到串口,并修改內(nèi)核中的串口驅(qū)動將串口收到的數(shù)據(jù)在內(nèi)核態(tài)直接傳送到網(wǎng)絡(luò)協(xié)議棧,避免了大量數(shù)據(jù)在用戶態(tài)和內(nèi)核態(tài)之間的拷貝進而大大提高串口服務(wù)器的傳輸效率的解決方案。又分別介紹了高性能串口服務(wù)器的硬件和軟件體系結(jié)構(gòu),并提出了高性能串口服務(wù)器的軟件體系結(jié)構(gòu)的設(shè)計思想和實現(xiàn)方案。論文依據(jù)系統(tǒng)性能理論研究中提出的性能技術(shù)指標對高性能串口服務(wù)器的性能進行了實驗并對實驗結(jié)果進行了分析,結(jié)果表明一定程度上提高了串口服務(wù)器的性能。
評價網(wǎng)絡(luò)性能的主要技術(shù)指標包括數(shù)據(jù)傳輸率、吞吐率、網(wǎng)絡(luò)利用率、傳輸延遲、響應(yīng)時間、負載能力、擴展性和適應(yīng)性、互連與兼容性、可靠性和可維護性等[2]。
在高性能串口服務(wù)器的實現(xiàn)過程中,網(wǎng)絡(luò)采用1000Mbps以太網(wǎng)絡(luò)作為串口服務(wù)器的網(wǎng)絡(luò)連接接口,同時根據(jù)串口服務(wù)器的實際需求是使一個或多個工作站以最快的速度將網(wǎng)口接受到的數(shù)據(jù)發(fā)送到串口并將串口接收到的數(shù)據(jù)發(fā)送到網(wǎng)口,因此系統(tǒng)主要從網(wǎng)絡(luò)利用率、響應(yīng)時間和負載能力等3個方面對網(wǎng)絡(luò)性能進行衡量。
1.1.1 網(wǎng)絡(luò)利用率
網(wǎng)絡(luò)利用率是指網(wǎng)絡(luò)傳輸?shù)挠行畔⒘颗c網(wǎng)絡(luò)能夠傳輸?shù)淖畲笮畔⒘恐龋诟咝阅艽诜?wù)器設(shè)備中,高性能串口服務(wù)器采用1000Mbps以太網(wǎng)絡(luò)作為串口服務(wù)器的網(wǎng)絡(luò)連接接口,因此網(wǎng)絡(luò)能夠傳輸?shù)淖畲笮畔⒘繛?000Mbps,網(wǎng)絡(luò)傳輸?shù)挠行畔⒘靠梢杂冒l(fā)送數(shù)據(jù)密度即每秒發(fā)送數(shù)據(jù)的次數(shù)與每次發(fā)送數(shù)據(jù)中包含的數(shù)據(jù)幀數(shù)以及幀長度和幀中有效數(shù)據(jù)率來表示,則高性能串口服務(wù)器的網(wǎng)絡(luò)利用率采用公式表示如下
1.1.2 響應(yīng)時間
響應(yīng)時間是指從工作站發(fā)出一個命令到命令得到應(yīng)答的時間間隔,在高性能串口服務(wù)器設(shè)備中,響應(yīng)時間是指從網(wǎng)口發(fā)送命令數(shù)據(jù)包到串口服務(wù)器并由串口服務(wù)器將網(wǎng)絡(luò)數(shù)據(jù)包轉(zhuǎn)發(fā)到串口并從串口收到響應(yīng)數(shù)據(jù)包并將響應(yīng)數(shù)據(jù)包轉(zhuǎn)發(fā)到網(wǎng)口的時間延遲,由于系統(tǒng)可以假設(shè)高性能串口服務(wù)器的響應(yīng)時間與連接到串口的設(shè)備本身的處理能力無關(guān),因此將連接到串口的設(shè)備的處理時間考慮到響應(yīng)時間中不影響對高性能串口服務(wù)器本身性能的評估。因此論文中采用多次響應(yīng)時間的算術(shù)平均值對高性能串口服務(wù)器的響應(yīng)時間進行計算,計算公式如下
響應(yīng)時間 = [(te1-ts1)+ … + (teN-tsN)]/N
1.1.3 負載能力
負載能力是指隨著工作站的增加吞響應(yīng)時間的變化量,在高性能串口服務(wù)器設(shè)備中,負載能力是指當連接到高性能串口服務(wù)器的工作站的數(shù)量增加時,工作站響應(yīng)時間的變化率,若M>N則,則負載能力可以表示如下,在實際計算過程中可以逐漸增加M和N之間的步長得到不同的負載能力,并對負載能力進行算術(shù)平均從而能夠更加準確的對高性能串口服務(wù)器的負載能力進行評估。
1.2.1 UART硬件接口性能分析
串口傳輸數(shù)據(jù)[3]的性能通常采用波特率或比特率進行表示,波特率 (用S表示)是指數(shù)據(jù)信號對載波的調(diào)制速率,通常采用單位時間內(nèi)載波調(diào)制狀態(tài)的改變次數(shù)來表示,其單位為波特,比特率 (用I表示)是指每秒鐘傳送二進制的位數(shù),通常作為衡量信息傳輸速率的標準,二者之間的關(guān)系表示為
比特率 = 波特率 * 單個調(diào)制狀態(tài)對應(yīng)的二進制位數(shù)
采用公式表示為:I=S*log2N,其中I表示比特率,S表示波特率,N表示單位載波負載的信息量,log2N以比特為單位。因此,為了從物理上提高串口的性能,應(yīng)該從提高串口的波特率和單位載波負載的信息量等兩個方面進行考慮。
串口波特率的計算公式如下:Br=fsys_clk/ [C1*(Brs+C2)],其中fsys_clk是系統(tǒng)時鐘頻率,C1是系統(tǒng)頻率的分頻,Brs是串口寄存器中設(shè)置的值,C2的值通常為1,因此串口的波特率僅與硬件和串口寄存器中設(shè)置的值相關(guān)[4]。單位載波負載的信息量與串口通信的調(diào)制方式相關(guān),串口通信的調(diào)制方式通常包括相移鍵控 (Phase-Shift-Keying,PSK)、幅移鍵控 (Amplitude-Shift-Keying,ASK)、頻移鍵控 (Frequency-Shift-Keying,F(xiàn)SK),其中PSK使用最為廣泛,因此在串口調(diào)制方式固定的情況下,單位載波負載的信息量也隨之確定。綜上所述采用修改硬件的手段提高串口通信性能的方式存在較大的局限性。
1.2.2 嵌入式Linux中串口操作性能分析
嵌入式Linux操作系統(tǒng)中進行串口通信的方式包括以下幾個步驟:打開串口,設(shè)置串口屬性,以文件方式對串口進行讀寫,關(guān)閉串口[5]。
嵌入式Linux操作系統(tǒng)中的打開串口操作通過采用系統(tǒng)提供的系統(tǒng)調(diào)用open函數(shù)進行。Linux下的串口文件位于/dev設(shè)備目錄中,其中串口文件分別采用ttyS0,ttyS1等文件名表示,因此通過標準的系統(tǒng)調(diào)用open即能夠完成對串口的打開操作,涉及的系統(tǒng)開銷主要包括,將設(shè)備文件名和設(shè)備操作類型從用戶態(tài)拷貝到內(nèi)核態(tài),采用中斷方式完成操作,并將內(nèi)核態(tài)的文件描述符返回到用戶態(tài),整個打開操作的系統(tǒng)開銷表示如下:Topen=Tu2k1+Tsyscall1+Tk2u1,其中Tu2k1表示從用戶態(tài)將pathname拷貝到系統(tǒng)態(tài)引起的開銷,Tsyscall1表示系統(tǒng)調(diào)用引起的開銷,Tk2u1表示將設(shè)備描述符從系統(tǒng)態(tài)拷貝到用戶態(tài)引起的開銷[6]。
嵌入式Linux操作系統(tǒng)中在用戶態(tài)維護串口屬性的通用結(jié)構(gòu)體為struct termios2,Linux2.6內(nèi)核中在系統(tǒng)態(tài)中維護串口屬性的結(jié)構(gòu)體為struct ktermios,嵌入式Linux操作系統(tǒng)中對串口屬性進行操作的函數(shù)接口為tcgetattr和tcsetattr[12]。
目前嵌入式Linux操作系統(tǒng)內(nèi)核支持36種串口波特率最低為50bps,最高為4 000 000bps,串口波特率的設(shè)置采用cfsetispeed和cfsetospeed系統(tǒng)調(diào)用完成串口屬性的設(shè)置。
因此配置串口屬性操作引起的系統(tǒng)開銷可以表示為
式中:Tu2k2——將struct termios結(jié)構(gòu)體從用戶態(tài)拷貝到系統(tǒng)態(tài)引起的開銷,Tswitch2kern——從用戶態(tài)切換到內(nèi)核態(tài)引起的開銷,Tswitch2usr——從內(nèi)核態(tài)切換到用戶態(tài)引起的開銷,Tkfonfig——在內(nèi)核態(tài)進行串口設(shè)置的開銷。
串口的讀寫操作采用read系統(tǒng)調(diào)用和write系統(tǒng)調(diào)用進行。串口讀操作的函數(shù)原型可以表示為ssize_t read(int fd,void*buf,size_t count),串口讀操作引起的系統(tǒng)開銷可以表示為Tread=Tsyscall2+Trecv+Tk2u3+Tswitch2usr,其中Tsyscall2表示引發(fā)read系統(tǒng)調(diào)用的開銷,Trecv表示從串口接收數(shù)據(jù)的開銷,Tk2u3表示從內(nèi)核態(tài)拷貝數(shù)據(jù)到用戶態(tài)的開銷,Tswitch2usr表示從系統(tǒng)態(tài)切換到用戶態(tài)的開銷;串口寫操作的函數(shù)原型可以表示為ssize_t write(int fd,const void*buf,size_t count),串口寫操作引起的系統(tǒng)開銷可以表示為Twrite=Tsyscall3+Tu2k4+Tsend+Tswitch2usr,其中Tsyscall3表示引發(fā)write系統(tǒng)調(diào)用的開銷,Tu2k4表示將數(shù)據(jù)從用戶態(tài)拷貝到內(nèi)核態(tài)引起的開銷,Tsend表示發(fā)送數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)引起的開銷,Tswitch2usr表示從系統(tǒng)態(tài)切換到用戶態(tài)的開銷。
嵌入式Linux操作系統(tǒng)中的關(guān)閉串口采用系統(tǒng)調(diào)用close進行,close函數(shù)原型為int close(int fd),其中fd為open系統(tǒng)調(diào)用得到的文件描述符,因此系統(tǒng)開銷可以表示為Tclose=Tsyscall4,其中Tsyscall4為close所引起的開銷。
綜上所述,一次完整的串口發(fā)送和串口接受數(shù)據(jù)的操作引起的系統(tǒng)開銷如下
其中包括4次系統(tǒng)調(diào)用,3次從用戶態(tài)到內(nèi)核態(tài)的數(shù)據(jù)拷貝操作,2次送內(nèi)核態(tài)到用戶態(tài)的數(shù)據(jù)拷貝操作和4次內(nèi)核態(tài)和用戶態(tài)之間的上下文切換。在高性能串口服務(wù)器操作過程中打開串口操作、配置串口操作和關(guān)閉串口操作一般只進行一次,因此用戶態(tài)和內(nèi)核態(tài)之間的數(shù)據(jù)拷貝操作是串口讀寫操作中的主要時間開銷,綜上所述在高性能串口服務(wù)器中減少用戶態(tài)和內(nèi)核態(tài)之間的數(shù)據(jù)拷貝操作是提高串口服務(wù)器性能的主要途徑。
高性能串口服務(wù)器的一般連接模型如圖1所示,串口處理設(shè)備通過串口連接到高性能串口服務(wù)器,串口服務(wù)器通過1000M以太網(wǎng)連接到交換機,不同的工作站連接到交換機并通過網(wǎng)絡(luò)對高性能串口服務(wù)器進行訪問[7]。
圖1 高性能串口服務(wù)器網(wǎng)絡(luò)模型
高性能串口服務(wù)器的性能主要是對工作站來說的,因此高性能串口服務(wù)器的性能主要表現(xiàn)為網(wǎng)絡(luò)性能,但串口服務(wù)器對外表現(xiàn)的網(wǎng)絡(luò)性能受到串口服務(wù)器本身處理能力的制約和串口服務(wù)器與串口處理設(shè)備之間數(shù)據(jù)傳輸效率的制約,因此系統(tǒng)的整體性能為:P=min(Pnic,Pcpu,Pttys),其中P表示系統(tǒng)的整體性能,Pnic表示網(wǎng)口的傳輸數(shù)據(jù)的性能,Pcpu表示高性能串口服務(wù)器的處理性能,Pttys表示串口傳輸數(shù)據(jù)的性能。
論文中實現(xiàn)的高性能串口服務(wù)器的硬件采用1000Mbps以太網(wǎng)口作為網(wǎng)絡(luò)接口,采用ATMEL AT91RM9200QU作為高性能串口服務(wù)器處理器,處理器主頻為260MHz,串口采用最高波特率支持為115 200bps的UART串口芯片,操作系統(tǒng)內(nèi)核采用Linux 2.6.24,因此整個系統(tǒng)的性能瓶頸在于串口[8],有效的提高串口的通信效率是提高系統(tǒng)整體性能的有效途徑,上一節(jié)中理論分析顯示影響串口通信效率的關(guān)鍵因素在于大量的數(shù)據(jù)在內(nèi)核態(tài)和用戶態(tài)之間的拷貝,因此減少內(nèi)核態(tài)和用戶態(tài)之間的數(shù)據(jù)拷貝將提高串口的通信效率,從而克服系統(tǒng)的瓶頸并提高系統(tǒng)的整體性能[9]。
高性能串口服務(wù)器的硬件以ARM9200開發(fā)板為基礎(chǔ)[10],開發(fā)板主處理器采用AT91RM9200ARM處理器,AT91RM9200ARM處理器內(nèi)嵌ARM920T核心,帶有全性能的MMU,ARM9200開發(fā)板由核心板和主控板組成,核心板包括AT91RM9200ARM處理器、64MSDRAM、4MNorFlash、32MNandFlash、1個10/100/1000MDAVICOM公司的DM9702超高速以太網(wǎng)絡(luò)芯片、1個ST16C554串口芯片、RTC、1個JTAG接口和1個外部擴展總線,主控板上包括1個USB接口、1個SD卡接口、1路CAN總線接口、1個RS485、1個8×8的鍵盤、1個320×240的觸摸屏LCD接口。高性能串口服務(wù)器硬件體系結(jié)構(gòu)如圖2所示。
圖2 高性能串口服務(wù)器硬件體系結(jié)構(gòu)
高性能串口服務(wù)器在實現(xiàn)中只使用了核心板,核心板上的64M的SDRAM用于系統(tǒng)運行過程中的內(nèi)存,4M的NorFlash用于存放Bootloader和Linux Kernel代碼,32M的NandFlash用于存放jffs2根文件系統(tǒng),系統(tǒng)采用10/100/1000M高速以太網(wǎng)絡(luò)芯片DM9702作為系統(tǒng)的網(wǎng)絡(luò)接口,采用ST16C554串口芯片作為系統(tǒng)的串口芯片,該芯片與16C550串口芯片兼容,支持最高波特率達到115200bps。
2.2.1 DM9702網(wǎng)卡芯片驅(qū)動與網(wǎng)絡(luò)子系統(tǒng)體系結(jié)構(gòu)
高性能串口服務(wù)器中的DM9702網(wǎng)卡芯片驅(qū)動針對系統(tǒng)采用的Linux 2.6.24內(nèi)核編寫,驅(qū)動在編寫過程中與傳統(tǒng)網(wǎng)絡(luò)接口驅(qū)動程序相似,驅(qū)動模塊初始化函數(shù)和清除函數(shù)代碼分別如下:
清除函數(shù)為:
由于驅(qū)動在分配設(shè)備結(jié)構(gòu)時調(diào)用的是alloc_etherdev函數(shù),因此驅(qū)動采用了內(nèi)核中提供的ether_setup函數(shù)完成了對DM9702以太網(wǎng)絡(luò)接口設(shè)備驅(qū)動結(jié)構(gòu)的大多數(shù)默認操作,Linux操作系統(tǒng)采用register_netdev函數(shù)完成以太網(wǎng)接口設(shè)備驅(qū)動的注冊。
Linux內(nèi)核中的網(wǎng)絡(luò)子系統(tǒng)被設(shè)計成完全與協(xié)議無關(guān)的,但高性能串口服務(wù)器在實現(xiàn)過程中主要采用的是TCP/IP協(xié)議棧,因此論文主要研究了Linux網(wǎng)絡(luò)子系統(tǒng)中的TCP/IP協(xié)議棧,Linux網(wǎng)絡(luò)子系統(tǒng)TCP/IP協(xié)議棧體系結(jié)構(gòu)如圖3所示。
用戶應(yīng)用程序使用Linux提供的套接字接口進行網(wǎng)絡(luò)傳輸,當進程A需要將數(shù)據(jù)傳送到進程B時,應(yīng)用程序創(chuàng)建所需要傳輸?shù)臄?shù)據(jù),然后打開套接字接口并向接口中寫入數(shù)據(jù)并處理需要傳輸?shù)臄?shù)據(jù),套接字緩沖擁有數(shù)據(jù)的引用并通過各層將其向下傳遞,在每一層中都會執(zhí)行如解析數(shù)據(jù)包頭、添加修改數(shù)據(jù)包頭、檢查大小、路由操作、分片等,當套接字緩沖通過這些層向下傳遞時,其數(shù)據(jù)本身不會被復(fù)制到每個層,內(nèi)核通過及時修改套接字緩沖的引用并傳遞到下一層來減少開銷,最后內(nèi)核通過調(diào)用驅(qū)動程序中的hard_start_xmit函數(shù)將數(shù)據(jù)發(fā)送到進程B的網(wǎng)絡(luò)接口中,若數(shù)據(jù)包的目標物理地址與進程B所在主機的網(wǎng)卡的MAC地址吻合,數(shù)據(jù)包會被轉(zhuǎn)到網(wǎng)卡的緩沖區(qū)中,然后內(nèi)核將數(shù)據(jù)包拷貝到套接字緩沖并向CPU發(fā)送一個硬中斷,最后CPU處理數(shù)據(jù)包并通過所有層向上傳遞直到其達到應(yīng)用程序的端口[11]。
圖3 Linux網(wǎng)絡(luò)子系統(tǒng)TCP/IP協(xié)議棧體系結(jié)構(gòu)
2.2.2 ST16C554串口芯片驅(qū)動與串口子系統(tǒng)體系結(jié)構(gòu)
高性能串口服務(wù)器中的ST16C554串口芯片驅(qū)動主要針對系統(tǒng)采用的Linux 2.6.24內(nèi)核編寫,驅(qū)動在編寫過程中與通用串口驅(qū)動程序相似,驅(qū)動模塊初始化函數(shù)和清除函數(shù)代碼分別如下:
對st16c554_port[i]串口的操作函數(shù)、地址映射類型、訪問地址、中斷類型、時鐘和緩沖區(qū)大小等進行初始化:
清除函數(shù)為:
Linux內(nèi)核采用uart_register_driver函數(shù)完成對串口設(shè)備驅(qū)動的注冊。
Linux串口子系統(tǒng)采用層次式結(jié)構(gòu)組織整個驅(qū)動程序,Linux串口子系統(tǒng)體系結(jié)構(gòu)如圖4所示。
圖4 Linux內(nèi)核串口子系統(tǒng)體系結(jié)構(gòu)
Linux內(nèi)核串口子系統(tǒng)分為三層,分別是tty核心層、tty線路規(guī)程層和tty驅(qū)動程序?qū)樱渲衪ty核心層對應(yīng)的數(shù)據(jù)結(jié)構(gòu)是struct uart_driver,tty線路規(guī)程層在內(nèi)核中對應(yīng)的數(shù)據(jù)結(jié)構(gòu)是struct ktermios,tty驅(qū)動程序?qū)訉?yīng)的數(shù)據(jù)結(jié)構(gòu)是struct tty_driver。
在通過串口發(fā)送數(shù)據(jù)的過程中[12],tty核心層從用戶得到數(shù)據(jù),并發(fā)送給tty線路規(guī)程層程序,然后傳遞給tty驅(qū)動程序?qū)?,并格式化?shù)據(jù),最后發(fā)送給硬件;在通過串口接收數(shù)據(jù)的過程中串口硬件設(shè)備將數(shù)據(jù)回溯到tty驅(qū)動程序?qū)樱M入tty線路規(guī)程驅(qū)動,然后流入到tty核心層,最后被用戶獲取。在串口通信過程中,tty驅(qū)動程序?qū)右部梢灾苯优ctty核心層進行通信和數(shù)據(jù)傳輸,但大多數(shù)時候數(shù)據(jù)傳輸需要通過tty線路規(guī)程層驅(qū)動程序進行轉(zhuǎn)換[13]。
高性能串口服務(wù)器主要在Linux內(nèi)核中對Linux網(wǎng)絡(luò)子系統(tǒng)和Linux串口子系統(tǒng)進行了修改[14],從而使得網(wǎng)絡(luò)子系統(tǒng)中收到的數(shù)據(jù)不經(jīng)過內(nèi)核態(tài)到用戶態(tài)的拷貝直接在內(nèi)核態(tài)發(fā)送到串口子系統(tǒng)中,從而大大提高了高性能串口服務(wù)器的性能。高性能串口服務(wù)器軟件體系結(jié)構(gòu)如圖5所示。
圖5 高性能串口服務(wù)器軟件體系結(jié)構(gòu)
在系統(tǒng)實現(xiàn)過程中,對于網(wǎng)絡(luò)子系統(tǒng)中,主要修改了TCP/IP協(xié)議棧中的傳輸層的代碼使得傳輸?shù)臄?shù)據(jù)不用拷貝到接收緩沖區(qū)中就發(fā)送到串口子系統(tǒng)的內(nèi)核緩沖區(qū)中;在串口子系統(tǒng)中,主要是修改了tty核心層,tty核心層在內(nèi)核態(tài)直接接收網(wǎng)絡(luò)子系統(tǒng)中的在內(nèi)核態(tài)中的傳輸層數(shù)據(jù)包,并通過tty線路規(guī)程層和tty驅(qū)動程序?qū)⑵浒l(fā)送到物理串口設(shè)備中,同時tty核心層將從物理串口設(shè)備中接收到的數(shù)據(jù)在內(nèi)核態(tài)發(fā)送到網(wǎng)絡(luò)子系統(tǒng)中的傳輸層,從而實現(xiàn)串口和網(wǎng)絡(luò)間數(shù)據(jù)的高速傳輸[15]。
本文第1.3節(jié)指出高性能串口服務(wù)器的主要性能瓶頸在于網(wǎng)絡(luò)數(shù)據(jù)和串口數(shù)據(jù)在內(nèi)核態(tài)和用戶態(tài)之間的數(shù)據(jù)拷貝操作,由高性能串口服務(wù)器的網(wǎng)絡(luò)模型圖可知,高性能串口服務(wù)器對用戶可見的性能主要表現(xiàn)在網(wǎng)絡(luò)性能上,因此根據(jù)第1.1節(jié)中提出的3個網(wǎng)絡(luò)性能指標分別對系統(tǒng)實現(xiàn)的高性能串口服務(wù)器的網(wǎng)絡(luò)利用率、響應(yīng)時間和負載能力等進行測試。
在系統(tǒng)測試過程中,系統(tǒng)采用1.3節(jié)中提出的網(wǎng)絡(luò)模型,通過4臺PC和H3CS5100系列交換機與高性能串口服務(wù)器進行連接,并將高性能串口服務(wù)器的串口和900MHz的RFID讀寫器進行了連接。測試過程中保持串口的連接屬性為波特率115 200bps、8位數(shù)據(jù)位、1位停止位、無奇偶校驗和無流控。
在網(wǎng)絡(luò)利用率的測試過程中,系統(tǒng)通過采用1.3節(jié)中提出的網(wǎng)絡(luò)模型,在其中一臺PC上對和高性能串口服務(wù)器相連的接口的流量進行監(jiān)控,將監(jiān)控得到的流量數(shù)據(jù)文件進行保存,然后采用1.1.1節(jié)中提出的網(wǎng)絡(luò)利用率計算方法對高性能串口服務(wù)器的網(wǎng)絡(luò)利用率進行測試,測試實驗結(jié)果如圖6所示。
圖6 內(nèi)核修改前后網(wǎng)絡(luò)利用率的對比
實驗結(jié)果表明利用修改后的內(nèi)核能夠比修改前的內(nèi)核的網(wǎng)絡(luò)利用率方面提高約5%左右,因此在一定程度上提高了網(wǎng)絡(luò)的利用率。
在對高性能串口服務(wù)器的響應(yīng)時間的測試過程中,系統(tǒng)通過多臺PC客戶端不斷的連接高性能串口服務(wù)器并通過串口服務(wù)器發(fā)送數(shù)據(jù)包和接收數(shù)據(jù)包,并記錄每次發(fā)送數(shù)據(jù)包和接收數(shù)據(jù)包的延時并保存到一個數(shù)據(jù)文件,測試實驗結(jié)果如圖7所示。
實驗結(jié)果表明高性能串口服務(wù)器在修改內(nèi)核后比修改內(nèi)核前的發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的響應(yīng)時間縮短了約0.4ms,因此在一定程度上提高了通過串口服務(wù)器進行數(shù)據(jù)通信的效率。
在測試高性能串口服務(wù)器的負載過程中,采用不斷增加客戶端從而達到增加通過高性能串口服務(wù)器的網(wǎng)絡(luò)流量從而使得網(wǎng)絡(luò)出現(xiàn)響應(yīng)時間超過3s的方法對高性能串口服務(wù)器的負載能力進行測試,測試的實驗結(jié)果如圖8所示。
實驗結(jié)果表明串口服務(wù)器修改后的內(nèi)核比修改前的內(nèi)核在網(wǎng)絡(luò)負載上提高了約4.5MB,因此達到了提高串口服務(wù)器網(wǎng)絡(luò)負載的目標,并在一定程度上提高了串口服務(wù)器的性能。
本文對網(wǎng)絡(luò)和串口的性能進行了研究,并分析了影響串口服務(wù)器性能的因素,即串口通信,而影響串口通信效率的因素為內(nèi)核態(tài)和用戶態(tài)之間的頻繁數(shù)據(jù)拷貝。通過修改內(nèi)核中的串口驅(qū)動將數(shù)據(jù)直接傳送到網(wǎng)絡(luò)協(xié)議棧,提高了數(shù)據(jù)的傳輸效率,并給出了系統(tǒng)的硬件和軟件體系結(jié)構(gòu),詳細地介紹了系統(tǒng)的實現(xiàn)方案。最后對改進的串口服務(wù)器進行實驗,結(jié)果表明,改進的系統(tǒng)提高了網(wǎng)絡(luò)的利用率和負載能力,并減少了網(wǎng)絡(luò)響應(yīng)時間,提高了高性能串口服務(wù)器的性能。
[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權(quán)威指南 [M].宋巖,譯.北京:北京航空航天大學(xué)出版社,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系統(tǒng)開發(fā)技術(shù)詳解[M].北京:電子工業(yè)出版社,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的主從通信方式的主節(jié)點時序分析 [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的嵌入式通信檢測平臺的設(shè)計 [J].測控技術(shù),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系統(tǒng)移植 [J].計算機應(yīng)用,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的嵌入式系統(tǒng)初始化設(shè)計 [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內(nèi)核的IRQ異常中斷編程機制的研究 [J].計算機工程與設(shè)計,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操作系統(tǒng)處理機管理技術(shù)研究 [D].北京:北京交通大學(xué),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設(shè)備驅(qū)動程序[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通信接口設(shè)計與實現(xiàn)[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設(shè)計與應(yīng)用 [J].計算機工程,2008,34 (21):225-229.]