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