李威,殷志堅
(江西科技師范大學(xué)通信與電子學(xué)院,南昌330013)
隨著嵌入式系統(tǒng)技術(shù)的不斷發(fā)展,越來越多的應(yīng)用需要嵌入式系統(tǒng)連接成網(wǎng)絡(luò)使用,這就需要一個可應(yīng)用于嵌入式系統(tǒng)的TCP/IP協(xié)議。由32位處理器搭建的嵌入式系統(tǒng)在使用網(wǎng)絡(luò)的時候,通常都會運行一個集成有TCP/IP協(xié)議棧的操作系統(tǒng)。這樣的TCP/IP協(xié)議棧是龐大的,不適用于處理能力和資源都十分有限的8位或16位的處理器搭建的嵌入式平臺,而且由于處理能力和資源有限,8位或16位的處理器搭建的嵌入式系統(tǒng)一般都不運行操作系統(tǒng)。TCP/IP協(xié)議棧的透明性掩蓋了其實現(xiàn)的復(fù)雜性,系統(tǒng)開發(fā)者從無到有搭建一個適用于自己平臺的TCP/IP協(xié)議棧是一件艱巨的任務(wù),很多時候從一個項目開發(fā)周期來說是不可能實現(xiàn)的。ZLIP TCP/IP協(xié)議棧是一種可實現(xiàn)的極小的TCP/IP協(xié)議棧,適用于8位或16位的處理器構(gòu)建的嵌入式平臺。ZLIP協(xié)議棧是針對51單片機和Keil C51編譯器其自身的特點(存儲類型、函數(shù)指針、重入函數(shù)等)設(shè)計的,而且ZLIP協(xié)議棧是用C語言實現(xiàn)的,方便協(xié)議棧的移植。ZLIP協(xié)議棧代碼量適中,而且對處理器和RAM等資源要求都較小,這使得ZLIP協(xié)議??梢院芎玫赜糜诘投颂幚砥鞔罱ǖ南到y(tǒng)上。本文將簡單描述ZLIP協(xié)議棧的特點,分析ZLIP的應(yīng)用接口,并討論嵌入式平臺結(jié)合ZLIP作為客戶端系統(tǒng)的應(yīng)用。
目前常用的TCP/IP協(xié)議有l(wèi)wIP、uIP、tinyTCP、ZLIP等幾種,其中l(wèi)wIP、uIP、ZLIP已經(jīng)成功在單片機上得到了應(yīng)用。應(yīng)用在微處理器上的TCP/IP協(xié)議棧中,lwIP算是功能較全面的,但是它的代碼量相對來說比較大,對資源的要求也較高;uIP采用了不保存需要應(yīng)答的數(shù)據(jù)包的RAM使用方案,uIP的設(shè)計側(cè)重于減少代碼量和減少RAM的使用量,相對lwIP來說對系統(tǒng)的資源要求較低,但其沒有和BSD的套接字接口兼容應(yīng)用層接口較復(fù)雜;ZLIP協(xié)議棧是以李章林博士為主的開發(fā)團隊在南開大學(xué)電子應(yīng)用實驗室開發(fā)完成,專門為51單片機設(shè)計的,針對Keil C51編譯器設(shè)計,它的代碼量和RAM使用量都比較適中,所有的外部變量都使用了xdata類型,全部指針都為明確存儲類型的指針,需要重入的函數(shù)已經(jīng)聲明為reentant,使用KeilC的小模式下編譯,使用類似MFC的CScoket的套接字應(yīng)用層接口,使用方便。ZLIP支持多TCP連接、多網(wǎng)絡(luò)設(shè)備。ZLIP是用C語言實現(xiàn)的源碼開放的協(xié)議棧,能方便地移植到多任務(wù)操作系統(tǒng)和其他CPU下,能方便地替換網(wǎng)絡(luò)接口協(xié)議和網(wǎng)卡驅(qū)動設(shè)備,具有很好的通用性。
ZLIP協(xié)議通過提供一系列的接口函數(shù),實現(xiàn)其與底層網(wǎng)卡驅(qū)動的連接以及與上層應(yīng)用程序的通信。它內(nèi)部的協(xié)議集合對用戶都是可見的,增強了該協(xié)議棧的通用性和靈活性,用戶可以根據(jù)自己的需要將此協(xié)議棧移植到不同的平臺。ZLIP協(xié)議棧與系統(tǒng)底層驅(qū)動和應(yīng)用程序之間的接口關(guān)系如圖1所示。
圖1
ZLIP與系統(tǒng)底層的接口包括與設(shè)備驅(qū)動的接口和與系統(tǒng)定時器的接口兩類。ZLIP與設(shè)備驅(qū)動的接口是通過函數(shù)EtherDevInit(),將網(wǎng)絡(luò)設(shè)備的MAC地址和接收、發(fā)送函數(shù)通過“注冊”的形式“注冊”進ZLIP協(xié)議棧,從而初始化一個以太網(wǎng)接口設(shè)備,并設(shè)置這個設(shè)備的發(fā)送和接收驅(qū)動函數(shù)。為了與ZLIP協(xié)議棧結(jié)合,其中網(wǎng)絡(luò)設(shè)備的發(fā)送函數(shù)為unsigned char型的可重入函數(shù),形參為一個指向待發(fā)送數(shù)據(jù)的指針和一個記錄待發(fā)送數(shù)據(jù)長度的變量,例如unsigned char cp2200_Send(unsigned char xdata*outbuf,unsigned short len)reentrant。網(wǎng)絡(luò)設(shè)備的接收函數(shù)為struct SMemHead xdata*型的可重入函數(shù),例如struct SMemHead xdata*cp2200_rcve()reentrant,其中SMemHead結(jié)構(gòu)體為:
在接收函數(shù)中,只要用到pStart成員,將接收到的數(shù)據(jù)存入pStart指向的存儲區(qū)。
TCP/IP協(xié)議要處理許多定時事件,例如包重發(fā)、ARP表項更新等。系統(tǒng)計時用于為所有ZLIP內(nèi)部時鐘事件計時。ZLIP與系統(tǒng)定時器的接口是通過NetIfTimer()、ARPTimer()、TCPTimer()三個函數(shù)實現(xiàn)的,NetIfTimer()函數(shù)調(diào)用“注冊”了的每一個接口的接收函數(shù),接收到達(dá)的數(shù)據(jù)包;ARPTimer()函數(shù)處理ARP表項更新;TCPTimer()函數(shù)處理TCP/IP包的重發(fā)等功能。這三個函數(shù)必須在短時間(一般不大于25ms)內(nèi)被調(diào)用一次,否則接收數(shù)據(jù)包等功能將停止。
ZLIP協(xié)議棧提供一系列接口函數(shù)供用戶程序調(diào)用,應(yīng)用程序作為單獨的模塊由用戶實現(xiàn)。在應(yīng)用程序中每個連接都需要定義一個套接字,ZLIP提供了TCPSocket()函數(shù)可給每個連接申請一個套接字。當(dāng)系統(tǒng)作為客戶端使用時,ZLIP提供了TCPConnect()函數(shù)向IP地址為DestIP的服務(wù)器的DestPort端口發(fā)起連接,通過TCPConnect()函數(shù)還可以設(shè)置當(dāng)接收到數(shù)據(jù)包和對方要求關(guān)閉TCP連接時應(yīng)該調(diào)用的回調(diào)函數(shù)。
接收數(shù)據(jù)包的回調(diào)函數(shù)原型可定義為類似void On-Receive(void xdata*buf,unsigned short size)reentrant的形式,其中buf指向接收的數(shù)據(jù),size是接收的數(shù)據(jù)量的大小。可以在OnReceive中處理接收的數(shù)據(jù)。
當(dāng)程序中有多個TCP連接同時存在時,需要給每個連接準(zhǔn)備一個接收回調(diào)函數(shù)。對方要求關(guān)閉TCP連接時應(yīng)該調(diào)用的回調(diào)函數(shù)原型可定義為類似void OnClose(socket xdata*pSocket)reentrant的形式,pSocket指向?qū)⒁P(guān)閉的socket,在OnClose中可調(diào)用ZLIP提供的TCPClose()函數(shù),它將要求關(guān)閉套接字pSocket對應(yīng)的連接。當(dāng)程序中有多個TCP連接同時存在時,需要給每個連接準(zhǔn)備一個OnClose函數(shù)?;卣{(diào)函數(shù)的函數(shù)名在不重復(fù)的情況下可以任意命名。
當(dāng)系統(tǒng)作為服務(wù)器使用時,可使用ZLIP提供的TCPListen()函數(shù)對目標(biāo)端口進行監(jiān)聽,通過TCPListen()函數(shù)還可以設(shè)置當(dāng)有客戶端向這個監(jiān)聽端口連接成功時調(diào)用的回調(diào)函數(shù),當(dāng)程序中有多個處于監(jiān)聽狀態(tài)的socket時,需要給每個socket準(zhǔn)備一個這樣的回調(diào)函數(shù)。
不論系統(tǒng)出于客戶端狀態(tài)還是服務(wù)器狀態(tài),只要系統(tǒng)被連接進網(wǎng)絡(luò)后都可以調(diào)用ZLIP提供的TCPSend()函數(shù)來發(fā)送數(shù)據(jù),當(dāng)使用完這個套接字以后,調(diào)用ZLIP提供的TCPAbort()函數(shù),將這個套接字釋放還給系統(tǒng)。
用戶根據(jù)具體的實際條件可對ZLIP進行設(shè)置。修改TCPIPmem.h中的宏定義TCPIP_BUF_SIZE可以設(shè)置TCP緩沖區(qū)大小,默認(rèn)為8KB,建議大于4KB。緩沖區(qū)過小,將會影響發(fā)送和接收速度。如果系統(tǒng)中有多個網(wǎng)絡(luò)設(shè)備,可以修改NetIf.h中的宏定義NET_IF_MAX_NUM設(shè)置系統(tǒng)中允許的網(wǎng)絡(luò)設(shè)備數(shù),在主程序中使用NetIfAdd()函數(shù)可添加網(wǎng)絡(luò)設(shè)備。修改TCP.h中的宏定義TCP_CONNECTION_MAX_NUM可以設(shè)置TCP的連接上限。當(dāng)程序使用以太網(wǎng)以外的網(wǎng)絡(luò)接口協(xié)議時,修改NetIf.h中的宏定義NETIF_HEAD_MAX_LEN可以設(shè)置網(wǎng)絡(luò)接口層協(xié)議的最大幀頭長度。修改ARP.h中的宏定義ARP_ENTRY_MAX_NUM可以設(shè)置ARP表的大小。如果不希望系統(tǒng)能夠響應(yīng)ping命令,則修改icmp.h中的宏定義ICMP_EN為0即可,響應(yīng)ping命令就設(shè)置為1。
下面討論將ZLIP結(jié)合CP2200以太網(wǎng)芯片,在C8051F120增強型單片機組成的嵌入式平臺上作為客戶端系統(tǒng)使用。該系統(tǒng)的實現(xiàn)可分為4部分:C8051F120的初始化、CP2200網(wǎng)卡芯片的驅(qū)動、系統(tǒng)定時器、應(yīng)用程序。
C8051F120的初始化主要就是根據(jù)需求對系統(tǒng)時鐘、端口設(shè)置等初始化。
CP2200網(wǎng)卡芯片的驅(qū)動主要包括三個部分:PHY_Init()和MAC_Init()函數(shù)實現(xiàn)網(wǎng)卡芯片的上電初始化,主要包括物理層的初始化和MAC初始化;cp2200_Send()函數(shù)實現(xiàn)數(shù)據(jù)的發(fā)送;cp2200_rcve()函數(shù)實現(xiàn)以太網(wǎng)數(shù)據(jù)的接收。
C8051F120上有5個可用于定時計數(shù)的定時器,可選擇其中任意一個來為TCP/IP協(xié)議中與時間有關(guān)的事件定時。在定時時間到達(dá)時,需要處理的函數(shù)包括NetIfTimer()、ARPTimer()、TCPTimer(),為了保證對這三個函數(shù)能被及時執(zhí)行,可以將定時器的定時周期設(shè)置為20ms。
在應(yīng)用程序中可以通過調(diào)用TCPSend()函數(shù)來發(fā)送數(shù)據(jù)。為了簡單測試該客戶端系統(tǒng)和服務(wù)器連通是否能正確通信,可以在數(shù)據(jù)包接收回調(diào)函數(shù)中將接收到的數(shù)據(jù)返發(fā)給服務(wù)器,這樣可通過在PC上的網(wǎng)絡(luò)調(diào)試助手軟件查看數(shù)據(jù)的回顯正確與否,從而判斷客戶端和服務(wù)器的通信正常與否。軟件的實現(xiàn)框圖如圖2所示。
圖2
將服務(wù)器IP設(shè)為192.168.1.149,端口號設(shè)為2016。當(dāng)客戶端和模擬服務(wù)器的網(wǎng)絡(luò)調(diào)試助手連通后,可通過調(diào)試助手向客戶端系統(tǒng)發(fā)送數(shù)據(jù),然后客戶端將數(shù)據(jù)返發(fā)回去。此時數(shù)據(jù)會在調(diào)試助手的網(wǎng)絡(luò)數(shù)據(jù)接收區(qū)顯示出來,實驗結(jié)果如圖3所示。
圖3
本文對ZLIP的特點、接口等進行了分析,討論了將ZLIP結(jié)合CP2200以太網(wǎng)芯片在C8051F120單片機上實現(xiàn)客戶端系統(tǒng),并實驗成功。采用ZLIP實現(xiàn)8/16位嵌入式處理器搭建的系統(tǒng)進行以太網(wǎng)通信有著良好的前景,可用于實現(xiàn)遠(yuǎn)程信息采集、智能儀表等嵌入式系統(tǒng)應(yīng)用。
[1] Stevens W Richard.TCP/IP詳解卷一:協(xié)議[M] .北京:機械工業(yè)出版社,2000.
[2] 李玉玲,苑津莎,張衛(wèi)華.基于Web服務(wù)和工作流的業(yè)擴報裝系統(tǒng)研究[J] .電力科學(xué)與工程,2006(2):51-54.
[3] 鄧治國.uIP TCP/IP協(xié)議棧在51系列單片機上的應(yīng)用[J] .微計算機信息,2004(2):17-19.
[4] Forouzan B A,F(xiàn)egan S C.TCP/IP協(xié)議族[M] .謝希仁,譯.北京:清華大學(xué)出版社,2006.
[5] Silicon Laboratories.C8051F120/1/2/3/4/5/6/7Datasheet,2006.
[6] Silicon Laboratories.CP2200/1Data sheet,2006.
[7] Valetto G,Kaiser G.Using Process Technology to Control and Coordinate Software Adaptation[M] .Portland:ICSE,2003.