鄭佳晶,高榮榮
(中國電子科技集團公司第四十五研究所,北京100176)
網(wǎng)絡(luò)通信作為一種有效的通信方式,在DSP應(yīng)用開發(fā)中占據(jù)越來越重要的地位。從DSP設(shè)備實時獲取監(jiān)控或測量的數(shù)據(jù)、向DSP設(shè)備發(fā)送命令控制其采取適當(dāng)?shù)奶幚硇袨榈?,都需要網(wǎng)絡(luò)通信的支持。隨著嵌入式網(wǎng)絡(luò)通信技術(shù)研究與應(yīng)用越來越廣泛,網(wǎng)絡(luò)通信處理技術(shù)越來越成熟。TI公司推出了TCP/IP協(xié)議棧。此協(xié)議棧與TI網(wǎng)絡(luò)開發(fā)工具包NDK(Network Developer's Kit)結(jié)合在一起使用。NDK是一個基于SYS/BIOS實時操作系統(tǒng)的網(wǎng)絡(luò)協(xié)議棧,目前主要用于開發(fā)和驗證TI C6000系列和ARM系列嵌入式處理器的網(wǎng)絡(luò)應(yīng)用功能。包含在NDK發(fā)布版中的代碼是通用的C代碼。NDK棧作為一個快速的原型平臺為開發(fā)網(wǎng)絡(luò)和包處理程序提供服務(wù)。它能用于向已經(jīng)存在的應(yīng)用程序中添加網(wǎng)絡(luò)連接,以支持網(wǎng)絡(luò)的通信、配置和控制?;赟YS/BIOS的網(wǎng)絡(luò)開發(fā)組件,提供網(wǎng)絡(luò)協(xié)議棧的支持,提供基本網(wǎng)絡(luò)服務(wù)開發(fā)的接口,簡化了DSP網(wǎng)絡(luò)應(yīng)用程序的開發(fā)[1]。
NDK僅用200~250K的程序空間和95K的數(shù)據(jù)空間即可支持常規(guī)的TCP/IP服務(wù),包括應(yīng)用層的TELNET、DHCP和HTTP等協(xié)議,可使基于數(shù)字信號處理技術(shù)的因特網(wǎng)終端的網(wǎng)絡(luò)連接成本大大降低。因此,NDK很適合目前的嵌入式系統(tǒng)硬件環(huán)境,是實現(xiàn)DSP網(wǎng)絡(luò)開發(fā)的重要支撐工具。
如圖1所示,NDK主要由5個庫組成,分別是硬件抽象庫(hal.lib)、網(wǎng)絡(luò)控制庫(netctrl.lib)、網(wǎng)絡(luò)工具庫(nettool.lib)、操作系統(tǒng)庫(os.lib)和協(xié)議棧庫(stack.lib)。
圖1 協(xié)議??刂屏?/p>
(1)硬件抽象庫HAL將具體的底層硬件抽象為一個硬件抽象層與NDK隔離,主要負責(zé)管理與網(wǎng)絡(luò)相關(guān)的硬件資源,為NDK提供一組編程接口。包含硬件外設(shè)到NDK的接口,例如,計時器、LED指示燈、以太網(wǎng)設(shè)備和串口等。
(2)網(wǎng)絡(luò)工具庫NETTOOL庫中包含了NDK提供的所有基于網(wǎng)絡(luò)服務(wù)的套接字,以及一些用于網(wǎng)絡(luò)應(yīng)用程序開發(fā)的工具。在網(wǎng)絡(luò)工具庫中最常用的組件是基于標(biāo)簽的配置系統(tǒng),它幾乎控制棧及其服務(wù)的每個方面[2]。
(3)操作系統(tǒng)庫將DSP/BIOS操作系統(tǒng)的功能抽象為一個操作系統(tǒng)適配層與NDK隔離,將某些抽象的操作系統(tǒng)調(diào)用映射到SYS/BIOS函數(shù)調(diào)用。這個適應(yīng)層允許SYS/BIOS系統(tǒng)程序員將NDK系統(tǒng)調(diào)整到任何基于SYS/BIOS的操作系統(tǒng)中。
(4)協(xié)議棧庫主要是TCP/IP協(xié)議棧,它包含以太網(wǎng)和點到點協(xié)議頂層套接字層的所有內(nèi)容。TCP/IP協(xié)議棧是主要的TCP/IP網(wǎng)絡(luò)功能庫,該庫構(gòu)建在SYS/BIOS操作系統(tǒng)之上,實現(xiàn)了從上層套接字到底層鏈路層的所有功能。STACK庫是基于SYS/BIOS編譯的,能充分利用SYS/BIOS操作系統(tǒng),在平臺間遷移時不需要移植。
(5)網(wǎng)絡(luò)控制庫NETCTRL是協(xié)議棧配置、初始化和事件調(diào)度的核心,它控制TCP/IP與外部的交互。在所有的協(xié)議棧模塊中,它對NDK的操作時最重要,其功能:
a)負責(zé)NDK的初始化和底層設(shè)備驅(qū)動;
b)通過配置服務(wù)回調(diào)函數(shù)啟動和維護系統(tǒng)配置;
c)向底層設(shè)備驅(qū)動提供接口,同時調(diào)度驅(qū)動事件;
d)在退出時卸載系統(tǒng)配置和清理驅(qū)動。
NDK協(xié)議棧初始化的基本過程:
(1)運行Stack Thread Begin(Global.stackBeginHook)掛鉤函數(shù)。注意在這個掛鉤函數(shù)中,任何與NDK相關(guān)的代碼都不能運行,因為NC_SystemOpen()函數(shù)還沒有運行。
(2)用初始化函數(shù)對操作系統(tǒng)環(huán)境進行初始化:NC_SystemOpen(Prio rity,OpMode),它的兩個參數(shù)Priority和OpMode分別決定網(wǎng)絡(luò)事件調(diào)度器在SYS/BIOS線程中的優(yōu)先級和操作模式。這個函數(shù)必須在NDK相關(guān)的函數(shù)被調(diào)用之前調(diào)用。
(3)通過CfgNew()創(chuàng)建一個新的配置。一旦創(chuàng)建了配置句柄,就可以將配置信息裝載到句柄中,既可以整體裝載,也可以采用一次一個條目的形式進行裝載。
(4)通過配置函數(shù)API的調(diào)用構(gòu)建新配置或加載一個原來存在的配置:CfgLoad()/CfgAddEntry(),兩者的區(qū)別在于整體裝載還是逐一進行裝載,裝載的參數(shù)包括:網(wǎng)絡(luò)主機名,IP地址和子網(wǎng)掩碼,默認(rèn)路由的IP地址,需要執(zhí)行的服務(wù)(例如:DHCP、DNS和HTTP),命名服務(wù)器的IP地址,協(xié)議棧的屬性(例如:IP路由、套接字緩存大小等)。
(5)通過調(diào)用NC_NetStart()函數(shù),用上面的配置啟動協(xié)議棧。該函數(shù)由四個參數(shù):配置句柄、指向開始函數(shù)的指針、指向結(jié)束函數(shù)的指針和指向IP地址時間的函數(shù)。開始函數(shù)和結(jié)束函數(shù)只被調(diào)用一次,開始函數(shù)在初始化結(jié)束后準(zhǔn)備執(zhí)行網(wǎng)絡(luò)應(yīng)用程序時調(diào)用,IP地址事件函數(shù)允許被多次調(diào)用,NC_NetStart()函數(shù)直到協(xié)議棧繪會話終止才返回。
(6)在一些初步的初始化后,NC_NetStart()函數(shù)創(chuàng)建一個新的線程,這個新的線程會調(diào)用生成的NetworkOpen()函數(shù)。NetworkOpen()函數(shù)根據(jù)網(wǎng)絡(luò)需求創(chuàng)建網(wǎng)絡(luò)任務(wù)線程。
(7)在正常操作下,協(xié)議棧直到函數(shù)NC_Net-Stop()被調(diào)用才會關(guān)閉。
(8)當(dāng)NC_NetStart()返回且會話結(jié)束后,調(diào)用Cfg_Free()釋放配置句柄。
(9)當(dāng)所有資源釋放后,調(diào)用NC_System-Close完成系統(tǒng)關(guān)閉操作[3]。
NDK的初始化流程如圖2所示。
圖2 NDK初始化流程圖
PC與DSP的網(wǎng)絡(luò)通信是經(jīng)常使用的場景之一,采用C/S的網(wǎng)絡(luò)開發(fā)架構(gòu),基于socket進行PC與DSP通信的程序設(shè)計,PC端作為server,DSP端作為client,在DSP端發(fā)送數(shù)據(jù),PC端收到數(shù)據(jù)后不作任何處理,把接收到的數(shù)據(jù)回傳給DSP,在DSP端統(tǒng)計往返時間及誤碼率。程序流程圖如圖3所示。
圖3 PC與DSP通信流程圖
這里采集100次往返時間進行統(tǒng)計分析,DSP端發(fā)送接收緩沖區(qū)默認(rèn)設(shè)置8192字節(jié)。這里從PC操作系統(tǒng)的CPU負載情況進行測試分析,CPU占用率70%時的通信速率統(tǒng)計結(jié)果如圖4、圖5所示。
圖5 CPU占用率70%時網(wǎng)絡(luò)波動
為了測試PC操作系統(tǒng)CPU占用率比較低的情況下的網(wǎng)絡(luò)通信速率,將與測試無關(guān)的進程關(guān)閉,減輕CPU的負載。PC操作系統(tǒng)CPU占用率為10%的通信速率統(tǒng)計情況如圖6、圖7所示。
圖6 CPU使用率10%時數(shù)值統(tǒng)計
從圖4到圖7可以看出:在Windows系統(tǒng)占用率低的時候,通信時間的波動確實減小,往返時間也相應(yīng)的減少了。通信往返時間受PC端影響較大,因為Windows是非實時系統(tǒng),在消息處理上有其內(nèi)在的機制。DSP端是實時系統(tǒng),所以延遲小,響應(yīng)快。另外,對數(shù)據(jù)進行校驗誤碼率為零。
圖4 CPU使用率70%時數(shù)值統(tǒng)計
圖7 CPU使用率10%時數(shù)值統(tǒng)計與波動分析
另外在測試中關(guān)閉了Nagle算法與關(guān)閉前進行數(shù)據(jù)對比分析,發(fā)現(xiàn)關(guān)閉Nagle并不能減少太多時間。對于socket還有其他設(shè)置選項如發(fā)送緩沖區(qū)大小,接收緩沖區(qū)大小以及重傳超時時間設(shè)置等,可以根據(jù)具體的應(yīng)用進行相關(guān)的設(shè)置,提高網(wǎng)絡(luò)通信效率。
通過NDK對TCP/IP協(xié)議棧進行初始化和配置,實現(xiàn)了PC與DSP的網(wǎng)絡(luò)通信,完成了數(shù)據(jù)網(wǎng)絡(luò)通信工作,測試研究表明NDK開發(fā)套件使用方便,性能優(yōu)良可靠,可以最大限度地節(jié)省開發(fā)時間和成本,是嵌入式DSP網(wǎng)絡(luò)開發(fā)的首選。