国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

物聯(lián)網(wǎng)中嵌入式TCP/IP協(xié)議棧的設(shè)計(jì)技巧

2011-01-23 03:31:10劉波濤
關(guān)鍵詞:拷貝下層數(shù)據(jù)包

劉波濤

(長江大學(xué) 計(jì)算機(jī)科學(xué)學(xué)院,湖北 荊州 434023)

當(dāng)前,物聯(lián)網(wǎng)技術(shù)正受到研究者的廣泛關(guān)注[1],而在物聯(lián)網(wǎng)技術(shù)中的一個關(guān)鍵問題[2-4],就是要實(shí)現(xiàn)嵌入式設(shè)備聯(lián)入Internet.嵌入式設(shè)備接入Internet的方法很多,其中一種方法[5-8]就是在嵌入式設(shè)備中實(shí)現(xiàn)裁剪后的TCP/IP協(xié)議棧.通用計(jì)算機(jī)系統(tǒng)有足夠的資源支持系統(tǒng)在內(nèi)核中實(shí)現(xiàn)復(fù)雜的標(biāo)準(zhǔn)TCP/IP協(xié)議棧,而這對只有有限資源的嵌入式系統(tǒng)來說,既不可能也沒有必要.因此,針對嵌入式系統(tǒng)的特點(diǎn),把握嵌入式TCP/IP協(xié)議棧設(shè)計(jì)的技巧就顯得尤為重要.

1 嵌入式系統(tǒng)的特點(diǎn)

在理解嵌入式TCP/IP協(xié)議棧設(shè)計(jì)技巧前,需了解嵌入式系統(tǒng)的特點(diǎn),特別是其資源較少的特點(diǎn).

嵌入式系統(tǒng)與通用計(jì)算機(jī)系統(tǒng)的本質(zhì)區(qū)別在于系統(tǒng)應(yīng)用的不同,嵌入式系統(tǒng)是將計(jì)算機(jī)系統(tǒng)嵌入到對象系統(tǒng)中.因此,嵌入式系統(tǒng)與通用計(jì)算機(jī)系統(tǒng)相比,主要具有以下特點(diǎn)[9]:第一,嵌入式系統(tǒng)是面向特定應(yīng)用的系統(tǒng).嵌入式系統(tǒng)與通用型系統(tǒng)的最大區(qū)別就在于嵌入式系統(tǒng)大多為特定用戶群設(shè)計(jì)的系統(tǒng),因此它通常都具備低功耗、體積小、集成度高等特點(diǎn),并且可以滿足不同應(yīng)用的特定需求;第二,嵌入式系統(tǒng)的硬件和軟件都必須進(jìn)行高效地設(shè)計(jì),量體裁衣、去除冗余,這樣才能更具競爭力;第三,為了提高執(zhí)行速度和系統(tǒng)可靠性,嵌入式系統(tǒng)中的軟件一般都固化在Flash或ROM中,而不是存儲在磁盤中;第四,嵌入式系統(tǒng)本身不具備二次開發(fā)能力,即設(shè)計(jì)完成后用戶通常不能對其中的程序功能進(jìn)行修改,必須有一套開發(fā)工具和環(huán)境進(jìn)行再次開發(fā).

2 嵌入式TCP/IP協(xié)議棧設(shè)計(jì)技巧

正因?yàn)榍度胧较到y(tǒng)不像通用計(jì)算機(jī)那樣有豐富的系統(tǒng)資源,因此必須針對嵌入式系統(tǒng)的特點(diǎn),來設(shè)計(jì)協(xié)議棧的實(shí)現(xiàn)技巧,否則協(xié)議棧實(shí)現(xiàn)的再好,但由于缺乏嵌入式系統(tǒng)的支持,也將是徒勞無功.

2.1 零拷貝

TCP/IP協(xié)議棧的工作過程如圖1所示.數(shù)據(jù)以一定的單位(通稱為數(shù)據(jù)包)在發(fā)送端一方由應(yīng)用進(jìn)程交給協(xié)議棧,數(shù)據(jù)包在協(xié)議棧從上層至下層被依次封裝,即將上層的整個數(shù)據(jù)包作為下層的數(shù)據(jù)部分,再添加下層的首部,而作為新的數(shù)據(jù)包;在接收端,數(shù)據(jù)包則經(jīng)由協(xié)議棧從下層至上層被依次解包:即將下層的首部剝?nèi)ィ⒏鶕?jù)其內(nèi)容將數(shù)據(jù)部分交付上層的協(xié)議處理,最后應(yīng)用層的數(shù)據(jù)交由應(yīng)用進(jìn)程處理[10].

圖1 TCP/IP協(xié)議棧的工作過程

為了保證協(xié)議棧中層與層之間的封裝性,一般TCP/IP的實(shí)現(xiàn)過程中多采用層層拷貝的原則.也就是說,在封包時,將上層協(xié)議的數(shù)據(jù)包從上層協(xié)議拷貝到下層協(xié)議的數(shù)據(jù)空間中;而在解包時,將數(shù)據(jù)包從下層協(xié)議拷貝到上層協(xié)議的數(shù)據(jù)空間中.而對應(yīng)于嵌入式系統(tǒng),特別是資源極其有限的單片機(jī)系統(tǒng)及SOC片上的系統(tǒng),如果在封包或解包時按上述方法來拷貝數(shù)據(jù),則需要很多的緩沖區(qū)并且耗費(fèi)大量嵌入式CPU拷貝時間.顯然,這是不明智的.

因此,筆者設(shè)計(jì)的數(shù)據(jù)包封裝及解封裝采用了如下方法:在層與層之間交換信息時,以數(shù)據(jù)緩沖區(qū)首指針作為函數(shù)參數(shù)進(jìn)行傳遞;在封裝時,上層協(xié)議在分配空間時充分考慮以后下層協(xié)議的封裝,并在緩沖區(qū)首部多分配一些必要的空間,便于下層協(xié)議在不需要從上層拷貝的情況下直接填充該層的首部.例如,HTTP協(xié)議在分配數(shù)據(jù)空間時多分配54字節(jié)用于隨后的TCP、IP和Ethernet協(xié)議首部的填充;在解封裝時,也將收到的原始數(shù)據(jù)包首地址直接傳給向上層協(xié)議,便于上層協(xié)議獲取下層協(xié)議的一些必要信息.如讓TCP層知道數(shù)據(jù)包的源IP地址,以便于填充TCP傳輸控制塊的目的IP地址字段.因此,這種方式不僅節(jié)約了系統(tǒng)的資源,而且會因?yàn)椴恍枰截悢?shù)據(jù)包而提高了系統(tǒng)的處理速度.

2.2 動態(tài)內(nèi)存管理

不管是零拷貝還是層層拷貝,都需要分配一定的內(nèi)存來支持實(shí)現(xiàn).嵌入式系統(tǒng)不像通用計(jì)算機(jī)那樣,內(nèi)存資源豐富,一般內(nèi)存較少,因此更應(yīng)該“精打細(xì)算”.考慮到Internet網(wǎng)絡(luò)中接收和發(fā)送的數(shù)據(jù)包大小不一,即收到的和發(fā)送的數(shù)據(jù)包長度都不是一個定值,例如以太網(wǎng)數(shù)據(jù)包的長度范圍值是64至1518字節(jié),因此對內(nèi)存的分配應(yīng)該采用動態(tài)的方式進(jìn)行管理.有如下兩種方案可供選擇:方案一,是每次分配一個固定長度的緩存.讓該緩存能夠容納一個最大的數(shù)據(jù)包,且在該緩存中設(shè)置一個字段用來存儲其有效數(shù)據(jù)的長度,顯然這種方案實(shí)現(xiàn)簡單,但是浪費(fèi)了寶貴內(nèi)存資源;方案二,是按需分配合適大小的緩存,而不管該緩存是用于底層接收數(shù)據(jù)還是用于上層發(fā)送數(shù)據(jù),這種方案節(jié)約了內(nèi)存資源.因此,筆者建議采用方案二來實(shí)現(xiàn)數(shù)據(jù)包緩存的動態(tài)分配.

需要注意的是,動態(tài)管理內(nèi)存就肯定會面臨“內(nèi)存泄露”的風(fēng)險(xiǎn),它最終會將系統(tǒng)的可用內(nèi)存耗盡,最終會使嵌入式設(shè)備崩潰、停止運(yùn)行.為避免這個風(fēng)險(xiǎn)的出現(xiàn),嵌入式TCP/IP協(xié)議棧實(shí)現(xiàn)過程中,應(yīng)該遵從“誰分配誰釋放”的原則來進(jìn)行內(nèi)存的動態(tài)管理.例如,HTTP有數(shù)據(jù)包需要發(fā)送,那么在它依次調(diào)用完TCP發(fā)送模塊函數(shù)、IP發(fā)送模塊函數(shù)、驅(qū)動發(fā)送函數(shù)后,應(yīng)該釋放它申請的動態(tài)內(nèi)存.

2.3 模塊化設(shè)計(jì)

因?yàn)門CP/IP協(xié)議棧本身就是一個分層的軟件系統(tǒng),故應(yīng)該按協(xié)議將協(xié)議棧實(shí)現(xiàn)分為若干個模塊文件,讓每個模塊實(shí)現(xiàn)一層每一個協(xié)議的功能,如圖2所示.在圖2中,在頭文件(*.H)中定義了該模塊對外的接口變量及函數(shù)接口聲明,而在源文件(*.C)中則定義了相關(guān)的變量和函數(shù).要引用某模塊的變量或調(diào)用其中的函數(shù)時,只需包含此模塊的頭文件即可.這樣設(shè)計(jì)之后,分工明確,程序清晰,可讀性好,便于程序的維護(hù)及修改.

圖2 協(xié)議棧實(shí)現(xiàn)的文件目錄

圖3 嵌入式TCP/IP軟件構(gòu)成層次圖

2.4 分層設(shè)計(jì)

嵌入式處理器多種多樣,嵌入式設(shè)備類型豐富,廠家眾多,因此,在進(jìn)行嵌入式軟件的設(shè)計(jì)過程中應(yīng)該充分考慮這一點(diǎn),實(shí)現(xiàn)盡可能的方便移植.為了使嵌入式TCP/IP協(xié)議棧具備良好的可移植性,以便適應(yīng)多種目標(biāo)平臺,可將實(shí)現(xiàn)分為硬件無關(guān)層和硬件依賴層,如圖3所示.在圖3中,硬件無關(guān)層的實(shí)現(xiàn)使用高級語言完成,例如C語言,以方便將硬件無關(guān)層相關(guān)代碼移植到所有其他能夠編譯C代碼的硬件平臺上;在硬件依賴層中使用特殊機(jī)制,例如C語言中的#define宏定義來重新定義數(shù)據(jù)類型,這樣就可根據(jù)移植環(huán)境的變化來重新定義數(shù)據(jù)類型,以盡量消除系統(tǒng)對于具體編譯器的依賴;依賴層和無關(guān)層間采用統(tǒng)一的接口交互信息,當(dāng)硬件平臺改變時,只需改動硬件依賴層的各驅(qū)動程序?qū)崿F(xiàn),在其接口函數(shù)名稱與參數(shù)不變的情況下,硬件無關(guān)層無需改變,從而屏蔽了硬件實(shí)現(xiàn)的差異.

2.5 其他技巧

由于嵌入式的系統(tǒng)運(yùn)行速度和內(nèi)存容量有限,在設(shè)計(jì)時還應(yīng)遵循下列原則:盡量避免使用全局變量或外部變量,全局變量或外部變量在整個程序運(yùn)行期間都要占用內(nèi)存,所以要盡量少用全局變量或外部變量,而盡量多地用局部變量.因此,建議采用函數(shù)參數(shù)傳遞的方式來共享信息;占用內(nèi)存較多的變量應(yīng)該定義在外部RAM中.因嵌入式處理器的內(nèi)部RAM可用存儲空間非常有限,占用過多的內(nèi)部RAM會使嵌入式處理的硬件堆棧溢出,從而導(dǎo)致函數(shù)調(diào)用失敗.如實(shí)現(xiàn)嵌入式TCP/IP協(xié)議棧中的TCP傳輸控制塊數(shù)組較大,就應(yīng)當(dāng)定義在外部RAM中.

圖4 測試內(nèi)存泄露時輸出的信息

圖5 客戶端動態(tài)獲取服務(wù)傳感器溫度

3 測試結(jié)果

遵循前述設(shè)計(jì)思路,筆者在單片機(jī)W78E58B上實(shí)現(xiàn)了一個嵌入式TCP/IP協(xié)議棧[5],并在此基礎(chǔ)上實(shí)現(xiàn)了一個嵌入式Web服務(wù)器.采用的測試方法是將該此嵌入式Web服務(wù)器與PC機(jī)在RJ-45口及串口分別對接.將嵌入式Web服務(wù)的調(diào)試信息從串口輸出,并由串口精靈顯示[11].圖4顯示的是對其進(jìn)行內(nèi)存泄露的測試.筆者對系統(tǒng)的內(nèi)存塊進(jìn)行相關(guān)記錄和統(tǒng)計(jì):Len字段記錄是本次分配的內(nèi)存長度,UsedMemLen字段記錄的是所用內(nèi)存總長度,F(xiàn)reeMemLen字段記錄的是空閑內(nèi)存的長度;每一條信息表明了某個內(nèi)存塊分配或釋放所在函數(shù)名及所處時刻.如由圖4可知,每條信息對應(yīng)的UsedMemLen與FreeMemLen之和是一個定值,也就是說,筆者遵照這一思路設(shè)計(jì)的嵌入式Web服務(wù)器不存在內(nèi)存泄露的風(fēng)險(xiǎn).

對嵌入式Web服務(wù)器進(jìn)行相關(guān)功能測試,如圖5所示.由圖可知,嵌入式Web服務(wù)器能完成數(shù)據(jù)的下載及上傳功能,遵照這一思路設(shè)計(jì)的嵌入式TCP/IP協(xié)議棧運(yùn)行穩(wěn)定可靠.

4 結(jié)論

本文總結(jié)了在實(shí)現(xiàn)嵌入式TCP/IP協(xié)議棧的過程中,應(yīng)該注意的設(shè)計(jì)技巧.并做了相關(guān)測試,驗(yàn)證了該技巧的可行性.這為嵌入式設(shè)備中順利實(shí)現(xiàn)嵌入式TCP/IP協(xié)議棧,從而實(shí)現(xiàn)物聯(lián)網(wǎng)技術(shù)打下了堅(jiān)實(shí)的基礎(chǔ).

[1]劉書艷.十年后,物聯(lián)網(wǎng)風(fēng)行[N].中華工商時報(bào),2010-3-5(7).

[2]International Telecommunication Union UIT.ITU Internet Reports 2005:The Internet of Things[R].2005.

[3]王保云.物聯(lián)網(wǎng)技術(shù)研究綜述[J].電子測量與儀器學(xué)報(bào),2009,23(12):1-7.

[4]AMARDEO C,SARMA,J G.Identities in the Future Internet of Things[J].Wireless Pers Commun 2009,49:353-363.

[5]馮翠麗,劉波濤.一種嵌入式TCP/IP協(xié)議棧的設(shè)計(jì)與實(shí)現(xiàn)[J].長江大學(xué)學(xué)報(bào),2008,5(4):331-333.

[6]陳立家,焦戰(zhàn)立,熊文龍.基于精簡TCP/IP協(xié)議棧網(wǎng)絡(luò)服務(wù)器的實(shí)現(xiàn)[J].武漢理工大學(xué)學(xué)報(bào),2007,31(3):565-568.

[7]任會平,王平,徐櫞.低成本嵌入式web服務(wù)器的研究[J].微計(jì)算機(jī)信息,2008,24(10):23-25.

[8]陳立家,焦戰(zhàn)立,熊文龍.基于精簡TCP/IP協(xié)議棧網(wǎng)絡(luò)服務(wù)器的實(shí)現(xiàn)[J].武漢理工大學(xué)學(xué)報(bào),2007,31(3):565-568.

[9]牛茹.基于嵌入式系統(tǒng)的農(nóng)業(yè)數(shù)據(jù)采集傳輸關(guān)鍵技術(shù)研究[D].咸陽:西北農(nóng)林科技大學(xué),2008.

[10]劉波濤,賈菡,馮翠麗,等.嵌入式Web服務(wù)器中TCP/IP協(xié)議棧的裁剪設(shè)計(jì)[J].西安通訊學(xué)院學(xué)報(bào),2008,7(4):28-30.

[11]劉波濤,馮翠麗,王青海,等.應(yīng)用RTL8019AS的嵌入式Web服務(wù)器硬件實(shí)現(xiàn)[J].長江大學(xué)學(xué)報(bào),2008,5(1):75-78.

猜你喜歡
拷貝下層數(shù)據(jù)包
SmartSniff
中國生殖健康(2018年1期)2018-11-06 07:14:38
一類多個下層的雙層規(guī)劃問題
積雪
陜西橫山羅圪臺村元代壁畫墓發(fā)掘簡報(bào)
考古與文物(2016年5期)2016-12-21 06:28:48
基于Libpcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲器的設(shè)計(jì)與實(shí)現(xiàn)
有借有還
視覺注意的數(shù)據(jù)包優(yōu)先級排序策略研究
移動IPV6在改進(jìn)數(shù)據(jù)包發(fā)送路徑模型下性能分析
文件拷貝誰最“給力”
介休市| 新沂市| 平潭县| 梅河口市| 岱山县| 镇安县| 廉江市| 乡宁县| 五指山市| 阳城县| 兴安盟| 乐清市| 祁东县| 红河县| 区。| 天镇县| 嫩江县| 通州市| 桐乡市| 桦南县| 棋牌| 肇州县| 洛南县| 余干县| 房产| 庆城县| 临颍县| 玉树县| 郯城县| 南丹县| 固安县| 南昌市| 南溪县| 亳州市| 合江县| 富川| 晋城| 贵南县| 阿瓦提县| 富裕县| 长白|