中國船舶重工集團(tuán)第715研究所 許 光
嵌入式T C P/I P協(xié)議棧的設(shè)計(jì)與應(yīng)用
中國船舶重工集團(tuán)第715研究所 許 光
本文介紹了一種嵌入式TCP/IP協(xié)議棧的設(shè)計(jì)方法,使用ARM7處理器和網(wǎng)絡(luò)控制器ENC28J60搭建硬件平臺進(jìn)行了協(xié)議棧的移植,整個(gè)設(shè)計(jì)具有一定的參考價(jià)值。
嵌入式TCP/IP協(xié)議棧;ENC28J60;ARM7
隨著計(jì)算機(jī)技術(shù)和網(wǎng)絡(luò)通信技術(shù)的發(fā)展,采用網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)的遠(yuǎn)程傳輸已經(jīng)成為工業(yè)領(lǐng)域的重要發(fā)展方向。與此同時(shí),以MCU、MPU等構(gòu)成的嵌入式系統(tǒng)也已經(jīng)廣泛地應(yīng)用于工業(yè)、家電等各個(gè)領(lǐng)域,嵌入式系統(tǒng)對網(wǎng)絡(luò)應(yīng)用的要求也越來越高,因此在嵌入式系統(tǒng)中實(shí)現(xiàn)網(wǎng)絡(luò)通信已經(jīng)成為電子設(shè)計(jì)領(lǐng)域的研究熱點(diǎn)[1]。
傳統(tǒng)的TCP/ IP協(xié)議在實(shí)現(xiàn)時(shí)需要占大量的存儲空間,這對于資源相對緊張的嵌入式系統(tǒng)而言顯得非常的龐大,研究并設(shè)計(jì)一個(gè)適合于嵌入式系統(tǒng)的簡易的TCP/ IP協(xié)議棧來實(shí)現(xiàn)嵌入式系統(tǒng)的網(wǎng)絡(luò)通信功能具有重要的現(xiàn)實(shí)意義。
我們的應(yīng)用環(huán)境中需要使用TCP協(xié)議與設(shè)備進(jìn)行通信,鑒于整個(gè)TCP/IP協(xié)議的分層體系,我們只要實(shí)現(xiàn)幾個(gè)核心功能協(xié)議即可,圍繞著這個(gè)設(shè)計(jì)思想即可進(jìn)行協(xié)議棧的裁剪與壓縮,整個(gè)設(shè)計(jì)的重點(diǎn)一目了然:即需要實(shí)現(xiàn)ARP、IP、ICMP以及TCP,通信不涉及應(yīng)用層的協(xié)議,所以應(yīng)用層不作具體實(shí)現(xiàn),此外針對特定的硬件平臺需要提供網(wǎng)絡(luò)驅(qū)動層的接口。
網(wǎng)絡(luò)驅(qū)動主要功能是設(shè)置網(wǎng)絡(luò)控制器ENC28J60,實(shí)現(xiàn)它發(fā)送和接收以太網(wǎng)數(shù)據(jù)包的功能。這個(gè)部分需要為上層協(xié)議提供三個(gè)功能:初始化接口ENC28J60_Init()、數(shù)據(jù)包發(fā)送功能ENC28J60_ SendPkt()以及數(shù)據(jù)包接收功能ENC28J60_RecPkt(),這也是實(shí)現(xiàn)系統(tǒng)的整個(gè)網(wǎng)絡(luò)通信的基礎(chǔ)[2]。
ARP協(xié)議主要用于IP地址和采用不同網(wǎng)絡(luò)技術(shù)的硬件地址的解析與映射,所以該協(xié)議的核心任務(wù)就是能夠?qū)ζ渌麢C(jī)器發(fā)來的ARP請求報(bào)文進(jìn)行一個(gè)應(yīng)答,以便于下一步能夠進(jìn)行通信連接和傳輸。所以在我們這個(gè)協(xié)議棧中我們需要實(shí)現(xiàn)ARP的請求和應(yīng)答功能。
IP協(xié)議的主要功能就是實(shí)現(xiàn)IP數(shù)據(jù)報(bào)的封裝與解封裝,另外一個(gè)重要的功能就是驗(yàn)證IP數(shù)據(jù)報(bào)的首部是否正確,鑒于實(shí)際使用的嵌入式系統(tǒng)的數(shù)據(jù)傳輸量不是很大(一般每次通信只有幾十個(gè)字節(jié)),我們在IP協(xié)議的設(shè)計(jì)中對于IP數(shù)據(jù)包的頭部使用固定的長度(即20個(gè)字節(jié)),另外IP數(shù)據(jù)報(bào)也不進(jìn)行分組傳輸。此外,為了檢測網(wǎng)絡(luò)的連通性,我們也需要實(shí)現(xiàn)ICMP協(xié)議,這樣通過PC機(jī)的PING測試即可知道設(shè)備是否連接正常。
在TCP/IP協(xié)議體系中,TCP協(xié)議是最重要的一個(gè)協(xié)議,在實(shí)現(xiàn)上也是比較復(fù)雜的一個(gè)協(xié)議,針對我們這個(gè)特定的系統(tǒng),我們將TCP協(xié)議進(jìn)行一些簡化處理:第一,對于打開的TCP端口僅僅處于被動連接狀態(tài),即當(dāng)有連接請求到來時(shí)才進(jìn)行通信,空閑時(shí)只進(jìn)行端口的查詢,所以硬件系統(tǒng)只作為服務(wù)器的角色進(jìn)行工作;第二,去掉了“滑動窗口”和擁塞控制機(jī)制;第三,發(fā)生數(shù)據(jù)丟失時(shí)不發(fā)送錯(cuò)誤報(bào)告也不進(jìn)行數(shù)據(jù)的重傳。經(jīng)過簡化之后,TCP協(xié)議在實(shí)現(xiàn)上就變得相對容易,但是核心功能依然完備[3]。
系統(tǒng)的硬件部分主要核心處理器ARM7和網(wǎng)絡(luò)控制器ENC28J60組成。ARM7負(fù)責(zé)運(yùn)行整個(gè)TCP/IP協(xié)議棧軟件,同時(shí)需要對收發(fā)的數(shù)據(jù)包進(jìn)行處理;ENC28J60負(fù)責(zé)發(fā)送和接收網(wǎng)絡(luò)數(shù)據(jù)包,整個(gè)硬件平臺采用3.3V的統(tǒng)一電源進(jìn)行供電,ARM7通過SPI接口與ENC28J60通信,最終實(shí)現(xiàn)設(shè)備與PC機(jī)的交互。
設(shè)計(jì)完協(xié)議棧之后我們需要將其移植到硬件平臺中,為了便于數(shù)據(jù)的管理,在ARM7中具體實(shí)現(xiàn)時(shí),我們使用一個(gè)全局的Buf數(shù)組來存放一個(gè)完整的MAC數(shù)據(jù)幀,每次發(fā)送數(shù)據(jù)包之前,都按照數(shù)據(jù)幀的格式將這個(gè)數(shù)據(jù)幀填充完畢,然后調(diào)用ENC28J60_ SendPkt()發(fā)送出去;同樣,當(dāng)ENC28J60收到數(shù)據(jù)時(shí),我們?nèi)匀粚⒄麄€(gè)數(shù)據(jù)幀讀入這個(gè)全局緩沖區(qū)中,然后依次進(jìn)行數(shù)據(jù)的解封裝操作。最后,為了驗(yàn)證程序的正確性,我們將設(shè)計(jì)的程序下載到的硬件平臺中,用網(wǎng)線將硬件平臺與計(jì)算機(jī)相連,同時(shí)借助于Wireshark進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)包的捕獲與分析。通過在PC機(jī)上執(zhí)行簡單的PING測試可以驗(yàn)證整個(gè)系統(tǒng)的連通性,然后通過網(wǎng)絡(luò)調(diào)試助手測試TCP的通信功能[4]。
本文設(shè)計(jì)了一個(gè)面向嵌入式系統(tǒng)的TCP/IP協(xié)議棧,運(yùn)輸層使用TCP協(xié)議進(jìn)行通信,所以數(shù)據(jù)傳輸也能得到保證,整個(gè)設(shè)計(jì)具有很好的參考價(jià)值。
[1]張青青.LwIP協(xié)議棧的移植[J].信息系統(tǒng)工程,2015(8):139.
[2]Microchip Technology Inc.ENC28J60數(shù)據(jù)手冊[OL].http:// www.microchip.com/.
[3]謝希仁.計(jì)算機(jī)網(wǎng)絡(luò)(第6版)[M].北京:電子工業(yè)出版,2013,6.
[4]W.Richard Stevens.TCP/IP詳解卷1:協(xié)議[M].北京:機(jī)械工業(yè)出版社,2000,4.
Design and application of Embedded TCP/IP stack
XU Guang
(Institute of 715,China Shipbuilding Industry Corporation)
This paper introduces a method of designing an embedded TCP/IP stack.The article also shows how to run the stack in ARM7 process with the network controller ENC28j60.The method has certain reference value.
Embedded TCP/IP stack;ENC28J60;ARM7