基于DSP的上網方案的軟硬件設計與實現(xiàn)
1 硬件設計
DSP與網卡的硬件接口電路圖如圖1所示。
DSP的數(shù)據(jù)總線低16位接ISA網卡的16位數(shù)據(jù)線,ISA網卡的IOCS16線接高電平,設置網卡為16位的模式。
網卡共有20根地址線。將A7~A8、A10~A19接地,A0~A6和A9分別接DSP的A0~A7,用到的網卡地址為0240H~025FH,映射到DSP的Page3空間,地址映射為C000C0H~C000DFH。
DSP的Reset信號用于復位網卡,由于DSP的Reset信號低有效,而網卡的Reset信號高有效,故中間應接非門。
DSP的Page3和R/W信號用于選通網卡的讀寫信號IOR、IOW,實現(xiàn)的邏輯關系如圖2所示。
IRQ9是網卡的中斷9,通過非門后接DSP的INT1引腳。
RTL8019網卡有三種工作方式:
第一種為跳線方式,網卡的I/O和中斷由跳線決定;
第二種為即插即用方式,由軟件進行自動配置plug and play;
第三種為免跳線方式,網卡的I/O和中斷由外接的93C46里的內容決定。
計算機上一般實現(xiàn)的是即插即用方式,為了降低軟件編程的復雜度,將網卡設置為跳線方式。
上述所有的譯碼邏輯都在EPM7128中實現(xiàn)。
74ALVC164245是總線驅動芯片,可實現(xiàn)3.3V到5V的電平轉換。由于TMS320VC33和EPM7128是3.3V的器件,而ISA總線是5V的,所以信號線不能直接連接,需要通過74ALVC164245進行電平轉換和隔離。
2 軟件設計
2.1 網卡硬件驅動程序的設計
網卡驅動程序主要包括以下幾部分:
(1)NIC的初始化
NIC是網絡接口控制芯片,它負責網絡上數(shù)據(jù)的接收和發(fā)送。為了能夠使NIC啟動并處于準備接收或準備發(fā)送數(shù)據(jù)的狀態(tài),必須對相關的寄存器進行初始化。這些寄存器包括CR、DCR、RBCR、PSTART、PSTOP、ISR、IMR、PAR0~PAR5、MAR0~MAR7、CURR、TCR、RCR等。
(2)中斷服務程序
中斷服務程序一般完成兩項任務:一是設置中斷標志,以使相關程序能以此發(fā)現(xiàn)發(fā)生了中斷;二是取得中斷狀態(tài)寄存器的值,并將引起中斷的具體原因提交給相應的程序,這一過程也是通過設置中斷原因標志完成的。需要注意的是,中斷服務程序開始的時候要保護中斷現(xiàn)場,待程序處理完成后要恢復中斷現(xiàn)場;中斷服務程序應盡可能短小,以便在盡可能短的時間內執(zhí)行完成,因此需要將一些不必要的工作交給其它程序來完成。
(3)幀發(fā)送程序
在網絡中,幀傳輸?shù)倪^程是:發(fā)送方將待發(fā)送的數(shù)據(jù)按幀格式要求封裝成幀,然后通過網卡將幀發(fā)送到網絡的傳輸線上;接收方根據(jù)接收到的幀的目的地址確定是否將該幀提交給上層應用程序。幀的發(fā)送是指將待發(fā)送的數(shù)據(jù)以幀的形式發(fā)送到網絡傳輸線上,因此,幀的發(fā)送過程應該包括以下幾個步驟:
①裝幀;
②將幀送入NIC的發(fā)送緩沖區(qū);
③初始化發(fā)送控制寄存器;
④啟動NIC將該幀發(fā)送到網絡傳輸線上。
(4)幀接收程序
幀接收是指將網絡上的數(shù)據(jù)幀接收并緩存于網卡的接收緩沖環(huán)中,然后由主機程序將緩存于接收緩沖環(huán)的幀讀走并存入內存中以備程序使用。從中可以看出,幀的接收過程分成兩步:
①第一步由NIC通過本地DMA將幀存入接收緩沖環(huán);
②第二步是通過遠程DMA并在主機的配合下將接收緩沖環(huán)中的幀讀入內存。
2.2 TCP/IP協(xié)議的實現(xiàn)
2.2.1 DSP中與PC機中實現(xiàn)TCP/IP協(xié)議的不同
TCP/IP協(xié)議最先是在UNIX系統(tǒng)中實現(xiàn)的,后來在LINUX、DOS和WINDOWS系統(tǒng)中也實現(xiàn)了TCP/IP。但是,在UNIX上實現(xiàn)的TCP/IP協(xié)議的源代碼并不能直接移植到DSP上來,這是因為PC機和DSP存在著巨大的差異。
PC機的運算速度非???一般都有一個多任務的操作系統(tǒng),可以多任務并行執(zhí)行,通過硬中斷與軟中斷、消息隊列和各種插口實現(xiàn)TCP/IP各協(xié)議層之間的通信和整個網絡的通信。而DSP運行速度相對較慢,缺乏多任務操作系統(tǒng)的平臺,只能通過順序執(zhí)行加硬件中斷的方式來實現(xiàn),并且因其還要同時執(zhí)行數(shù)據(jù)采集、串口中斷等任務,所以中斷程序應盡量短,只完成設置各種狀態(tài)的標志位,而將相對較慢的網絡數(shù)據(jù)包的處理放在主程序中執(zhí)行,以減少各種任務之間的沖突。
PC機的內存非常大,現(xiàn)在一般都可達到32~128M的存儲容量,可以動態(tài)地分配和釋放內存,很容易實現(xiàn)存儲器緩存mbuf、網絡控制塊ncb等鏈狀結構,且可隨意增刪;同時能維持多條網絡連接,由于計算機處理速度快,幾乎不用考慮緩沖區(qū)溢出的問題。而DSP內部RAM一般只有十幾K,加上外部擴展的RAM也只能達到幾十K的容量,一個最大的以太網數(shù)據(jù)包就有1.5K左右,如果也按PC機的內存管理方式和數(shù)據(jù)結構,使用mbuf鏈,RAM肯定不夠用,因此只能在RAM中分配一個固定的1514字節(jié)的區(qū)段來存放接收到的以太網數(shù)據(jù)包,接收一包處理一包。
PC機中TCP/IP協(xié)議都是分層次實現(xiàn)的,相互之間都是通過參數(shù)傳遞進行聯(lián)系,這樣有利于提高程序的模塊化和獨立性。而在DSP中,由于參數(shù)傳遞會占用過多的程序空間,且降低DSP的執(zhí)行速度,所以應盡量減少參數(shù)傳遞,轉而使用全局變量和外部變量等來達到值的傳遞,因此各程序間的依賴程度大,往往會共享某一些變量和數(shù)據(jù)。
PC機上實現(xiàn)了比較完整的TCP/IP協(xié)議。而在DSP中,由于運算速度和內存的限制,不可能支持所有的協(xié)議,一般只實現(xiàn)需要的部分,不需要的協(xié)議一概都不支持;而且即使需要的協(xié)議也不用像在PC機上實現(xiàn)那么復雜,可以根據(jù)硬件的具體情況和實現(xiàn)的需求進行必要的簡化。
2.2.2 TCP/IP協(xié)議的具體實現(xiàn)
TCP/IP協(xié)議是一個協(xié)議簇,包含了很多協(xié)議,在DSP上實現(xiàn)的所有協(xié)議如圖3所示,通??煞譃樗膶?不包括物理層)。
根據(jù)DSP的結構特點和所需要實現(xiàn)的功能,在DSP中實現(xiàn)了ARP(地址解析協(xié)議)、IP(網際協(xié)議)、ICMP(Internet控制報文協(xié)議)、UDP(用戶數(shù)據(jù)報協(xié)議)和TCP(傳輸控制協(xié)議),并對它們進行了簡化。
在鏈路層中實現(xiàn)了ARP。每種網絡都有自己的尋址機制,以太網是通過以太網地址即通常所說的網卡硬件地址MAC進行尋址的,每個網卡出廠時都有一個唯一的MAC地址。IP地址則僅僅是對于TCP/IP協(xié)議簇有意義的地址,是一種虛擬地址。當賦予IP地址的IP包要在以太網中傳播時,必須將IP地址轉化為以太網地址才能進行正確的傳輸。ARP協(xié)議就是將32位的IP地址動態(tài)地映射為48位的以太網地址,從而保證網絡的正確傳輸。ARP協(xié)議由兩個文件arpin.c和arpout.c實現(xiàn)。arpin.c負責接收網絡上廣播的arp包,判斷arp包的類型是網絡上其它機子的請求包還是返回本機的響應包,判斷其合法性并進行相應的處理;arpout.c負責主機向網絡發(fā)送數(shù)據(jù)報時發(fā)送arp請求包以及被arpin.c調用響應收到的arp請求包。
在網絡層中實現(xiàn)了IP和ICMP。IP協(xié)議是TCP/IP協(xié)議簇中最核心的協(xié)議,它提供無連接的數(shù)據(jù)報傳送服務,所有上層協(xié)議都要以IP數(shù)據(jù)包格式傳輸。IP協(xié)議由兩個文件ipin.c和ipout.c實現(xiàn)。ipin.c負責接收IP數(shù)據(jù)包,收到IP包后,首先判斷其版本號、數(shù)據(jù)長度、目的地址、檢驗和是否正確,再根據(jù)IP首部的協(xié)議類型字段的值交給相應的上層協(xié)議處理;ipout.c負責發(fā)送IP數(shù)據(jù)包,接收上層協(xié)議傳遞下來的數(shù)據(jù),加上20字節(jié)的IP首部,正確設置源IP地址和目的IP地址、協(xié)議類型,計算檢驗和,交給下面的鏈路層發(fā)送。PC機上的IP數(shù)據(jù)包,當它的長度超過網絡的MTU時,允許對它分段;在DSP中,則不支持IP數(shù)據(jù)包分段,也不支持IP選項字段。ICMP協(xié)議負責傳遞差錯報文以及其它需要注意的信息,且由ICMP首部8位的類型字段和8位的代碼字段決定信息的種類。在DSP中只實現(xiàn)了對回顯請求(類型代碼為80)報文的處理,從IP層收到ICMP包后,判斷其類型代碼段是否為80。如果是,將這兩個字段設置為00(回顯應答),計算檢驗和,再交給IP層發(fā)送;如果不是,則予以丟棄。從而實現(xiàn)了對ping功能的支持。
在運輸層實現(xiàn)了UDP和TCP。
UDP協(xié)議是一種面向無連接的不可靠的協(xié)議,用兩個文件udpin.c和udpout.c來實現(xiàn)。udpin.c實現(xiàn)對udp包輸入的處理,判斷其端口號、檢驗和是否正確,正確則將其數(shù)據(jù)交給相應端口的應用程序,不正確則丟棄;udpout.c實現(xiàn)對udp包輸出的處理,從應用程序接收數(shù)據(jù),設置相應的源端口號和目的端口號,再交給IP層發(fā)送。值得注意的是,計算UDP包的檢驗和與計算IP包的檢驗和是不一樣的,IP包的檢驗和只覆蓋了IP包的首部,而UDP包的檢驗和則覆蓋了UDP包的首部和所有的數(shù)據(jù)。UDP包計算檢驗和時還引入了一個12字節(jié)的偽首部,包括4字節(jié)的源IP地址、4字節(jié)的目的IP地址、1字節(jié)的零段、1字節(jié)的協(xié)議段和兩字節(jié)的檢驗和,其目的是讓UDP兩次檢查數(shù)據(jù)是否正確地到達了目的地。
TCP協(xié)議與UDP協(xié)議雖然同是運輸層協(xié)議,但是它提供一種面向連接的可靠的字節(jié)流服務。TCP協(xié)議是所有協(xié)議中最復雜、也是最難實現(xiàn)的一塊,主要由tcpin.c、tcpout.c、tcptimer.c和tcpstatem.c四個文件分塊實現(xiàn),并根據(jù)具體應用的需要進行簡化。TCP的控制塊tcb用結構體來實現(xiàn),每一個tcb包含一條TCP連接的所有控制和狀態(tài)信息,全部的tcb形成了一個雙向鏈表,有利于在所有TCP連接中進行搜索。tcptimer.c負責管理TCP協(xié)議中的各種狀態(tài)信息,它內含前向后向指針,使之形成定時器超時,PC機上的TCP協(xié)議包含快慢兩個定時器,這里僅僅實現(xiàn)了一個500ms的慢速定時器,因為沒有快速定時器,所以不支持ACK報文延遲,收到一幀即立即發(fā)送ACK;tcpstatem.c是TCP的狀態(tài)機函數(shù),根據(jù)TCP連接所處的不同狀態(tài)以及發(fā)生的事件來決定TCP連接的狀態(tài)變遷;tcpout.c負責tcp報文的發(fā)送,典型的發(fā)送過程是當接收到上層應用程序的數(shù)據(jù)時,首先發(fā)送SYN幀,與目標節(jié)點三次握手建立連接,之后加上TCP首部,交給下層IP模塊發(fā)送,并通過重傳定時器實現(xiàn)超時重發(fā)、持續(xù)定時器發(fā)送窗口探測幀等功能,待所有數(shù)據(jù)發(fā)送完畢并得到確認后發(fā)送FIN幀,通過四次握手關閉連接,tcpout.c還可在不同狀態(tài)和事件下被其它程序調用發(fā)送ACK幀、RST幀等其它TCP報文;tcpin.c負責接收從下層IP模塊接收到的TCP數(shù)據(jù)包,并根據(jù)TCP連接的狀態(tài)信息以及TCP首部的各個標志位進行分支處理,將數(shù)據(jù)交給對應端口的上層應用程序,并調用其它函數(shù)實現(xiàn)對TCP包的響應和狀態(tài)變遷。在PC機上往往可以同時維護多條TCP連接;但在DSP上,由于DSP速度和RAM容量的限制,只支持一條TCP連接;這樣大大簡化了程序的復雜度,同時也滿足了實際需要,如果今后有需要,還可以進行擴展。
綜上所述,TCP/IP協(xié)議的具體處理流程如圖4所示。
本文通過DSP與網卡的硬件接口的設計及編程,使DSP實現(xiàn)了基于以太網的TCP/IP通信,從而使DSP可以通過網線進行聯(lián)網,并可以實時地與計算機進行通信,交換大量的數(shù)據(jù)和控制信息。本文所介紹的技術已經在作者參加的國家“973”項目“復雜自然環(huán)境時空定量信息的獲取與融合處理的理論與應用”的硬件設計中得到應用,并運行良好。