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