王星宇,丁興軍
(中國船舶重工集團公司第723研究所,揚州225001)
?
一種改進的基于NDK的DSP服務器端程序設計與實現(xiàn)
王星宇,丁興軍
(中國船舶重工集團公司第723研究所,揚州225001)
隨著網(wǎng)絡開發(fā)工具包(NDK)廣泛地應用于TMS320 C6000系列數(shù)字信號處理(DSP)平臺的網(wǎng)絡,基于NDK的DSP程序編程越來越重要,傳統(tǒng)DSP服務器端程序已不能很好地適應多客戶端、大數(shù)據(jù)量的網(wǎng)絡交互平臺。提出了一種改進的程序設計來解決這一問題,先介紹了NDK的結構以及構成和相應的DSP/BIOS配置,然后闡述了基于NDK平臺DSP服務器端程序傳統(tǒng)方法設計與實現(xiàn)及其不足,提出了其改進型的程序設計與實現(xiàn),最后給出了在TMS320C6455 DSP下2種方法的實驗結果,證明改進型的程序設計是合理有效的。
數(shù)字信號處理;傳輸控制協(xié)議/互連網(wǎng)協(xié)議;網(wǎng)絡開發(fā)工具包
隨著網(wǎng)絡化、信息化的高速發(fā)展和應用,在嵌入式設備上進行組網(wǎng),應用網(wǎng)絡通信成為熱門研究對象[1]。TI的C6000系列芯片是面向大規(guī)模數(shù)據(jù)處理的高端數(shù)字信號處理(DSP)芯片,結合其推出的網(wǎng)絡開發(fā)包(NDK),開發(fā)出相應的網(wǎng)絡端程序,可以進行多個嵌入式平臺之間的網(wǎng)絡數(shù)據(jù)交互?;贜DK下傳統(tǒng)的DSP服務器端程序,在多客戶端任務環(huán)境系統(tǒng)中,會出現(xiàn)運行不穩(wěn)定,甚至堆棧溢出、程序崩潰等問題,本文提出了一種改進型的程序設計,更能適應多客戶端、多任務系統(tǒng)環(huán)境下的網(wǎng)絡數(shù)據(jù)交互應用。
NDK是TI公司為了配合其推出的TMS320C6000系列DSP的傳輸控制協(xié)議/互連網(wǎng)協(xié)議(TCP/IP)棧[2-3]而開發(fā)的新型網(wǎng)絡開發(fā)工具包, 其設計目的是要提供一個完整的TCP/IP。NDK采用緊湊的設計方法, 實現(xiàn)了用較少的資源耗費支持TCP/IP, 且僅用200~250 kB的程序空間和95 kB的數(shù)據(jù)空間即可支持常規(guī)的TCP/IP服務,被廣泛地應用于DSP網(wǎng)絡開發(fā)。正確使用NDK,需要了解3個方面:結構組成、TCP/IP下的配置和DSP/BIOS配置。
1.1 NDK結構
NDK結構主要由5個功能模塊組成[1],對應的函數(shù)庫分別為OS.LIB,HAL.LIB,STACK.LIB,NETTOOL.LIB 和NETCTRL.LIB。其詳細結構示意如圖1所示。
圖1 NDK TCP/IP協(xié)議棧結構
NDK通過編程接口與本地操作系統(tǒng)(DSP/BIOS)和底層硬件相互隔離。其中本地操作系統(tǒng)(DSP/BIOS)被抽象成一個操作系統(tǒng)適應層(OS Adaptation Layer),也就是OS.LIB;底層硬件被抽象為一個硬件抽象層(Hardware Abstraction Layer),也就是HAL.LIB。網(wǎng)絡工具庫(Network Tools Library)也就是NETTOOL.LIB,主要包含了NDK提供的所有套接字的網(wǎng)絡功能和開發(fā)工具。TCP/IP協(xié)議庫所對應的是STACK.LIB,TCP/IP網(wǎng)絡功能庫,包含所有有關TCP/IP協(xié)議下的套接字接口層到鏈路層的功能。網(wǎng)絡調度控制(Network Scheduler)對應的是NETCTRL.LIB,從示意圖看,它是整個結構的核心,在整個協(xié)議棧中起關鍵作用,協(xié)調操作系統(tǒng),管理硬件驅動和整個網(wǎng)絡事件。網(wǎng)絡應用程序(Network Application),也就是基于NDK架構下,頂層的網(wǎng)絡應用端程序層,通過API函數(shù)庫開發(fā)工程所需的應用程序。下面介紹的2種服務器端程序就是屬于這一類網(wǎng)絡應用程序。
1.2 NDK下的TCP/IP協(xié)議棧的配置和使用
在編寫一個網(wǎng)絡任務程序之前,TCP/IP協(xié)議棧必須正確地配置和初始化。圖2是典型的配置TCP/IP協(xié)議棧的一個流程。
圖2 典型的NDK下TCP/IPX協(xié)議棧配置流程
圖2中的基本步驟為:首先調用NETCTRL.LIB下的NC_SystemOpen庫函數(shù)[2],配置一個新的操作系統(tǒng),建立配置項hCfg,并將要設置的網(wǎng)絡IP地址、子網(wǎng)掩碼、域名、網(wǎng)關信息等導入新建的配置項中。接下來調用NC_NetStart(hCfg, NetworkOpen, NetworkClose, NetworkIPAddr )來啟動開發(fā)的網(wǎng)絡端應用程序,NetworkOpen就是網(wǎng)絡端應用開發(fā)程序入口函數(shù)名,NC_NetStart啟動后,網(wǎng)絡程序任務的創(chuàng)建都在此函數(shù)下被調用。NetworkClose 函數(shù)是在網(wǎng)絡結束的時候被調用。NetworkIPAddr 函數(shù)是IP地址事件函數(shù),當本地IP地址被系統(tǒng)調用或被刪除時都會被調用。最后當網(wǎng)絡結束時,調用CfgFree和NC_SystemClose來刪除網(wǎng)絡配置,并關閉操作系統(tǒng)。
1.3 NDK下的DSP/BIOS配置
DSP/BIOS是TI開發(fā)的實時操作系統(tǒng)。支持實時分析、線程管理、調度軟件中斷和外部硬件中斷,用戶編寫的開發(fā)程序都由DSP/BIOS調度。而DSP/BIOS本身并沒有包括和支持NDK,NDK如果要運行在操作系統(tǒng)上,必須得到DSP/BIOS操作系統(tǒng)的支持,需要調整DSP/BIOS的2個基本配置[3]:
(1) 定時器設置
NDK需要DSP/BIOS提供一個時鐘驅動模塊,產(chǎn)生100 ms的定時驅動,提供給NDK硬件抽象層作為定時中斷器和時間驅動。而這個時鐘驅動模塊PRD,對應的時間驅動函數(shù)llTimerTick(),需要在DSP/BIOS下的tcf文件里設置,具體如圖3所示,在PRD模塊下面建立一個prdNdk的任務,函數(shù)名為llTimerTick,將其屬性里定時周期period設為100 ms。
圖3 DSP/BIOS 定時器設置
(2) HOOK環(huán)境變量設置
HOOK為TCP/IP協(xié)議棧設置保存的空間。OS層的任務調度模塊需要調用HOOK來保存和調用TCP/IP協(xié)議棧的環(huán)境變量指針,需要在DSP/BIOS下的tcf文件里設置,具體如圖4所示,在System下面的HOOK模塊里建立hookNdk任務,在其屬性里創(chuàng)建2個鉤子函數(shù)NDK_hookInit()和NDK_hookCreate()。
圖4 DSP/BIOS HOOK環(huán)境變量設置
傳統(tǒng)的服務器端程序設計是在NDK結構頂層(圖1)Network Application下進行編程,流程如下:
(1) 在NetworkOpen下建立一個dtask_TcpServer服務器程序任務;
(2) 調用fdOpenSession(),初始化文件向量;
(3) 建立socket套接字;
(4) 設置與客戶端的通信端口;
(5) 綁定并監(jiān)聽端口;
(6) 啟用阻塞式函數(shù)accept(),來創(chuàng)建針對客戶端的任務,一個客戶端對應一個任務;
(7) 服務器端和客戶端網(wǎng)絡信息的交互都在對應的客戶端任務中編程實現(xiàn);
(8) 當網(wǎng)絡異常或連接中斷,則需要調用fdclose(),關閉服務器端socket,執(zhí)行fdCloseSession(),關閉文件變量系統(tǒng),釋放內存,最后退出dtask_TcpServer()服務器端程序任務。
圖5 傳統(tǒng)服務器端設計流程
傳統(tǒng)服務器端程序的不足在于,當使用accept()阻塞式函數(shù)開啟對客戶端的連接任務時(圖5),對于單個網(wǎng)絡客戶端系統(tǒng),能夠穩(wěn)定運行,但對于多網(wǎng)絡客戶端系統(tǒng)或者多任務、多線程系統(tǒng)時,再進行大數(shù)據(jù)量交互或者多任務切換時,頻繁地調用阻塞式函數(shù)帶來了各個任務的空間分配單元錯誤和堆棧溢出,導致程序崩潰。
傳統(tǒng)服務器端程序設計對堆棧的設置需求非常高,一旦有多客戶端連接服務器或者大數(shù)據(jù)量信號處理的多線程任務處理,就會造成網(wǎng)絡性能下降、堆棧溢出、服務器端程序崩潰現(xiàn)象。面對目前日益增長的互聯(lián)網(wǎng)需求以及復雜和大數(shù)據(jù)量信號處理的網(wǎng)絡數(shù)據(jù)量增加,NDK下傳統(tǒng)服務器端的程序設計已越來越不滿足要求,對其改進的需求也越來越多。下面介紹一種改進的服務器端設計方法(見圖6)。相對于傳統(tǒng)服務器端編程設計,其利用fdselect()來創(chuàng)建與客戶端的連接:
圖6 改進型服務器端程序設計流程
(1) 改進型的服務器端程序任務和傳統(tǒng)服務器程序設置任務一樣在NetworkOpen下建立,但是當建立與多客戶端連接的服務器端程序系統(tǒng)時,多客戶端的網(wǎng)絡數(shù)據(jù)交互任務也直接在NetworkOpen下建立。
(2) 多客戶端任務里,每一個程序任務的設計除了客戶端IP地址和端口號不一樣,其他的網(wǎng)絡編程順序是一樣的。首先調用fdOpenSession(),初始化文件向量。
(3) 建立socket套接字。
(4) 設置與客戶端的通信端口,即IP地址和端口號。
(5) 綁定并監(jiān)聽端口。
和傳統(tǒng)設計不一樣,使用NDK下的fdselect()函數(shù),來檢測由fdOpenSession創(chuàng)建的文件向量描述符。它也是阻塞式函數(shù),將任務暫時掛起,監(jiān)聽文件向量描述符里出現(xiàn)的任何活動,fdselect()只是檢測文件向量描述符,確定連接后,直接使用accept()建立與客戶端連接,消耗很少的CPU資源;而不像直接調用accept()需要消耗任務進程所需要的系統(tǒng)資源去實現(xiàn),這樣能更好地節(jié)省堆??臻g。具體實現(xiàn)如下:
(1) 在調用fdselect()前,需要用FD_ZERO函數(shù)對文件向量描述符初始化,分別調用FD_ZERO(&ibits),F(xiàn)D_ZERO(obits) FD_ZERO(&xbits)來清除文件向量描述符里的讀記錄標志、寫記錄標志和特殊條件的記錄標志。
(2) 使用FD_SET,將socket文件向量描述符添加到文件讀記錄里。
(3) 使用阻塞式fdselect(),來判斷文件向量描述符里有沒有新的事件或者讀寫數(shù)據(jù)發(fā)生。
(4) 當fdSelect()返回的值Value大于0,判斷客戶端有數(shù)據(jù)量產(chǎn)生時,使用FD_ISSET()再次確認這個數(shù)據(jù)是否來自要連接的客戶端。確認之后,調用accept()與客戶端建立連接,開始收發(fā)客戶端的數(shù)據(jù)。
(7) 上一步驟中,如果出現(xiàn)網(wǎng)絡異常或網(wǎng)絡中斷,則需要調用fdclose(),關閉socket套接字,執(zhí)行fdCloseSession(),關閉文件變量系統(tǒng),釋放內存,最后運行TSK_exit(),退出dtask_Server_ClientN()服務器端程序任務。
為了對比測試傳統(tǒng)方法和改進后的方法針對單客戶端和多客戶端的運行效果,測試選用TI的TMSC6455DSP[4]信號處理評估模塊(EVM)和3臺PC機組成網(wǎng)絡,作為系統(tǒng)收發(fā)仿真環(huán)境,首先在EVM上建立服務器,并用1臺PC機模擬客戶端,與之建立連接形成服務器對單客戶端任務系統(tǒng)。服務器端IP地址設為192.9.200.29,端口號為5 000;PC機客戶端IP地址設為192.9.200.101,端口號為5 000,用PC端網(wǎng)絡調試助手進行大數(shù)據(jù)量的網(wǎng)絡收發(fā)測試。在傳統(tǒng)型和改進型的2種方法下,收發(fā)數(shù)據(jù)包都很穩(wěn)定,客戶端斷網(wǎng)重新連接測試也很正常。圖7是在CCS3.3環(huán)境下的測試結果圖。
圖7 單客戶端任務系統(tǒng)下測試結果圖
然后,利用EVM板和3臺PC機組成服務器對多客戶端任務系統(tǒng)做網(wǎng)絡收發(fā)測試。服務器IP端地址依舊設為192.9.200.29,端口號為5 000,對應的3臺PC機客戶端IP地址為192.9.200.101、192.9.200.102、192.9.200.103,端口號也為5 000。用PC端網(wǎng)絡調試助手進行大數(shù)據(jù)量的網(wǎng)絡數(shù)據(jù)收發(fā)測試。
使用改進型設計的服務端程序在對多客戶端任務系統(tǒng)下,運行正常,進行大量的收發(fā)數(shù)據(jù)和重連測試也一切正常,測試圖如圖8所示。
圖8 多客戶端環(huán)境下改進型設計運行測試圖
使用傳統(tǒng)型設計的服務端程序在對多客戶端任務系統(tǒng)下,經(jīng)過大量收發(fā)數(shù)據(jù)和斷網(wǎng)重連測試,運行一段時間后,出現(xiàn)了錯誤,見圖9。程序出現(xiàn)Buffer OOM錯誤,OOM SBNEW 是一個分配內存函數(shù),在stack.lib的sb.c文件里實現(xiàn),SBNew:Buffer OOM 意味著分配內存不成功,也就是堆棧溢出,程序跑飛。
圖9 多客戶端環(huán)境下傳統(tǒng)型設計運行測試圖
通過對比測試,可以明顯看出傳統(tǒng)服務器端程序在多客戶端任務環(huán)境系統(tǒng)里運行不太穩(wěn)定,對系統(tǒng)stack和heap資源設置要求比較高,當有其他更高優(yōu)先級的任務時,需要消耗的系統(tǒng)資源就更多,不太適應高密度數(shù)據(jù)量、多任務系統(tǒng)環(huán)境下的網(wǎng)絡數(shù)據(jù)交互,而改進型的服務器程序設計通過NDK下檢測文件向量描述符里的活動事件,有活動事件產(chǎn)生才去響應網(wǎng)絡數(shù)據(jù)量的交互,極大地節(jié)省了堆棧資源和heap空間,更好地滿足了現(xiàn)代實際工程中的網(wǎng)絡應用。
隨著DSP芯片在現(xiàn)代工程中被廣泛應用,DSP下的網(wǎng)絡技術就顯得尤為重要?,F(xiàn)在越來越多的實際工程應用都需要多節(jié)點、多任務、多客戶端、大數(shù)據(jù)量連接,以往傳統(tǒng)服務器端的程序設計已不滿足這種復雜的環(huán)境。本文利用改進的程序設計很好地解決了這一問題,為DSP設備在更多的場景下更好地利用網(wǎng)絡提供了廣闊的前景。
[1] 甘泉.基于DSP/BIOS的千兆以太網(wǎng)研究與實現(xiàn)[J].軍事通信技術,2011,32(1):82-85.
[2] 劉海峰.基于DSP的TCP/IP協(xié)議的應用研究[J].微電子學與計算機,2006(2):78-79.
[3] 李明,康靜秋,賈志平.嵌入式TCP/IP協(xié)議棧的研究與開發(fā)[J].計算機工程與應用,2002,38(16):118- 121.
An Improved Program Design and Realization of DSP Server-side Based on NDK
WANG Xing-yu,DING Xing-jun
(The 723 Institute of CSIC,Yangzhou 225001,China)
With the network developer's kit (NDK) is widely used for the network of TMS320 C6000 series digital signal processing (DSP) platform,the DSP programming based on NDK is more and more important.The traditional DSP server-side program is unable to adapt to the multi-client and large data volume interactive network platform.This paper proposes an improved program design method to solve this problem.This paper firstly introduces the structure & composition of NDK and corresponding DSP/BIOS configuration,then expatiates the design and realization shortages of traditional DSP server-side program method based on NDK platform,puts forward the program design and realization of the improved method,finally gives the experimental results of two methods under the condition of TMS320C6455 DSP,which proves that the improved program design is reasonable and effective.
digital signal processing;transmission control protocol/internet protocol;network developer's kit
2016-02-27
TP311.1
B
CN32-1413(2016)04-0099-06
10.16426/j.cnki.jcdzdk.2016.04.022