基于DSP的網(wǎng)絡(luò )通信程序設計
摘要:通過(guò)分析網(wǎng)卡基本通信過(guò)程控制和數字信號處理器(DSP)對網(wǎng)卡直接編程方法,成功設計基于DSP的網(wǎng)絡(luò )通信程序,從而最終實(shí)現DSP系統數字化和網(wǎng)絡(luò )化的融合。 關(guān)鍵詞:DSP 網(wǎng)絡(luò )通信程序 通信協(xié)議 網(wǎng)卡 DSP芯片是專(zhuān)門(mén)為實(shí)現各種數字信號處理算法而設計的、具有特殊結構的微處理器,其卓越的性能、不斷上升的性?xún)r(jià)比、日漸完善的開(kāi)發(fā)方式使它的應用越來(lái)越廣泛。將計算機網(wǎng)絡(luò )技術(shù)引入以DSP為核心的嵌入式系統,使其成為數字化、網(wǎng)絡(luò )化相結合,集通信、計算機和視聽(tīng)功能于一體的電子產(chǎn)品,必須大大提升DSP系統的應用價(jià)值和市場(chǎng)前景。將DSP技術(shù)與網(wǎng)絡(luò )技術(shù)相結合,必須解決兩個(gè)關(guān)鍵問(wèn)題:一是實(shí)現DSP與網(wǎng)卡的硬件接口技術(shù),二是基于DSP的網(wǎng)絡(luò )通信程序設計。DSP與網(wǎng)卡的硬件接口技術(shù)參考文獻[1]有比較詳盡的論述,以下主要討論基于DSP的網(wǎng)絡(luò )通信程序設計。 1 通信協(xié)議的制定 協(xié)議是用來(lái)管理通信的法規,是網(wǎng)絡(luò )系統功能實(shí)現的基礎。由于DSP可以實(shí)現對網(wǎng)卡的直接操作,對應于OSI網(wǎng)絡(luò )模型,網(wǎng)卡包含了物理層和數據鏈路層的全部?jì)热?,因此,規定了數據鏈路層上數據幀封裝格式,就可以為基于DSP的局域網(wǎng)絡(luò )中任意站點(diǎn)之間的通信提供具體規范。因為以太網(wǎng)是當今最受歡迎的局域網(wǎng)之一,在以太網(wǎng)中,網(wǎng)卡用于實(shí)現802.3規程,其典型代表是Novell公司的NE2000和3COM公司的3C503等網(wǎng)卡,所以研究工作中的具體試驗平臺是以DSP為核心構成的以太局域網(wǎng),主要用于語(yǔ)音的實(shí)時(shí)通信,所使用的網(wǎng)卡為Novell公司的NE2000網(wǎng)卡。NE2000網(wǎng)卡的基本組成請見(jiàn)參考文獻[2],其核心器件是網(wǎng)絡(luò )接口控制器(NIC)DP8390。該器件有三部分功能:第一是IEEE802.3MAC(媒體訪(fǎng)問(wèn)控制)子層協(xié)議邏輯,實(shí)現數據幀的封裝和解封,CSMA/CA(帶碰撞檢測功能的載波偵聽(tīng)多址接入)協(xié)議以及CRC校驗等功能;第二是寄存器堆,用戶(hù)對NE2000網(wǎng)卡通信過(guò)程的控制主要通過(guò)對這些寄存器堆中各種命令寄存器編程實(shí)現;第三是對網(wǎng)卡上緩沖RAM的讀寫(xiě)控制邏輯。DP8390發(fā)送和接收采用標準的IEEE802.3幀格式。IEEE802.3參考了以太網(wǎng)的協(xié)議和技術(shù)規范,但對數據包的基本結構進(jìn)行了修改,主要是類(lèi)型字段變成了長(cháng)度字段。所以,以DSP為核心的局域網(wǎng)內通信數據包基本格式如圖1所示。 DSP讀出數據包和打包從目的地址開(kāi)始。目的地址用來(lái)指明一個(gè)數據幀在網(wǎng)絡(luò )中被傳送的目的節點(diǎn)地址。NE2000支持3種目的地址:?jiǎn)蔚刂?、組地址及廣播地址。單地址表示只有1個(gè)節點(diǎn)可以接收該幀信息;組地址表示最多可以有64個(gè)字節接收同一幀信息;而廣播地址則表示它可以被同一網(wǎng)絡(luò )中的所有節接收。源地址是發(fā)送幀節點(diǎn)的物理地址,它只能是單地址。目的地址和源地址指網(wǎng)卡的硬件地址,又稱(chēng)物理地址。 在源地址之后的2個(gè)字節表示該幀的數據長(cháng)度,只表示數據部分的長(cháng)度,由用戶(hù)自己填入。數據字段由46~1500字節組成。大于1500字節的數據應分為多個(gè)幀來(lái)發(fā)送;小于46字節時(shí),必須填充至46字節。原因有兩個(gè):一是保證從目的地址字段到幀校驗字段長(cháng)度為64字節的最短幀長(cháng),以便區分信道中的有效幀和無(wú)用信息;二是為了防止一個(gè)站發(fā)送短幀時(shí),在第一個(gè)比特尚未到達總線(xiàn)的最遠端時(shí)就完成幀發(fā)送,因而在可能發(fā)生碰撞時(shí)檢測不到?jīng)_突信號。NE2000對接收到的從目的地址字段后小于64字節的幀均認為是“碎片”,并予以刪除。在數據字段,根據系統的具體功能要求,用戶(hù)可以預留出若干個(gè)字節以規定相應的協(xié)議,以便通信雙方依據這些字節中包含的信息實(shí)現不同的功能。 2 基于DSP的網(wǎng)絡(luò )通信程序設計 如果基于網(wǎng)絡(luò )操作系統,用戶(hù)可以利用一些軟件對網(wǎng)絡(luò )操作系統的支持,很容易地編寫(xiě)出優(yōu)秀的網(wǎng)絡(luò )通信程序,但這些程序必須依附于網(wǎng)絡(luò )操作系統。而在DSP環(huán)境下,必須深入了解網(wǎng)絡(luò )接口控制器(NIC)的工作原理[2],通過(guò)對網(wǎng)絡(luò )直接編程,實(shí)現局域網(wǎng)內任意站點(diǎn)之間的通信而完全拋開(kāi)網(wǎng)絡(luò )操作系統。 DSP對網(wǎng)卡的通信過(guò)程控制就是DSP對DP8390中各種寄存器進(jìn)行編程控制,完成數據分組的正確發(fā)送和接收。DP8390的所有內部寄存器都是8位,映像到4個(gè)頁(yè)面。每個(gè)頁(yè)面有16個(gè)可供讀寫(xiě)的寄存器地址(RA=00H~0fH)。頁(yè)面的選擇由命令寄存器CA控制。第0頁(yè)寄存器用于收發(fā)過(guò)程,第1頁(yè)寄存器主要用于DP8390的初始化,第2頁(yè)寄存器則用于環(huán)路診斷。DSP對寄存器的操作是將寄存器作為DSP的端口設備,其實(shí)際物理端口地址(PPA)為網(wǎng)卡基本I/O端口地址(BIOA)與寄存器地址(RA)之和(即PPA=BIOA+RA)。應注意的是,PPA與寄存器間并不存在一一對應關(guān)系,對PPA的讀操作與寫(xiě)操作并不一定是對同一寄存器進(jìn)行的,這種情況在第0頁(yè)尤其明顯。用戶(hù)數據分組在DSP和網(wǎng)卡交互是通過(guò)網(wǎng)卡的數據端口實(shí)現的,既可以用DMA方式也可以用PIO方式讀入數據分組或將數據分組送至網(wǎng)卡RAM緩沖區。在本系統中,DSP采用DMA方式對網(wǎng)卡進(jìn)行數據讀寫(xiě)。網(wǎng)卡的數據端口地址(NDPA)為網(wǎng)卡基本I/O地址(BIOA)加偏移地址10H(即NDPA=BIOA+10H)。 網(wǎng)卡通信過(guò)程控制可分為網(wǎng)卡初始化、接收控制和發(fā)送控制。下面分別予以討論。 2.1 網(wǎng)卡初始化 網(wǎng)卡初始化的主要任務(wù)是設置所需的寄存器狀態(tài),確定發(fā)送和接收條件,并對網(wǎng)卡緩沖區RAM進(jìn)行劃分,建立接收和發(fā)送緩沖環(huán)。具體過(guò)程請參閱參考文獻[2]。需要說(shuō)明的是,每一塊網(wǎng)卡被賦予一個(gè)物理地址,以便通信站點(diǎn)的標識。這個(gè)物理地址存在網(wǎng)卡的PROM(存儲地址為0000~0005H)六個(gè)單元中,在網(wǎng)卡初始化時(shí),通過(guò)遠程DMA讀入DSP內存中,并送入網(wǎng)卡物理地址寄存器。在一步的意義在于:一方面,如果能正確讀出網(wǎng)卡的物理地址,則說(shuō)明網(wǎng)卡硬件基本沒(méi)有問(wèn)題,網(wǎng)卡的上電復位和DSP對網(wǎng)卡的初始化順利通過(guò);另一方面,這個(gè)物理地址可以用于DSP網(wǎng)絡(luò )系統中的點(diǎn)名、包的過(guò)濾丟棄等服務(wù),也就是說(shuō),在鏈路層根據數據幀攜帶的源地址和目的地址確定數據報從哪里來(lái),是否接收或丟棄。網(wǎng)卡初始化時(shí)另一個(gè)重要的工作就是接收緩沖環(huán)的設置,為了有效利用緩沖區,NIC將接收緩沖區RAM構成環(huán)形緩沖結構,如圖2所示。 2.2 接收控制過(guò)程 DSP完成對DP8390的初始化后,網(wǎng)卡就處于接收狀態(tài),一旦收到分組,就自動(dòng)執行本地DMA,將NIC中FIFO數據送入接收緩沖環(huán),然后向主機申請“數據分組接收到”中斷請求。DSP如果響應中斷,則啟動(dòng)網(wǎng)卡遠程DMA讀,將網(wǎng)卡緩沖區中的數據分組讀入學(xué)生機存儲區,然后對接收緩沖環(huán)CURR、NEXTPK、BNRY指針內容進(jìn)行修改,以便網(wǎng)卡能從網(wǎng)上正確接收后續分組。DSP響應網(wǎng)卡接收中斷后,接收控制過(guò)程如下: ①設置遠程DMA的起始地址;RSAR0=00H,RSAR1=Nextpk。 ②設置遠程DMA操作的字節數,這個(gè)長(cháng)度在46~1500字節范圍內根據具體要求自己確定。 ③0AH送命令寄存器CR,啟動(dòng)遠程DMA讀。 ④從網(wǎng)卡數據端口依序讀入數據分組,注意,最先讀入的4字節非數據分組內容,第1字節為接收狀態(tài),第2字節為下一包頁(yè)地址指針,3與4字節為接收字節數。第2字節內容應該送入Nextpk,其它字節根據用戶(hù)要求處理。 ⑤修改邊界指針BNRY=Nextpk-1。 ⑥清除遠程DMA字節數寄存器RBCR0和RBCR1。 2.3 發(fā)送控制過(guò)程 DSP先執行遠程DMA寫(xiě)操作,將內存中的數據分組傳至網(wǎng)卡發(fā)送緩沖區,然后啟動(dòng)發(fā)送命令進(jìn)行數據分組發(fā)送。發(fā)送控制過(guò)程如下: ①設置遠程DMA的起始地址為網(wǎng)卡發(fā)送緩沖區起始地址; ②設置遠程DMA操作的字節數; ③12H送命令寄存器CR,啟動(dòng)遠程DMA寫(xiě); ④依序送出數據分組至網(wǎng)卡發(fā)送緩沖區; ⑤清除遠程DMA字節數寄存器; ⑥設置發(fā)送字節數寄存器TBCR0和TBCR1; ⑦12H送命令寄存器CR,啟動(dòng)數據分組發(fā)送。 3 發(fā)送方發(fā)送頻率的控制 發(fā)送方發(fā)送頻率的正確控制主要保護兩點(diǎn):一是有一個(gè)最小發(fā)送時(shí)間間隔,否則會(huì )因為接收方不能及時(shí)接收而導致系統癱瘓;二是發(fā)送頻率能夠足具體的功能實(shí)現要求。譬如在語(yǔ)音的實(shí)時(shí)通信中,發(fā)送頻率就取決于聲卡的采樣頻率。在8kHz采樣頻率時(shí),聲卡每秒鐘采樣8000字節,采用1024字節需用時(shí)128ms,如果通信協(xié)議規定發(fā)送1次傳送1024字節有效數據,則必須每128ms發(fā)送一次才能保證緩沖區有新數據待發(fā)送,也才能保證接收方有新數據播放。128ms是一個(gè)理論計算數值,在實(shí)際的操作中采樣速度和發(fā)送頻率之間總是不能完全匹配,而存放數據的緩沖區大小是有限的,如果沒(méi)有良好的控制技巧來(lái)實(shí)現正確發(fā)送,就會(huì )造成聲音抖動(dòng)和延時(shí)。解決的辦法是雙緩沖技術(shù)和雙指針控制,并且根據采樣速度和發(fā)送頻率之間的匹配情況送入不同的發(fā)送通信進(jìn)行處理后發(fā)送。正確發(fā)送的含義有兩方面,一是每次發(fā)送的都是新數據,二是能滿(mǎn)足接收方總在播放新數據的需求。 4 接收方防止數據包的丟失 由于DSP通過(guò)中斷請求判斷是否有數據分組到來(lái),如果中斷繁忙而兩個(gè)數據包到來(lái)時(shí)間相差非常短,DSP有可能只響應一次中斷,從而導致丟包的發(fā)生。分析網(wǎng)卡接收數據過(guò)程,當網(wǎng)卡收到數據分組時(shí),首先執行本地DMA,將NIC中FIFO數據送入接收緩沖環(huán),并將本地DMA操作的起始地址存放在當前頁(yè)寄存器(CURR)和當前本地DMA寄存器(CLDA0、CLDA1)中,DSP從網(wǎng)卡接收緩沖環(huán)讀出數據到存儲器則稱(chēng)遠程DMA操作,用軟件指針Nextpk來(lái)指示遠程DMA的起始頁(yè)面。因此通過(guò)比較網(wǎng)卡本地DMA和遠程DMA的當前地址,即在中斷服務(wù)子程序中比較CURR和Nextpk指針,或比較CLDA0、CLDA1和Nextpk指針,就可以保證當前數據分組放到了哪里就讀出到哪里,從而防止丟包的發(fā)生。 5 結論 DSP對網(wǎng)卡通信過(guò)程控制的實(shí)現解決了DSP網(wǎng)絡(luò )中任意站點(diǎn)之間,DSP網(wǎng)絡(luò )與PC機之間準確、高速的實(shí)時(shí)通信問(wèn)題,是將網(wǎng)絡(luò )技術(shù)應用到DSP數字化系統中的關(guān)鍵,從而最終實(shí)現了以DSP為核心的處理系統數字化和網(wǎng)絡(luò )化的融合。 | |
評論