輕量級TCP/IP協(xié)議棧OpenTCP的移植與應用
引 言
本文引用地址:http://m.butianyuan.cn/article/82698.htm隨著工業(yè)控制和計算機技術的發(fā)展,對數據的傳輸提出了更高的要求,各種總線技術的發(fā)展日新月異。其中,采用以太網技術完成數據的遠程通信并連入Internet,已經成為工業(yè)和家用領域的重要發(fā)展方向,將來幾乎所有上業(yè)設備和家電均需要具有Internet連接能力。目前,以MCU等構成的嵌入式系統(tǒng)已廣泛應用于工業(yè)、家電等各個領域,嵌入式系統(tǒng)對網絡應用的要求也越來越高,因此在嵌入式系統(tǒng)中實現TCP/IP協(xié)議,已經成為嵌入式系統(tǒng)領域的研究熱點。
傳統(tǒng)的TCP/IP協(xié)議在資源有限的嵌入式系統(tǒng)中實現起來很困難,必須把大量的資源花在保證數據傳送的可靠性以及數據流量的控制上,因而在實時性要求比較高的嵌入式領域中,不能滿足實時要求。因此,研究并改進嵌入式TCP/IP協(xié)議棧以滿足嵌入式系統(tǒng)的高性能要求,具有重要的現實意義。
1.1 硬件平臺
該系統(tǒng)硬件部分由ADE7758高性能電能計量芯片、ARM處理器、2 MB NOR Flash、64 MB SDRAM和以太網接口等組成。ADE7758內部集成了6路16位△-∑ADC、高性能DSP、電壓基準及溫度傳感器等電路,在1000:1動態(tài)范圍內誤差小于0.1%;提供有功、無功及視在電能,電壓、電流有效值及波形采樣等數據;三相三線/三相四線兼容;DSP內部對無功電能進行了補償;提供獨立的有功電能及無功電能脈沖輸出,非常適合三相電能計量。被測三相電壓、電流經傳感器和調理電路后,送入ADE7758的A相、B相、C相電壓和電流輸入端;經ADE7758計算后,轉換為有功功率、無功功率、視在功率、復功率等電能信息,數據通過ADE7758的SPI接口輸出。MCU讀出電能數據信息并處理后,送LCD顯示和網絡接口。硬件原理框圖如圖1所示。
為了通過計算機遠程監(jiān)控電能數據,軟件部分采用了OpenTCP作為協(xié)議棧完成數據通信。OpenTCP是英國Vi-ola公司開發(fā)的用于8/16位MCU的源碼開放的TCP/IP協(xié)議棧。與通用的嵌入式TCP/IP協(xié)議棧(如lwIP、uIP)相比,其代碼更為精簡,不需要操作系統(tǒng)的支持,可以根據需要進行裁剪,全部用ANSI C編寫,支持Ethernet、SLIP、ARP、RARP、ICMP、TCP、UDP;應用層支持TFTP、TEL-NET、HTTP、SMTP、POP3、DNS等,對于應用層協(xié)議都提供callback接口,可方便用戶的應用程序設計。
1.2 協(xié)議棧的特點
通用計算機上運行的TCP/IP協(xié)議棧過于復雜,需占用大量系統(tǒng)資源,而嵌入式應用系統(tǒng)的資源往往都非常有限。因此,需要將傳統(tǒng)的TCP/IP協(xié)議棧加以簡化。在設計中OpenTCP為提高協(xié)議棧的運行效率,在保持高性能的同時,針對嵌入式系統(tǒng)的要求對TCP/IP進行了部分精簡和優(yōu)化,使其能在各種MCU體系結構上實現,減少對資源的消耗,以滿足嵌入式應用的要求。具體特點如下:
?、儆捎谇度胧较到y(tǒng)對網絡功能的要求各有不同,OpenTCP可以根據應用的要求選擇必要的協(xié)議,縮減程序代碼的大小和對數據存儲器的占用。
②根據嵌入式系統(tǒng)應用環(huán)境的特點,一般其作為服務器端,與之通信的都是實現了完整TCP/IP的設備,通信較為可靠,不需要復雜的路由選擇、IP分片、重裝、TCP流量控制、擁塞控制等。因此,在OpenTCP中簡化了TCP、IP等協(xié)議的實現,取消了所有的IP選項和TCP選項(包括IP的分段);TCP的流量控制窗口長度為1,即報文傳輸是基于停止一等待方式。避免了復雜的流量控制和分段處理,可以滿足嵌人式網絡應用的要求。TCP狀態(tài)機也進行了一定的簡化處理。
?、跲penTCP針對TCP/IP協(xié)議中對性能影響最大的部分——緩沖區(qū)的管理進行了優(yōu)化,采用零拷貝技術,即在網卡驅動程序和協(xié)議之間沒有數據拷貝的過程,以減少對系統(tǒng)資源的占用,簡化緩沖區(qū)的管理,提高實時性。
TCP/IP具有層次性,每一層都有自己的數據格式。數據在各層之間傳送時需要不斷地進行打包和解包處理,以及數據的拷貝,會大大增加系統(tǒng)對存儲器和運算能力的開銷,降低系統(tǒng)的性能。在OpenTCP協(xié)議棧中,每一層都沒有用于數據傳輸的緩沖區(qū),協(xié)議棧之間傳遞的是數據指針。接收數據時,每一層將本層的數據處理完畢后,將處理過的數據指針指向上一層的數據的頭部;發(fā)送數據時,也是以類似的過程來實現。
為了減小網絡對系統(tǒng)存儲器的需求,采用靜態(tài)分配技術,在網絡初始化時靜態(tài)分配數據緩沖區(qū),設置專門的發(fā)送和接收緩沖區(qū),大小一般大于網絡的MTU值。該值可根據網絡環(huán)境調整,在本系統(tǒng)中采用的底層網絡接口為以太網,設置接收緩沖區(qū)大小為1 500字節(jié)。當一個數據包來到時,網絡設備驅動將其放在接收緩沖區(qū)里,調用TCP/IP協(xié)議棧。如果數據包里有數據,TCP/IP協(xié)議就會通知相應的應用程序。如果應用程序需要發(fā)送數據,OpenTCP的每一層協(xié)議都有自己的數據結構用于本層報文頭部處理,發(fā)送緩沖區(qū)的只用來存放發(fā)送的數據。發(fā)送數據時,應用程序把數據寫入緩沖區(qū),設備驅動程序立即發(fā)送報文頭部和數據到網絡上。
④OpenTCP協(xié)議??梢宰鳛橐粋€任務運行在多任務的系統(tǒng)里,也可以采用前后臺方式作為一個主程序運行在一個單任務系統(tǒng)里。其主循環(huán)控制都在重復地做一件事:檢查是否有數據幀到達,如果一個幀到來,則立即根據幀的類型調用對應的輸入處理函數。
⑤應用程序接口決定了應用程序和TCP/IP協(xié)議棧連接的方式。最常用的TCP/IP API是BSD SOCKETAPI,通常用在Unix系統(tǒng)中,它需要多任務操作系統(tǒng)的支持。OpenTCP使用了事件驅動接口來響應特定事件。應用程序作為C函數運行在協(xié)議棧上,被調用來響應特定事件。當數據被接收或者分配一個連接時,這些函數被調用。應用程序只需提供一個回調函數,因此用戶應用程序的編寫和調試非常方便。
?、轔penTCP提供非常方便的調試手段,在每一層協(xié)議的關鍵部分都可以通過串口輸出,使用戶及時了解協(xié)議的運行情況。由于TCP/IP協(xié)議的復雜性,很難復現同一種錯誤,此時只需在編譯程序時打開調試選項就可以實時監(jiān)控協(xié)議棧的運行情況。調試完畢后,取消調試選項即可恢復協(xié)議的運行效率。
2 軟件移植過程和對協(xié)議棧的改進
2.1 校驗和的改進
TCP/IP協(xié)議處理過程中主要的運算量集中在3個部分:應用程序將數據拷貝到RAM;將RAM中的數據包拷貝到網絡設備的發(fā)送緩沖區(qū);計算校驗和。前兩部分在該協(xié)議中通過零拷貝技術改進運行效率,最后一部分是利用C語言來實現的。TCP/IP協(xié)議中多處用到了對校驗和的計算,在IP層需要對20字節(jié)的報頭進行校驗,在TCP/UDP處理中是對12個字節(jié)組成的偽首部和數據進行校驗。OpenTCP中采用的是每一個字節(jié)逐個計算校驗和的算法,雖然這樣可以適應8/16位等多種不同的處理器體系結構,但是卻極大地影響了校驗的速度和效率。為了充分發(fā)揮ARM7處理器的性能,采用了ARM匯編語言的優(yōu)化算法,借鑒Linux核心代碼中處理校驗和的源程序,將Linux gcc中AT&T格式的算法改寫為ADS1.2的標準寫法,經過測試,大大提高了計算的效率。
2.2定時器的設置
TCP/IP協(xié)議中需要多種定時器來完成ARP緩存的刷新,TCP協(xié)議中也需要利用定時器實現重傳等機制。OpenTCP采用的是統(tǒng)一的定時器處理方式,在協(xié)議初始化之前初始化一個定時器池,其中定時器的個數可以根據應用的要求來設置。當協(xié)議需要使用定時器時,首先在定時器池中申請一個定時器并設置超時時間,定時器的超時由硬件定時器中斷處理函數完成。當檢查到有超時的事件產生時,協(xié)議處理函數進行超時處理。S3C44B0X內部有6個定時器,這里選擇定時器5作為該協(xié)議中與時間有關的事件的定時處理,定時器的周期為10 ms。
2.3網卡驅動程序設計
OpenTCP協(xié)議棧具有很好的可移植性,只需要在軟件中設計幾個宏定義,分別實現以太網數據的收發(fā)等功能。該協(xié)議棧已經提供了CS8900的驅動程序,由于使用的是RTL8019網卡控制器,針對該芯片的特點編寫了相應的驅動程序。將RTL8019內部的RAM分為幾個 部分,分別作為接收緩沖區(qū),ARP、ICMP、TCP和UDP協(xié)議的數據發(fā)送區(qū)。這里將各個不同協(xié)議的發(fā)送緩沖區(qū)分開,在實際應用過程中發(fā)現調試較為方便。
RTL8019AS的驅動程序設計中將協(xié)議中SEND_NETWORK_B(c)、NETWORK_CHECK_IF_RECEIVED()和NETWORK_RECEIVE_INITIALIZE(c)等幾個宏定義為對應函數,就可以完成底層的驅動程序設計。
RTL8019AS的驅動程序設計主要包括3個部分:NE2000init()完成芯片的初始化,包括設置網卡MAC地址、收發(fā)緩沖區(qū)的地址和大小等;NE2000receive()和NE2000send()分別完成數據的接收和發(fā)送。
另外,OpenTCP的設置以宏定義的形式單獨包含在config.h的頭文件中,用戶修改很方便。用戶可以根據自己的要求更改MAC和IP地址、網關地址、收發(fā)緩沖區(qū)的大小、UDP/TCP連接的個數、端口的設置,以及ARP表項的大小等。
3 應用設計和小結
協(xié)議棧OpenTCP已經成功應用于小型光伏發(fā)電站電能計量系統(tǒng)設計中,ARM處理器運行嵌入式Web服務器,可以通過遠程計算機實現對發(fā)電站電能參數的實時監(jiān)控和記錄,并通過TCP協(xié)議實現數據的遠程采集。程序調試完成后固化在Flash中,上位機采用“VC+SQL Serv-er”編寫應用程序。在100M快速以太網環(huán)境下經過測試,可以完全滿足系統(tǒng)的要求。
OpenTCP作為一種高效的TCP/IP協(xié)議棧,利用高性能的處理器系統(tǒng)具有結構簡單、速度快等特點,為各種需要遠程控制或者實現便攜式數據采集的應用場合提供了一個具有較高性價比的設計方案。
tcp/ip相關文章:tcp/ip是什么
評論