劉 凱 呂海燕 張立民
(海軍航空大學航空基礎學院 煙臺 264001)
隨著嵌入式系統和網絡接入方法的日益發展,越來越多的嵌入式系統連接至網絡,作為網絡終端參與數據交互、信息處理[1~2]?;?TCP/IP 的以太網是一種標準開放式的網絡,由于其通用性強,組網容易,能夠實現遠距離數據傳輸,容易實現資源共享,受到了廣泛的應用和支持[3~4]。因此,基于以太網的嵌入式系統逐漸成為了當前片上系統(Sys?tem on Chip,SoC)[5]的發展熱點。但是,由于嵌入式系統中硬件資源有限,如果移植完整的TCP/IP協議棧,會大大增加系統運行載荷,導致系統運行緩慢且數據通信不暢。因此,需要依據嵌入式系統特點,有針對性地選擇TCP/IP協議棧精簡方案,從而實現網絡穩定通信與系統高效運行的平衡。
LM3S8962[6~7]微控制器是德州儀器(TI)公司提供的一款具有32位高性能運算能力的基于ARM?CortexTM-M3的控制器,其優勢還在于能夠方便地運用多種ARM的開發工具和片上系統(SoC)的底層IP應用方案。另外,該微控制器使用了兼容ARM Thumb?的Thumb2指令集來減少存儲容量的需求,并以此達到降低成本的目的。最后,LM3S8962微控制器與Stellaris?系列的所有成員是代碼兼容的,這為用戶提供了靈活性,能夠適應各種精確的需求。
LM3S8962微控制器的主要特性之一是具有10/100以太網控制器,它遵循IEEE 802.3-2002規范,遵循IEEE 1588-2002精確時間協議(PTP)。在100Mbps和10Mbps速率運作下支持全雙工和半雙工的操作方式,集成10/100Mbps收發器(PHY),自動的MDI/MDI-X交叉校驗,可編程MAC地址[8~9]。
針對LM3S8962已經具備10/100以太網控制器特點,需要在其硬件以太網控制器的基礎上構建協議包系統,從而完成TCP或UDP數據包的處理,實現TCP/IP協議棧的通信。
1)以太網協議
以太網數據由以太網幀來傳送[10]。以太網的沖突退避算法是由硬件自動執行的,在軟件設計中可不用考慮。類型表示上層協議類型,本協議棧只處理這兩種類型的以太網幀:IP包、ARP包。
2)地址解析協議(ARP)和反地址解析協議(RARP)
為了簡化TCP/IP協議棧內容,本協議棧僅僅涉及了使用固定IP地址的方式實現以太網通信。因此,在本協議棧中無需實現RARP,僅僅需要對ARP包進行處理。ARP請求格式如圖1所示。

圖1 ARP請求應答格式
以太網報頭中的前兩個字段是以太網的源地址和目的地址。目的地址為全1的特殊地址是廣播地址。兩個字節長的以太網幀類型表示后面數據的類型。如果以太網報文內容為ARP請求或應答,該字段的值為0×0806。對于一個ARP請求,除目的端硬件地址以外的所有其他字段都有填充值。當系統收到一份目的端為本機的ARP請求報文后,它就把硬件地址填進去,然后用兩個目的端地址分別替換兩個發送端地址,并把操作字段置為2,最后把它發送回去。
3)控制報文協議(ICMP)
針對嵌入式應用系統的特點,雖然ICMP可以提供很好的網絡狀態報告,但對于本系統中嵌入式軟件而言,只需要實現一個“回顯應答”(即Ping應答)的功能即可。
Ping是Internet上最常用的調試工具,它的目的是為了測試另一臺主機是否可達[11~12]。該程序發送一份ICMP回顯請求報文給目的IP設備,并等待返回ICMP回顯應答。用該命令,可以方便地測試儀表與網絡是否連通。為實現響應ping命令,本協議支持的ICMP類型如下:
type=8:ICMP Echor(回送)回答報文;
type=0:ICMP Echor請求。
4)網際協議(IP)
IP數據包的格式如圖2所示。考慮到本系統網絡數據較小,故在IP協議實現時沒有支持有選項字段的IP包和分片操作。

圖2 IP數據包格式
8位協議字段表示上層協議類型,在本項目中只要處理兩種類型的IP包:ICMP包、UDP包。
5)用戶數據報協議(UDP)
UDP分段的頭部格式如圖3所示。

圖3 UDP分段的頭部格式
在本協議棧中,設計了完整的UDP協議,并實現了與計算機的Socket通信。
從上面可以得出,經過了剪裁之后在本系統中應用的TCP/IP協議棧層次如圖4所示。

圖4 TCP/IP協議棧層次設計
該層主要為LM3S8962以太網底層硬件驅動,包含以太網中斷響應函數EthernetIntHandler()、硬件初始化函數InitNic()、處理接收數據函數Rec?Packet()、以太網底層發送數據函數Send_Packet()。
LM3S8962自帶的函數庫包含了基本的以太網通信控制函數,故該協議是在其函數庫基礎上實現的。
1)InitNic()
要實現網絡的驅動,必須對LM3S8962的各個寄存器進行初始化和配置。在對LM3S8962進行初始化之前需要進行硬件復位和軟件復位;然后進行寄存器設置。LM3S8962網絡初始化的順序如圖5所示。

圖5 LM3S8962網絡初始化流程
2)EthernetIntHandler()函數
該函數參數為void,主要是作為接收中斷響應函數調用RecPacket()函數。由于該協議是在μC/OS-Ⅱ基礎上設計的,在該函數最后進行了任務的調度。
3)RecPacket()函數
該函數的參數為void,該函數需調用LM3S8962的庫函數EthernetPacketGetNonBlocking Get(),其具體功能是從以太網控制器獲取數據包,返回接收數據包的長度。
4)Send_Packet()函數
在協議棧中設計了鏈表_pkst,其結構如圖6所示。協議棧利用它作為數據讀取和發送的數據結構。

圖6 _pkst結構
Send_Packet()函數的輸入參數為數據鏈初始指針,返回值為void。
數據鏈路層中包含地址解析函數PRO?CESS_ARP_REC(),網絡的收發操作函數Send_IP_LLC()和 Rec_Ethernet_Packet(),還有一些輔助函數,如設置網絡地址函數SetNetPort()等。
1)PROCESS_ARP_REC()函數
2)Send_IP_LLC()函數
該函數能夠為IP數據包的目標IP查找MAC地址并將其發送出去。輸入參數為發送結構指針和目標IP地址指針。
3)Rec_Ethernet_Packet()函數
該函數被RecPacket()函數調用,其功能是處理接收到的數據包,并將其數據指針傳遞到IP層。其輸入參數為接收數據指針;輸出參數為0表示發送失敗,1表示發送成功。
網絡層包括IP包的接收和發送控制,ICMP請求報文的接收和 ICMP應答報文的發送控制[13~14]。考慮到實際數據量較少,在IP數據包的處理上沒有實現分片處理。
在IP協議中,創建了消息隊列RecUdpQFlag和信號量SendFlag。消息隊列的用處:如果有UDP數據包傳遞到IP協議層,則釋放該消息隊列,同時該消息隊列保存了UDP數據包的存儲地址;信號量則在Send_Ip_Frame()函數中使用。具體使用過程:首先判斷該信號量是否當前可用,以判斷該函數能否獲得網絡發送的權利,如果該時間可以進行網絡數據發送,則在IP數據包發送完畢以后釋放信號量。
1)IP_PROCESS()函數
該函數的輸入參數為接收數據結構的指針;返回值表明處理結果,如果為1,則數據處理正確,如果為0表明處理失敗。
2)Send_Ip_Frame()函數
該函數實現的是IP數據包的發送。輸入參數由發送地址指針和目標IP地址組成,輸出參數表明發送結果是否成功。
在ICMP協議中,系統實現了Ping命令的響應,即客戶端能夠判斷接收服務端的ICMP Echo報文,同時向服務端回送一個ICMP Echo Reply報文完成Ping。
3)ICMP_PROCESS()函數
該函數的功能是對ICMP數據報進行處理。輸入參數為ICMP數據報指針,輸出參數表示處理結果。
鑒于LM3S8962內部以太網控制器穩定性高、通信鏈路延時低的優勢,同時為了降低通信負載,在本TCP/IP協議棧中運輸層僅僅使用UDP協議。為滿足通信要求,在該層設計了兩個結構udp_sub_socket和 udp_socket,其結構如圖 7、8 所示,并且定義了全局Socket變量。
udp_socket UdpStatus;

圖7 udp_sub_socket結構

圖8 udp_socket結構
1)UDP_Process()函數
該函數的輸入參數為接收UDP數據包指針,輸出參數表明處理結果。
2)UDP_Send()函數
該函數實現了UDP數據包的發送,輸入參數由數據指針、目的IP和網絡端口組成。
對于網絡數據的接收,該協議棧在系統中的具體使用步驟如下:
1)等待消息隊列RecUdpQFlag。如果消息隊列被釋放了,根據函數IP_PROCESS()處理流程,表明存在UDP數據包。調用UDP_Process(),相應的代碼如下所示:
UdpTemp = OSQPend (RecUdpQFlag, 0,&eer);
if(eer==OS_NO_ERR)
{
Udp_Process((Rec_Ptr*)UdpTemp);
}
2)等待UdpStatus中的信號量UdpSemRec,通過UDP_Process()保存后的數據指針得到UDP數據包中的數據。
3)如果要求發送網絡數據,調用UDP_Send()函數即可。
為了驗證嵌入式TCP/IP協議棧工作性能,采用兩種方式進行測試,1是Ping測試,2是將其應用于數據采集節點測試通信效果。
Pin命令主要是對網絡層進行測試[15~16]。在測試中,客戶端設定的IP地址是192.168.0.18,當服務器發出Ping命令時,客戶端給出回應。從圖9中可以看出,傳遞的數據并沒有丟失,并且傳輸的時延較小,證明通信性能較好??梢宰C明IP層、物理層、數據鏈路層是連通的,能夠保證客戶端與服務器進行正常通信。

圖9 ICMP的測試結果
在本系統中,數據采集節點通過以太網完成與上位機的信息交互。上位機進行UDP測試工具如圖10所示。

圖10 上位機測試UDP包結果
經過實驗驗證,數據采集節點能夠及時將所采集的數據通過網絡以UDP包的形式傳遞給上位機,上位機根據節點傳遞的數據及時作出反映。
針對LM3S8962芯片特點,采用了模塊化設計方法設計了TCP/IP協議棧。根據實際系統通信需要,對各個棧功能進行精簡,去掉了反地址解析協議,簡化了控制報文協議和TCP包處理。既保證了以太網通信需求,又節約了嵌入式系統資源。通過相關實驗驗證,該協議棧的設計達到了嵌入式系統預期要求。本文提出的這種基于嵌入式系統的精簡TCP/IP協議棧,對LM3S8962等同類型芯片的以太網通信等工程實踐提供了參考借鑒,并且對該領域中的相關技術研究也具有一定的指導意義。