基于OMAP的嵌入式TCP/IP開(kāi)發(fā)
隨著人們對(duì)智能化產(chǎn)品需求的增加,未來(lái)的嵌入式產(chǎn)品,包括各種家電、通信、pda、儀器儀表等設(shè)備正逐漸走向網(wǎng)絡(luò)化,以共享互聯(lián)網(wǎng)中龐大的信息資源,因此使嵌入式設(shè)備的網(wǎng)絡(luò)化開(kāi)發(fā)有廣闊市場(chǎng)前景,由于嵌入式硬件資源有限,而傳統(tǒng)的tcp/ip等網(wǎng)絡(luò)通信協(xié)議對(duì)計(jì)算機(jī)存儲(chǔ)器、運(yùn)算速度的要求較高,所以不能直接應(yīng)用,為此,必須開(kāi)發(fā)一套適合嵌入式系統(tǒng)的、高度優(yōu)化的、最為精簡(jiǎn)的tcp/ip協(xié)議棧。
開(kāi)放式多媒體應(yīng)用平臺(tái)omap(open multimedia application platform)是美國(guó)德州儀器公司推出的高度集成的軟硬件平臺(tái)。omap具有獨(dú)特的雙芯結(jié)構(gòu),結(jié)合了dsp與risc內(nèi)核,可為無(wú)線多媒體設(shè)備提供獨(dú)一無(wú)二的性能和功耗優(yōu)勢(shì),omap可連接十分豐富的外圍設(shè)備,包括usb、攝像頭、聲音設(shè)備、視頻設(shè)備、網(wǎng)絡(luò)設(shè)備等,omap擁有開(kāi)放式體系結(jié)構(gòu),其應(yīng)用環(huán)境完全可編程。
軟件協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)在很大深度上決定了通信終端的質(zhì)量,基于omap的3g移動(dòng)終端軟件協(xié)議結(jié)構(gòu)由信令協(xié)議棧和應(yīng)用業(yè)務(wù)協(xié)議棧組成,如圖1所示,tcp/ip協(xié)議棧位于應(yīng)用業(yè)務(wù)協(xié)議棧的底層,為上層的h.323協(xié)議棧提供基礎(chǔ)與服務(wù),其性能質(zhì)量將直接決定整個(gè)通信終端軟件系統(tǒng)的運(yùn)行質(zhì)量。因此,針對(duì)嵌入式系統(tǒng)聯(lián)網(wǎng)的發(fā)展方向,為omap系統(tǒng)其設(shè)計(jì)一套高效、簡(jiǎn)潔的tcp/ip協(xié)議,對(duì)其應(yīng)用具有十分重要的意義。
1 開(kāi)發(fā)方案
pc上有功能強(qiáng)大的vc平臺(tái)和網(wǎng)絡(luò)分析工具(如sniffer)便于調(diào)試,其設(shè)計(jì)不針對(duì)任何一個(gè)嵌入式芯片,具有較好的通用性和可移植性,在pc機(jī)上實(shí)現(xiàn)的tcp/ip協(xié)議,除了以太網(wǎng)層要結(jié)合omap平臺(tái)的網(wǎng)卡硬件重寫外,基本上可以直接移植到omap平臺(tái)上,不需要再做大的改動(dòng),作為一個(gè)通信程序,必須需要兩端程序同時(shí)調(diào)試,在pc機(jī)上編好的程序能度omap平臺(tái)上程序的調(diào)試提供可靠的幫助,因此,協(xié)議開(kāi)發(fā)采用先模擬再移植、先整體再部分的設(shè)計(jì)思路,而協(xié)議各層實(shí)現(xiàn)的順序?yàn)樽韵露?。具體步驟是:
(1)在pc機(jī)上的windows操作系統(tǒng)及vc6.0開(kāi)發(fā)平臺(tái)上,實(shí)現(xiàn)嵌入式系統(tǒng)tcp/ip協(xié)議族的模擬器,該模擬器應(yīng)該能實(shí)現(xiàn)tcp/ip協(xié)議的基本功能,包括以太網(wǎng)驅(qū)動(dòng)程序、arp、ip、udp、tcp等,并且實(shí)現(xiàn)的arp、ip、udp、tcp層的程序應(yīng)該通用于各嵌入式系統(tǒng)并可移植。
(2)將該模擬器移植到omap開(kāi)發(fā)平臺(tái),用其以太網(wǎng)卡的驅(qū)動(dòng)程序替換原模擬器的鏈路層程序,在ti提供的ccs平臺(tái)上最終實(shí)現(xiàn)基于omap的tcp/ip協(xié)議。
2 開(kāi)發(fā)平臺(tái)
omap的多媒體開(kāi)發(fā)平臺(tái)innovator主要由4個(gè)模塊組成:pm(處理器模塊)、im(接口模塊)、m(擴(kuò)展模塊)、bob(主連接板)。omap處理器在pm上,以太網(wǎng)卡在bob上,可以通過(guò)innovator上的omap1510芯片的arm微處理器對(duì)單片以太網(wǎng)控制器lan91c96的工作進(jìn)行控制,實(shí)現(xiàn)以太網(wǎng)幀的收發(fā),并通過(guò)ccs對(duì)程序調(diào)試,圖2為omap平臺(tái)調(diào)試環(huán)境。
3 在pc上實(shí)現(xiàn)協(xié)議的基本模塊
3.1 主要模塊介紹
(1)主流程:首先對(duì)tcp/ip協(xié)議族的各層初始化,成功則進(jìn)入主循環(huán),主循環(huán)采用"中斷+循環(huán))"結(jié)構(gòu),簡(jiǎn)單且分層清晰,中斷作為應(yīng)用層發(fā)出命令,調(diào)用下層的入口。對(duì)于接收到的以太網(wǎng)幀,則由下到上分別進(jìn)入各層進(jìn)行處理。協(xié)議實(shí)現(xiàn)主流程如圖3所示。
(2)pc上的以太網(wǎng)層:在內(nèi)存中開(kāi)辟接收和發(fā)送兩個(gè)相同的循環(huán)緩沖區(qū),用于存放接收和發(fā)送的以太網(wǎng)幀。winpcap軟件是基于windows平臺(tái)的一個(gè)網(wǎng)絡(luò)包工具,它提供一個(gè)系統(tǒng)內(nèi)核級(jí)的動(dòng)態(tài)鏈接庫(kù)packet.dll作為標(biāo)準(zhǔn)的api,具有獨(dú)立于操作系統(tǒng)的編程接口。利用其提供的api可直接聯(lián)系網(wǎng)卡驅(qū)動(dòng)與已定義的循環(huán)緩沖區(qū),將緩沖區(qū)中的數(shù)據(jù)發(fā)出,并將網(wǎng)卡接收的數(shù)據(jù)存入緩沖區(qū)。
(3)arp層,在內(nèi)存中開(kāi)辟一塊循環(huán)存儲(chǔ)區(qū)域用于存放已知的ip-mac對(duì)應(yīng)表,該表可以由上層添加,在接收到arp應(yīng)答時(shí)會(huì)自動(dòng)添加,也可以上層清空。處理arp層函數(shù)的過(guò)程中:根據(jù)以太網(wǎng)首部協(xié)議字段過(guò)濾出arp包,針對(duì)arp請(qǐng)求與arp應(yīng)答進(jìn)行不同的處理,應(yīng)答對(duì)方的請(qǐng)求,記錄對(duì)方的應(yīng)答。
(4)ip層:根據(jù)以太網(wǎng)首部的幀類型標(biāo)注判斷接收到的是不是ip包來(lái)處理ip層函數(shù),如果是:則調(diào)用ip包的接收函數(shù),對(duì)給收到的ip包用各種條件進(jìn)行過(guò)濾,對(duì)于滿足條件的包獲取其長(zhǎng)度與指針信息供上層使用。本層另一個(gè)主要函數(shù)是ip包發(fā)送函數(shù),由上層調(diào)用進(jìn)行ip封裝。
ip的檢驗(yàn)和僅包括ip首部,長(zhǎng)度一般為20字節(jié)(如果沒(méi)有選項(xiàng))。在接收端,丟棄檢驗(yàn)和不為oxffff的包,在發(fā)送端,將計(jì)算所得值的反碼填入檢驗(yàn)和字節(jié),由于主機(jī)和網(wǎng)絡(luò)對(duì)數(shù)據(jù)中高低字節(jié)默認(rèn)的順序不同,在讀寫包中的16、32數(shù)據(jù)時(shí),應(yīng)該先進(jìn)行高低字節(jié)的交換。
(5)udp層,處理udp層函數(shù)應(yīng)根據(jù)ip首部的協(xié)議字段判斷是否udp包。如果是:則調(diào)用udp包接收函數(shù),用各種條件對(duì)其進(jìn)行過(guò)濾,提出udp數(shù)據(jù)及各種有用信息,根據(jù)端口號(hào)提交給應(yīng)用進(jìn)程處理,本層的另一個(gè)主要函數(shù)是udp發(fā)送函數(shù),實(shí)現(xiàn)封裝udp包(包括載入udp數(shù)據(jù),計(jì)算并填入udp首部信息),最后調(diào)用ip發(fā)送函數(shù),較由ip層處理。
(6)tcp層:與udp不同,tcp主機(jī)要進(jìn)行數(shù)據(jù)通信之前,必須與對(duì)方建立連。與幾個(gè)主機(jī)通信,就要建立幾個(gè)連接。然而,若要知道接收到的tcp包屬于哪個(gè)連接且使得幾個(gè)不同的連接之間獨(dú)立工作、互不干擾,則需要定義tcp的控制模塊,這里用一個(gè)結(jié)構(gòu)體數(shù)組實(shí)現(xiàn),存放所有關(guān)于連接的信息。
處理tcp層函數(shù),判斷接收包的類型,如果是tcp包,則調(diào)用tcp接收函數(shù),tcp接收函數(shù)用指定條件進(jìn)行過(guò)濾,找到該包所屬的連接或完成一個(gè)新連接的被動(dòng)打開(kāi),根據(jù)tcp的狀態(tài)轉(zhuǎn)換則完成11種狀態(tài)的轉(zhuǎn)移,并且實(shí)現(xiàn)了多路數(shù)據(jù)同時(shí)、雙向的傳輸。
tcp的發(fā)送函數(shù)包括主動(dòng)打開(kāi)、主動(dòng)關(guān)閉(由上層調(diào)用完成新連接的主動(dòng)打開(kāi),或主動(dòng)關(guān)閉一個(gè)已建立的連接)和發(fā)送控制包(用于tcp連接的建立與終止,會(huì)在tcp接收函數(shù)中調(diào)用,從而實(shí)現(xiàn)tcp的轉(zhuǎn)換)三個(gè)函數(shù)。
tcp層還實(shí)現(xiàn)了兩個(gè)定時(shí)器,tcp重傳定時(shí)器函數(shù)可提供服務(wù)可靠性的有效保障;tcp?;疃〞r(shí)器能夠避免資源的浪費(fèi)。
3.2 程序特點(diǎn)分析
(1)簡(jiǎn)單性:4.4bsd-lite版的完整tcp/ip內(nèi)核實(shí)現(xiàn)大約有15 000行,而本程序源代碼約有1 400行,更適合嵌入式系統(tǒng)的應(yīng)用。
(2)可重用性:本程序分層清晰。對(duì)于不同的嵌入式系統(tǒng),可能使用的cpu和以太網(wǎng)卡不同,這就需要針對(duì)其特點(diǎn)的以太網(wǎng)層設(shè)計(jì),而arp、ip、udp、tcp則不需要改動(dòng)。
(3)可拓展性:tcp/ip協(xié)議是底層網(wǎng)絡(luò)協(xié)議,本程序留有很好的接口,可在其上構(gòu)件更高層的網(wǎng)絡(luò)協(xié)議,包括h.323協(xié)議、ftp、telnet。
4 在omap平臺(tái)上的移植
4.1 單片以太網(wǎng)控制器lan91c96
lan91c96是smsc公司生產(chǎn)的專門用于嵌入式產(chǎn)品的10mbps以太網(wǎng)控制器,具有性能優(yōu)良,功耗低及尺寸小的特點(diǎn),如圖4所示。
6kb的ram:用來(lái)存放數(shù)據(jù)包。
mmu:對(duì)ram進(jìn)行有效管理,為接收和發(fā)送包在ram中分配存儲(chǔ)空間。
arbite:使mmu和ram與cpu、csma很好地連接。
csma/cd模塊:集成了ieee 802.3 mac層協(xié)議,負(fù)責(zé)監(jiān)聽(tīng)網(wǎng)絡(luò)情況和地址過(guò)濾。若目的地址是lan91c96的地址、廣播地址或多播地址,則接收此數(shù)據(jù)包,否則拋棄。
endec:負(fù)責(zé)與10mbps為以太網(wǎng)物理媒體的連接。
lan91c96采用地址映射方式,通過(guò)訪問(wèn)innovator為的指定地址對(duì)其存儲(chǔ)器訪問(wèn)。lan91c96的寄存器在innovator內(nèi)存中的地址分配為:0x08000300-0x0800030f。寄存器共有4組(bank0-bank3),使用相同的地址,通過(guò)bank_select寄存器選擇。
4.2 移植過(guò)程
先實(shí)現(xiàn)該網(wǎng)卡芯片的驅(qū)動(dòng)程序,再用它替換pc模擬器的以太網(wǎng)層,程序驅(qū)動(dòng)主要包括以下三個(gè)部分:
(1)初始化:主要為lan91c96的各寄存器填入正確的初始值使其正常工作。
(2)接收:如圖5所示,由csma(載波偵聽(tīng)模塊)接收到符合地址要求的后,mmu(存儲(chǔ)器管理單元)為其請(qǐng)求在ram中分配存儲(chǔ)空間并分配一個(gè)編號(hào),dma將其存入ram。接著在接收數(shù)據(jù)的前面封裝status的化count字節(jié)信息,如果crc檢測(cè)正確,則將其編號(hào)放入接收f(shuō)ifo,如果接收f(shuō)ifo不為空,則rcv_int(接收中斷標(biāo)識(shí))被設(shè)置。檢查接收中斷寄存器狀態(tài),如果就接收中斷,對(duì)應(yīng)其編號(hào),上層協(xié)議便可以取出數(shù)據(jù)了,取出后,將該數(shù)據(jù)編號(hào)從fifo中清除。
狀態(tài)字可以從rcr寄存器中讀取,它反應(yīng)了接收過(guò)程出現(xiàn)的各種措施,如crc錯(cuò)誤、接收幀過(guò)長(zhǎng)等,數(shù)據(jù)包的編號(hào)從fifo_ports寄存器中獲得,而數(shù)據(jù)指針可從pointer寄存器中獲得,數(shù)據(jù)信息從data寄存器中得到,根據(jù)這些信息將接收數(shù)據(jù)包復(fù)制到cpu內(nèi)存,供上層使用,接收函數(shù)的主要流程如圖6。
(3)發(fā)送:圖7描述了發(fā)送數(shù)據(jù)包fifo中的排隊(duì)過(guò)程,首先mmu在ram中分配一定字節(jié)的存儲(chǔ)空間,然后,將分配結(jié)果寄存器中的編號(hào)放入pnr寄存器,寫數(shù)據(jù)指針寄存器pointer并將上層數(shù)據(jù)封裝后拷入data寄存器,根據(jù)其編號(hào)放入發(fā)送fifo,排隊(duì)的包將自動(dòng)發(fā)出,發(fā)出包的編號(hào)接著進(jìn)入發(fā)送完成fifo。如果發(fā)送成功,則存儲(chǔ)空間自動(dòng)釋放;否則釋放存儲(chǔ)空間并將其重新排隊(duì)。
5 實(shí)驗(yàn)結(jié)果
5.1 內(nèi)存資源占用量
運(yùn)行該tcp/ip協(xié)議棧需要3mb內(nèi)存,而innovator體32mb sdram 和32mb flash,內(nèi)存占用率為:3m/64m=4.7%,完全適用于嵌入式系統(tǒng)。
5.2 數(shù)據(jù)傳輸可靠性
tcp利用以下機(jī)制糾錯(cuò)。數(shù)據(jù)的傳輸過(guò)程中的誤碼:檢驗(yàn)和機(jī)制與重傳機(jī)制,數(shù)據(jù)的重復(fù),在接收端會(huì)自動(dòng)舍棄已經(jīng)接收過(guò)的數(shù)據(jù)包,并且不發(fā)ack,故不會(huì)發(fā)生一個(gè)數(shù)據(jù)包接收多次的情況,數(shù)據(jù)包的丟失,接收端在接收完一段數(shù)據(jù)后,會(huì)計(jì)算下一個(gè)預(yù)期數(shù)據(jù)的序號(hào),如果不符合就不發(fā)ack,從而導(dǎo)致發(fā)端重發(fā),避免了數(shù)據(jù)包的丟失,經(jīng)測(cè)試,在未發(fā)生擁塞情況下,傳輸?shù)恼`碼率幾乎為0。
5.3文件最大平均傳輸速率
下面就本程序所實(shí)現(xiàn)的利用tcp進(jìn)行文件傳輸功能,給出不同情況下的最大傳輸速率,實(shí)驗(yàn)環(huán)境為10mbps以太網(wǎng)。
理想狀態(tài)下的理論最大吞吐量:假定發(fā)送方傳輸兩個(gè)背對(duì)背、滿長(zhǎng)度的tcp數(shù)據(jù),接收方為其發(fā)出兩個(gè)ack,每包中用戶數(shù)據(jù)量為1460位,總數(shù)據(jù)量為1538位,故最大的用戶數(shù)據(jù)吞吐量為:
本實(shí)驗(yàn)測(cè)得文件的平均傳輸速率隨著tcp連接數(shù)的增多有如圖8所示的曲線變化,前半段隨著連接數(shù)的增加成線性增長(zhǎng),后半段由于出現(xiàn)了網(wǎng)絡(luò)擁塞,整體的平均速率反而有所下降。
實(shí)驗(yàn)結(jié)果與理論最大吞吐量有所差距,原因在于:
(1)理論上只是一種理想的狀態(tài),現(xiàn)實(shí)中難以達(dá)到。
(2)受cpu處理速度及文件傳輸過(guò)程的讀、寫文件操作的限制。
(3)本程序采用的數(shù)據(jù)傳輸機(jī)制是當(dāng)收到上一個(gè)包的ack之后再發(fā)送下一個(gè)數(shù)據(jù)包,這樣避免了對(duì)接收數(shù)據(jù)的排序,提高了可靠性,但數(shù)據(jù)的傳輸速度會(huì)受到制約。
tcp/ip相關(guān)文章:tcp/ip是什么
評(píng)論