李威,殷志堅
(江西科技師范大學通信與電子學院,南昌330013)
隨著嵌入式系統技術的不斷發展,越來越多的應用需要嵌入式系統連接成網絡使用,這就需要一個可應用于嵌入式系統的TCP/IP協議。由32位處理器搭建的嵌入式系統在使用網絡的時候,通常都會運行一個集成有TCP/IP協議棧的操作系統。這樣的TCP/IP協議棧是龐大的,不適用于處理能力和資源都十分有限的8位或16位的處理器搭建的嵌入式平臺,而且由于處理能力和資源有限,8位或16位的處理器搭建的嵌入式系統一般都不運行操作系統。TCP/IP協議棧的透明性掩蓋了其實現的復雜性,系統開發者從無到有搭建一個適用于自己平臺的TCP/IP協議棧是一件艱巨的任務,很多時候從一個項目開發周期來說是不可能實現的。ZLIP TCP/IP協議棧是一種可實現的極小的TCP/IP協議棧,適用于8位或16位的處理器構建的嵌入式平臺。ZLIP協議棧是針對51單片機和Keil C51編譯器其自身的特點(存儲類型、函數指針、重入函數等)設計的,而且ZLIP協議棧是用C語言實現的,方便協議棧的移植。ZLIP協議棧代碼量適中,而且對處理器和RAM等資源要求都較小,這使得ZLIP協議棧可以很好地用于低端處理器搭建的系統上。本文將簡單描述ZLIP協議棧的特點,分析ZLIP的應用接口,并討論嵌入式平臺結合ZLIP作為客戶端系統的應用。
目前常用的TCP/IP協議有lwIP、uIP、tinyTCP、ZLIP等幾種,其中lwIP、uIP、ZLIP已經成功在單片機上得到了應用。應用在微處理器上的TCP/IP協議棧中,lwIP算是功能較全面的,但是它的代碼量相對來說比較大,對資源的要求也較高;uIP采用了不保存需要應答的數據包的RAM使用方案,uIP的設計側重于減少代碼量和減少RAM的使用量,相對lwIP來說對系統的資源要求較低,但其沒有和BSD的套接字接口兼容應用層接口較復雜;ZLIP協議棧是以李章林博士為主的開發團隊在南開大學電子應用實驗室開發完成,專門為51單片機設計的,針對Keil C51編譯器設計,它的代碼量和RAM使用量都比較適中,所有的外部變量都使用了xdata類型,全部指針都為明確存儲類型的指針,需要重入的函數已經聲明為reentant,使用KeilC的小模式下編譯,使用類似MFC的CScoket的套接字應用層接口,使用方便。ZLIP支持多TCP連接、多網絡設備。ZLIP是用C語言實現的源碼開放的協議棧,能方便地移植到多任務操作系統和其他CPU下,能方便地替換網絡接口協議和網卡驅動設備,具有很好的通用性。
ZLIP協議通過提供一系列的接口函數,實現其與底層網卡驅動的連接以及與上層應用程序的通信。它內部的協議集合對用戶都是可見的,增強了該協議棧的通用性和靈活性,用戶可以根據自己的需要將此協議棧移植到不同的平臺。ZLIP協議棧與系統底層驅動和應用程序之間的接口關系如圖1所示。

圖1
ZLIP與系統底層的接口包括與設備驅動的接口和與系統定時器的接口兩類。ZLIP與設備驅動的接口是通過函數EtherDevInit(),將網絡設備的MAC地址和接收、發送函數通過“注冊”的形式“注冊”進ZLIP協議棧,從而初始化一個以太網接口設備,并設置這個設備的發送和接收驅動函數。為了與ZLIP協議棧結合,其中網絡設備的發送函數為unsigned char型的可重入函數,形參為一個指向待發送數據的指針和一個記錄待發送數據長度的變量,例如unsigned char cp2200_Send(unsigned char xdata*outbuf,unsigned short len)reentrant。網絡設備的接收函數為struct SMemHead xdata*型的可重入函數,例如struct SMemHead xdata*cp2200_rcve()reentrant,其中SMemHead結構體為:

在接收函數中,只要用到pStart成員,將接收到的數據存入pStart指向的存儲區。
TCP/IP協議要處理許多定時事件,例如包重發、ARP表項更新等。系統計時用于為所有ZLIP內部時鐘事件計時。ZLIP與系統定時器的接口是通過NetIfTimer()、ARPTimer()、TCPTimer()三個函數實現的,NetIfTimer()函數調用“注冊”了的每一個接口的接收函數,接收到達的數據包;ARPTimer()函數處理ARP表項更新;TCPTimer()函數處理TCP/IP包的重發等功能。這三個函數必須在短時間(一般不大于25ms)內被調用一次,否則接收數據包等功能將停止。
ZLIP協議棧提供一系列接口函數供用戶程序調用,應用程序作為單獨的模塊由用戶實現。在應用程序中每個連接都需要定義一個套接字,ZLIP提供了TCPSocket()函數可給每個連接申請一個套接字。當系統作為客戶端使用時,ZLIP提供了TCPConnect()函數向IP地址為DestIP的服務器的DestPort端口發起連接,通過TCPConnect()函數還可以設置當接收到數據包和對方要求關閉TCP連接時應該調用的回調函數。
接收數據包的回調函數原型可定義為類似void On-Receive(void xdata*buf,unsigned short size)reentrant的形式,其中buf指向接收的數據,size是接收的數據量的大小。可以在OnReceive中處理接收的數據。
當程序中有多個TCP連接同時存在時,需要給每個連接準備一個接收回調函數。對方要求關閉TCP連接時應該調用的回調函數原型可定義為類似void OnClose(socket xdata*pSocket)reentrant的形式,pSocket指向將要關閉的socket,在OnClose中可調用ZLIP提供的TCPClose()函數,它將要求關閉套接字pSocket對應的連接。當程序中有多個TCP連接同時存在時,需要給每個連接準備一個OnClose函數。回調函數的函數名在不重復的情況下可以任意命名。
當系統作為服務器使用時,可使用ZLIP提供的TCPListen()函數對目標端口進行監聽,通過TCPListen()函數還可以設置當有客戶端向這個監聽端口連接成功時調用的回調函數,當程序中有多個處于監聽狀態的socket時,需要給每個socket準備一個這樣的回調函數。
不論系統出于客戶端狀態還是服務器狀態,只要系統被連接進網絡后都可以調用ZLIP提供的TCPSend()函數來發送數據,當使用完這個套接字以后,調用ZLIP提供的TCPAbort()函數,將這個套接字釋放還給系統。
用戶根據具體的實際條件可對ZLIP進行設置。修改TCPIPmem.h中的宏定義TCPIP_BUF_SIZE可以設置TCP緩沖區大小,默認為8KB,建議大于4KB。緩沖區過小,將會影響發送和接收速度。如果系統中有多個網絡設備,可以修改NetIf.h中的宏定義NET_IF_MAX_NUM設置系統中允許的網絡設備數,在主程序中使用NetIfAdd()函數可添加網絡設備。修改TCP.h中的宏定義TCP_CONNECTION_MAX_NUM可以設置TCP的連接上限。當程序使用以太網以外的網絡接口協議時,修改NetIf.h中的宏定義NETIF_HEAD_MAX_LEN可以設置網絡接口層協議的最大幀頭長度。修改ARP.h中的宏定義ARP_ENTRY_MAX_NUM可以設置ARP表的大小。如果不希望系統能夠響應ping命令,則修改icmp.h中的宏定義ICMP_EN為0即可,響應ping命令就設置為1。
下面討論將ZLIP結合CP2200以太網芯片,在C8051F120增強型單片機組成的嵌入式平臺上作為客戶端系統使用。該系統的實現可分為4部分:C8051F120的初始化、CP2200網卡芯片的驅動、系統定時器、應用程序。
C8051F120的初始化主要就是根據需求對系統時鐘、端口設置等初始化。
CP2200網卡芯片的驅動主要包括三個部分:PHY_Init()和MAC_Init()函數實現網卡芯片的上電初始化,主要包括物理層的初始化和MAC初始化;cp2200_Send()函數實現數據的發送;cp2200_rcve()函數實現以太網數據的接收。
C8051F120上有5個可用于定時計數的定時器,可選擇其中任意一個來為TCP/IP協議中與時間有關的事件定時。在定時時間到達時,需要處理的函數包括NetIfTimer()、ARPTimer()、TCPTimer(),為了保證對這三個函數能被及時執行,可以將定時器的定時周期設置為20ms。
在應用程序中可以通過調用TCPSend()函數來發送數據。為了簡單測試該客戶端系統和服務器連通是否能正確通信,可以在數據包接收回調函數中將接收到的數據返發給服務器,這樣可通過在PC上的網絡調試助手軟件查看數據的回顯正確與否,從而判斷客戶端和服務器的通信正常與否。軟件的實現框圖如圖2所示。

圖2
將服務器IP設為192.168.1.149,端口號設為2016。當客戶端和模擬服務器的網絡調試助手連通后,可通過調試助手向客戶端系統發送數據,然后客戶端將數據返發回去。此時數據會在調試助手的網絡數據接收區顯示出來,實驗結果如圖3所示。

圖3
本文對ZLIP的特點、接口等進行了分析,討論了將ZLIP結合CP2200以太網芯片在C8051F120單片機上實現客戶端系統,并實驗成功。采用ZLIP實現8/16位嵌入式處理器搭建的系統進行以太網通信有著良好的前景,可用于實現遠程信息采集、智能儀表等嵌入式系統應用。
[1] Stevens W Richard.TCP/IP詳解卷一:協議[M] .北京:機械工業出版社,2000.
[2] 李玉玲,苑津莎,張衛華.基于Web服務和工作流的業擴報裝系統研究[J] .電力科學與工程,2006(2):51-54.
[3] 鄧治國.uIP TCP/IP協議棧在51系列單片機上的應用[J] .微計算機信息,2004(2):17-19.
[4] Forouzan B A,Fegan S C.TCP/IP協議族[M] .謝希仁,譯.北京:清華大學出版社,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.