周恒國,黃 方
(電子科技大學(xué) 資源與環(huán)境學(xué)院,四川 成都611731)
由于網(wǎng)絡(luò)的高速發(fā)展,嵌入式平臺上的網(wǎng)絡(luò)通信已經(jīng)成為一個(gè)必要的通信模塊。TI公司(Texas Instruments)的C6000系列DSP芯片有很多都在其片上集成了以太網(wǎng)接口,如TMS320C6747、TMS320C6748等。結(jié)合配套的TCP/IP協(xié)議棧,可使基于數(shù)字信號處理技術(shù)的因特網(wǎng)終端的網(wǎng)絡(luò)連接成本降低50%以上。而此協(xié)議棧與NDK(Network Developer's Kit)結(jié)合在一起使用,可以縮短軟件開發(fā)周期。
本文針對TMS320C6748芯片,對其網(wǎng)絡(luò)硬件進(jìn)行設(shè)計(jì),并基于NDK進(jìn)行網(wǎng)絡(luò)軟件設(shè)計(jì)。
國際標(biāo)準(zhǔn)化組織(ISO)于20世紀(jì)70年代提出了開放式通信系統(tǒng)互聯(lián)參考模型OSI(Open System Interconnection Reference Model),旨在使各種計(jì)算機(jī)在世界范圍內(nèi)互聯(lián)的網(wǎng)絡(luò)標(biāo)準(zhǔn)框架。它劃分為物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會話層、表示層和應(yīng)用層7個(gè)層次。物理層定義了所有電子及物理設(shè)備的規(guī)范,其中特別定義了設(shè)備與物理媒介之間的關(guān)系,包括了針腳、電壓、線纜規(guī)范、集線器、中繼器、網(wǎng)卡、主機(jī)適配器(在SAN中使用的主機(jī)適配器)以及其他設(shè)備的設(shè)計(jì)定義;數(shù)據(jù)鏈路層的功能在于管理物理層的比特?cái)?shù)據(jù),并且將正確的數(shù)據(jù)傳送到?jīng)]有傳輸錯(cuò)誤的路線中;網(wǎng)絡(luò)層為數(shù)據(jù)傳送的目的地尋址,再選擇出傳送數(shù)據(jù)的最佳路線;傳輸層用于控制數(shù)據(jù)流量,并且進(jìn)行調(diào)試及錯(cuò)誤處理,以確保通信順利。而傳送端的傳輸層會為分組加上序號,方便接收端把分組重組為有用的數(shù)據(jù)或文件;會話層用于為通信雙方制定通信方式,并創(chuàng)建、注銷會話(雙方通信);表示層能為不同的客戶端提供數(shù)據(jù)和信息的語法轉(zhuǎn)換內(nèi)碼,使系統(tǒng)能解讀成正確的數(shù)據(jù)。同時(shí),也能提供壓縮解壓、加密解密;應(yīng)用層能與應(yīng)用程序界面溝通,以達(dá)到展示給用戶的目的,常見的協(xié)定有 HTTP、HTTPS、FTP、TELNET、SSH、SMTP 和POP3等。
OSI是一個(gè)定義良好的協(xié)議規(guī)范集,但過于龐大復(fù)雜。因此,DARPA(Defense Advanced Research Projects Agency)開發(fā)了TCP/IP模型,它采用更少的層(主要是把應(yīng)用層、表示層、會話層合并為應(yīng)用層),更適應(yīng)現(xiàn)實(shí)的協(xié)議。OSI模型與TCP/IP模型對比如圖1所示。
圖1 OSI模型與TCP/IP模型
TMS320C6748的網(wǎng)絡(luò)模塊主要包括EMAC控制模塊、EMAC模塊和MDIO模塊,其網(wǎng)絡(luò)功能模塊圖如圖2所示。
EMAC控制模塊是設(shè)備處理器與EMAC、MDIO模塊之間的主要接口,它控制網(wǎng)絡(luò)設(shè)備的中斷并采用8 KB的內(nèi)部RAM來容納EMAC緩沖區(qū)描述符(CPPIRAM)。
MDIO模塊的全稱是數(shù)據(jù)輸入/輸出管理模塊(Management Data Input/Output Module),采用 802.3串行管理接口來查詢和控制多達(dá)32個(gè)使用共享雙總線的以太網(wǎng)PHY設(shè)備。主機(jī)軟件通過MDIO模塊配置每個(gè)基于EMAC模塊的物理層自適應(yīng)參數(shù),檢索自適應(yīng)參數(shù)的值,并且配置使EMAC模塊正常運(yùn)作的參數(shù)。概括地說,MDIO模塊負(fù)責(zé)管理與EMAC相連的所有PHY芯片,包括對PHY芯片進(jìn)行枚舉、配置和器件狀態(tài)檢測等。
EMAC模塊的全稱是以太網(wǎng)媒體訪問控制模塊(Ethernet Media Access Controller Module),它提供處理器與網(wǎng)絡(luò)之間的高效接口,負(fù)責(zé)以太網(wǎng)數(shù)據(jù)的發(fā)送與接收。TMS320C6748上的 EMAC模塊支持10 Mb/s和 100 Mb/s模式,工作在半雙工或全雙工模式下,同時(shí)具有硬件流控制及服務(wù)質(zhì)量保證(QoS)支持。
TMS320C6748支持媒體獨(dú)立接口MII(Media Independent Interface)與簡化媒體獨(dú)立接口RMII(Reduced Media Independent Interface)。以 MII為例,其接口電路設(shè)計(jì)如圖3所示。
MII接口信號線定義為:
(1)MII_TXCLK:發(fā)送時(shí)鐘信號。所發(fā)送的時(shí)鐘是一個(gè)連續(xù)的信號,作為發(fā)送操作的定時(shí)基準(zhǔn),MII_TXD和MII_TXEN信號依賴于這個(gè)時(shí)鐘信號。它由PHY產(chǎn)生,在10/100 Mb/s模式下啟用,當(dāng)系統(tǒng)工作在10 Mb/s時(shí)為2.5 MHz,工作在 100 Mb/s時(shí)為 25 MHz。
(2)MII_TXD[3-0]:發(fā)送數(shù)據(jù)線。包含 4條數(shù)據(jù)線,是4位數(shù)據(jù)的集合。其中MTDX0是最低有效位(LSB)。信號根據(jù)MII_TXCLK同步,并且只有當(dāng)MII_TXEN使能時(shí)才有效。
(3)MII_TXEN:發(fā)送使能信號。發(fā)送使能信號表示MII_TXD生成半字節(jié)的數(shù)據(jù)可發(fā)送給PHY,由MII_TXCLK信號線驅(qū)動。
(4)MII_COL:網(wǎng)絡(luò)沖突監(jiān)測信號。在半雙工模式下,當(dāng)檢測到網(wǎng)絡(luò)上的沖突時(shí)該位被置位,它會一直保持直到?jīng)_突消除,并且該信號不一定與MII_TXCLK和MII_RXCLK同步。在全雙工模式下,該位被用于硬件流量傳輸?shù)目刂?。?dāng)該位有效時(shí),停止數(shù)據(jù)的傳輸,如果數(shù)據(jù)包正在傳輸?shù)倪^程中,將完成本次傳輸。如果該位被設(shè)置為低電平,將不啟用硬件流量傳輸控制。
(5)MII_CRS:載波感應(yīng)信號。在半雙工模式下,如果PHY正在發(fā)送或者接收數(shù)據(jù),該位會被置位。同樣它與MII_TXCLK、MII_RXCLK不同步。在全雙工模式下,MII_CRS應(yīng)保持低電平。
(6)MII_RXCLK:接收時(shí)鐘信號。接收時(shí)鐘也是一個(gè)連續(xù)的信號,作為接收操作的定時(shí)基準(zhǔn),MII_RXD和MII_RXEN信號都依賴于這個(gè)時(shí)鐘信號。它是由PHY產(chǎn)生,在10/100 Mb/s模式下啟用,當(dāng)系統(tǒng)工作在10 Mb/s時(shí)為 2.5 MHz,工作在 100 Mb/s時(shí)為 25 MHz。
(7)MII_RXD[3-0]:接收數(shù)據(jù)線。
(8)MII_RXDV:接收數(shù)據(jù)使能。
(9)MII_RXER:接收出錯(cuò)信號。
(10)MDIO_CLK:MDIO時(shí)鐘。MDIO的數(shù)據(jù)源于系統(tǒng)模塊MDIO。該時(shí)鐘頻率由MDIO控制寄存器的CLKDIV位來設(shè)置。
(11)MDIO_D:管理數(shù)據(jù)輸入輸出。
網(wǎng)絡(luò)開發(fā)者套件(NDK)是一個(gè)開發(fā)TI嵌入式處理器網(wǎng)絡(luò)應(yīng)用平臺,但目前僅限于TMS320C6000 DSP系列和ARM處理器。NDK的設(shè)計(jì)目的是為開發(fā)者提供一個(gè)完整的TCP/IP功能環(huán)境,縮短開發(fā)周期,降低開發(fā)難度。NDK通過編程接口與本地操作系統(tǒng)(DSP/BIOS)和底層硬件相互隔離,如圖4所示[1]。本地操作系統(tǒng)(DSP/BIOS)被抽象成一個(gè)操作系統(tǒng)適應(yīng)層(OS Adaptation Layer),底層硬件被抽象成一個(gè)硬件抽象層(Hardware Abstraction Layer),兩個(gè)抽象層的函數(shù)庫分別為OS.LIB和HAL.LIB,它們是NDK與本地操作系統(tǒng)和底層硬件的接口[2]。圖5為TCP/IP協(xié)議棧的結(jié)構(gòu)[3]。
STACK庫是主要的TCP/IP網(wǎng)絡(luò)功能庫,它包括了從底層鏈路層到上層套接口層的所有功能,該庫基于DSP/BIOS操作系統(tǒng)。NETCTRL庫在整個(gè)協(xié)議棧中起關(guān)鍵作用,協(xié)調(diào)操作系統(tǒng)和底層硬件驅(qū)動,管理所有網(wǎng)絡(luò)事件。NETTOOL庫提供配置網(wǎng)絡(luò)的各種服務(wù)[4]。
在網(wǎng)絡(luò)程序執(zhí)行之前,需對開發(fā)平臺進(jìn)行板極初始化,并對網(wǎng)絡(luò)寄存器進(jìn)行配置,將其作為一個(gè)鉤子函數(shù),在DSP啟動時(shí)加載。而TCP/IP協(xié)議棧需要設(shè)置成一個(gè)主線程,并設(shè)置較高的優(yōu)先級等級(可設(shè)置成等級 5)。初始化及線程任務(wù)設(shè)置需要在DSP/BIOS中添加。要調(diào)用NDK庫中函數(shù),需要添加以下庫:stack.lib、hal_timer_bios5.lib、hal_ser_stub.lib、hal_userled_stub.lib、os_bios5.lib、nettool.lib、netctrl.lib、miniPrintf.lib 以及板極驅(qū)動庫[3]。
在主線程中,TCP/IP協(xié)議棧需要首先進(jìn)行配置并初始化,具體步驟如下:
(1)分配一個(gè)網(wǎng)絡(luò)參數(shù)配置,主要包括主機(jī)名、IP地址、網(wǎng)關(guān)、子網(wǎng)掩碼、域名和DNS服務(wù)器地址等。
(2)調(diào)用NETCTRL庫函數(shù)NC_SystemOpen(),并用Cfg-New()函數(shù)創(chuàng)建一個(gè)新的配置。
(3)調(diào)用一個(gè)配置入口函數(shù),將第一步中分配的網(wǎng)絡(luò)參數(shù)添加進(jìn)去。如:
經(jīng)過以上步驟,TCP/IP協(xié)議棧配置完成,然后調(diào)用NC_NetStart()函數(shù)啟動網(wǎng)絡(luò)程序。注意,它的返回值是一個(gè)關(guān)閉代碼。通常該系統(tǒng)的關(guān)閉方式會決定協(xié)議棧是否重新啟動(例如改變配置后需要自動重啟),一般有以下代碼:
如果返回值大于0就重新啟動網(wǎng)絡(luò)。其中NetworkOpen函數(shù)的功能是設(shè)置網(wǎng)絡(luò)協(xié)議、連接端口號、連接數(shù)以及網(wǎng)絡(luò)連接時(shí)的回調(diào)函數(shù)??膳渲萌缦拢?/p>
在工程設(shè)計(jì)中,如果需要多線程使用網(wǎng)絡(luò)收發(fā)數(shù)據(jù),需要在線程中共享網(wǎng)絡(luò)文件描述符,這樣在新線程中可以像在網(wǎng)絡(luò)主線程中一樣使用 recv()和send()函數(shù)來收發(fā)數(shù)據(jù)。一般來說可以使用如下代碼:
另外,TI提供了 recvnc()和 recvncfrom()函數(shù),不需要拷貝數(shù)據(jù)就能直接接收,使得網(wǎng)絡(luò)接收數(shù)據(jù)速率大大提高,特別是網(wǎng)絡(luò)吞吐量比較大的應(yīng)用中效果尤為顯著。如果對發(fā)送和接收緩存區(qū)有要求,需要在網(wǎng)絡(luò)回調(diào)函數(shù)中調(diào)用setsockopt()函數(shù)進(jìn)行設(shè)置[5]。
經(jīng)過測試,基于NDK的DSP網(wǎng)絡(luò)運(yùn)行非常穩(wěn)定、速度快、占用系統(tǒng)資源較少,對于需要在DSP上發(fā)送大量數(shù)據(jù)的場合非常方便。雖然采用NDK開發(fā)DSP網(wǎng)絡(luò)有很多優(yōu)點(diǎn),但必定要占用一定的系統(tǒng)資源,并且優(yōu)先級比較高,因此實(shí)時(shí)性要求非常高的項(xiàng)目中,應(yīng)采用其他方案。
[1]Texas Instruments.Getting started with the C6000 network development kit.SPRAAX4[A].2008.
[2]劉釗江,鄭紅,吳興華,等.基于 TIC6000系列 DSP的網(wǎng)絡(luò)開發(fā)研究[J].儀器儀表用戶,2010,30(3):60-62.
[3]Texas Instruments.TI network developer′s kit(NDK)v2.21 User′s Guide.SPRU523H[A].2012.
[4]梁迅.基于NDK的DSP網(wǎng)絡(luò)編程[J].計(jì)算技術(shù)與自動化,2005,24(9):79-81.
[5]Texas Instruments.TI network developer′s kit(NDK)v2.21 API Reference Guide.SPRU524H[A].2012.