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