新聞中心

EEPW首頁 > 嵌入式TCP/IP的優(yōu)化設(shè)計(jì)與硬件實(shí)現(xiàn)

嵌入式TCP/IP的優(yōu)化設(shè)計(jì)與硬件實(shí)現(xiàn)

——
作者: 時間:2007-04-23 來源: 收藏
提出一種系統(tǒng)中實(shí)現(xiàn)TCP/IP的解決方案。通過優(yōu)化設(shè)計(jì)清晰的TCP/IP和應(yīng)用層接口、防止多余的內(nèi)存拷貝和實(shí)現(xiàn)數(shù)據(jù)包整序重發(fā)及窗口控制,分析在系統(tǒng)上實(shí)現(xiàn)TCP/IP的速度、程序大小、內(nèi)存大小以及編譯囂等特點(diǎn),并針對這些特,最提出實(shí)現(xiàn)TCP/IP的技巧和方法。
     隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)和電子信息技術(shù)的迅猛發(fā)展,Internet的使用越來越普及,信息家電和智能儀表等能夠接入Iriternet的非PC設(shè)備越來越多,將各類電子設(shè)備接入Internet的需求也越來越大。
   
     電子設(shè)備接入Internet。有多種解決方案:在51系列單片機(jī)上運(yùn)行經(jīng)過裁剪的TCP/IP協(xié)議棧;使用一些ASIC實(shí)現(xiàn)TCP/IP的芯片,如Analog Devices推出的Internet Modem;也可使用操作系統(tǒng)自帶的TCP/IP協(xié)議棧。在某些對網(wǎng)絡(luò)速度要求不高的領(lǐng)域,可用單片機(jī)實(shí)現(xiàn)TCP/IP;在對性能要求高的場合,可選擇后兩種方案。
 
     1 嵌入式TCP/IP的硬件結(jié)構(gòu)
   
      圖1是嵌入式TCP/IP系統(tǒng)的硬件結(jié)構(gòu)。其中CS8900A是Cirrus Logic的網(wǎng)絡(luò)控制器,芯片內(nèi)部已設(shè)置幀過濾器自動拋棄無效幀,減輕CPU負(fù)荷,提高CPU對網(wǎng)絡(luò)的訪問效率。CS8900A工作機(jī)制主要是通過設(shè)置好其內(nèi)部各寄存器的值,然后就可以自動開始工作。在網(wǎng)絡(luò)接口部分,由于是RJ45接口,所以須使用E2023傳輸線變壓器對網(wǎng)絡(luò)中的信號進(jìn)行轉(zhuǎn)換。

     通常TCP/IP協(xié)議棧需要大量的RAM來存儲需要被應(yīng)答的TCP包。如果在規(guī)定時間內(nèi)未被應(yīng)答,則重發(fā)該TCP包;被應(yīng)答以后釋放。為了減小RAM的使用量,當(dāng)數(shù)據(jù)包需要重新發(fā)送時,如果能夠重新產(chǎn)生數(shù)據(jù)包所需的數(shù)據(jù),則可不存儲需要被應(yīng)答的TCP包。
   
     因?yàn)榫W(wǎng)絡(luò)中數(shù)據(jù)非常多,如果把所有的數(shù)據(jù)都讀到內(nèi)存中再判斷是否應(yīng)丟棄幀,則顯然效率不高。所以邊讀取數(shù)據(jù)邊判斷而沒有一開始就把整個幀全部讀到內(nèi)存中。在程序里定義了幀中各部分的相對地址,可以方便地對幀的各字節(jié)尋址。這樣的設(shè)計(jì)是基于提高訪問速度考慮的。
   
     在CPU中幀的存放方式,定義PacketRAM變量為存放幀的首地址。圖2給出了CPU中的內(nèi)存劃分,以及內(nèi)存中幀的各個字節(jié)的定義和相對位置。
 

     2 嵌入式TCP/IP的優(yōu)化設(shè)計(jì)
   
  TCP/IP一般采用C語言或混合匯編。使用可重入函數(shù)和一般指針(gellerc pointer)使得程序代碼增大,運(yùn)行速度降低;使用函數(shù)指針時,需要手動重建調(diào)用樹(calltree),或?qū)⒑瘮?shù)指針調(diào)用的函數(shù)設(shè)置為可重入函數(shù)。
 
  2.1 嵌入式TCP/IP輸入輸出流程
   
   與PC機(jī)TCP/IP協(xié)議一樣,嵌入式采用協(xié)議分層的結(jié)構(gòu):應(yīng)用層、TCP層、IP層和網(wǎng)絡(luò)設(shè)備接口層。圖3描述了輸入和輸出數(shù)據(jù)包的流程以及需要調(diào)用的函數(shù)。

 
     輸出時,TCP層先查看unsend隊(duì)列,發(fā)現(xiàn)非空,將數(shù)據(jù)包插入隊(duì)列;發(fā)現(xiàn)為空,則查看對方窗口是否夠大(能夠接收這個數(shù)據(jù)包)。然后,填寫TCP頭部信息。IP層選擇網(wǎng)絡(luò)設(shè)備接口,目的IP和該接口的子網(wǎng)掩碼相“與”是否等于子網(wǎng)掩碼,然后調(diào)用這個接口的Output函數(shù)來發(fā)送。
   
  輸入時,Timer()函數(shù)調(diào)用每個接口的Input函數(shù)。IP層判斷IP版本、IP校驗(yàn)和,以及是否應(yīng)轉(zhuǎn)發(fā)數(shù)據(jù)包,然后根據(jù)IP頭部的protocol字段將包傳給相應(yīng)的高層處理。TCP層,須判斷TCP校驗(yàn)和,并在現(xiàn)有的套接字中查找,判斷是否有套接字可接收這個數(shù)據(jù)包,判斷TCP序號是否為希望的,然后更新這個連接的狀態(tài)(包括釋放被應(yīng)答的數(shù)據(jù)包和TCP狀態(tài)機(jī)的轉(zhuǎn)化等),調(diào)用該套接字的回調(diào)函數(shù)recv。
 
  2.2 嵌入式TCP/IP的程序結(jié)構(gòu)
   
  Tliner函數(shù)功能是調(diào)用TCPTimer處理TCP數(shù)據(jù)包的重發(fā)等功能,調(diào)用每個接口的Input函數(shù)接收到達(dá)的數(shù)據(jù)包。Timer函數(shù)必須在短時間(一般為20ms)內(nèi)被調(diào)用一次,否則接收數(shù)據(jù)包和TCP定時等功能將停止。

     如圖4所示,程序主流程是一個大循環(huán),在循環(huán)中處理發(fā)送數(shù)據(jù)包等應(yīng)用層協(xié)議的同時,查詢變量bTimeOut,在定時中斷中將bTimerOut設(shè)置為真。應(yīng)用層在程序流程中反復(fù)查詢bTimerOut是否為真,若為真則調(diào)用Timer(),然后設(shè)置bTimerOut為假。
 
     在使用嵌入式操作系統(tǒng)時,還要注意網(wǎng)絡(luò)設(shè)備驅(qū)動函數(shù)被重入的問題。以NE2K的以太網(wǎng)卡為例,拷貝數(shù)據(jù)包到網(wǎng)卡緩存前要先設(shè)置寄存器(如起始地址)。如果設(shè)置完寄存器以后中斷發(fā)生且放重入。則寄存器的設(shè)置被修改,中斷返回以后拷貝將出錯。
 
  2.3 嵌入式TCP/IP運(yùn)行速度優(yōu)化
   
  TCP/IP發(fā)送過程中主要的運(yùn)算量集中在3部分:應(yīng)用程序?qū)?shù)據(jù)拷貝到RAM;計(jì)算TCP校驗(yàn)和;將RAM中的數(shù)據(jù)包拷貝到網(wǎng)絡(luò)設(shè)備的發(fā)送緩沖區(qū)。對于每個字節(jié)數(shù)據(jù),兩次拷貝大致共使用12 linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

tcp/ip相關(guān)文章:tcp/ip是什么




關(guān)鍵詞: TCP/IP 嵌入式

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉