999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

LwIP協議棧的pbuf結構探索與研究

2018-03-01 00:36:52
單片機與嵌入式系統應用 2018年2期
關鍵詞:嵌入式分配結構

(西安工程大學 電子信息學院,西安 710048)

引 言

隨著工業 4.0 的提出和工業以太網的普及,越來越多的工業設備急需接入 Internet[14-15]。 以太網是嵌入式系統的一個重要模塊[8]。實現嵌入式設備的互聯必須要有網絡協議的支持[4]。LwIP在嵌入式通信中占有很重要的地位,主要是由于其占用資源較少。實驗表明,運行該協議只需要20 KB的RAM和40 KB的ROM[2]。LwIP協議為數據通信提供了基礎[5]。pbuf結構對于LwIP而言是非常重要的,它關系到數據存放的問題,由于不同類型pbuf的內存分配方式有所不同,那就意味著將會儲存不同類型的數據包。如果對pbuf沒有一個深刻的了解和認識,就不能靈活地運用pbuf的類型。靈活運用pbuf的類型對于數據包的接收和發送是非常重要的[13],如果不能合理地分配儲存空間的大小和pbuf類型,可能導致數據丟失和空間的浪費。為了解決上述問題,本文對pbuf結構進行了深度分析,并設計了內存分配實驗。

1 pbuf結構介紹

LwIP是瑞士計算機科學院開發的一套用于嵌入式系統的開源TCP/IP協議棧[7,12],用于嵌入式系統的開放源代碼的 TCP/IP 協議棧[8]。 LwIP提供一系列函數實現IP、TCP、UDP等操作[10]。對數據包如何進行處理,在LwIP“輕型IP協議(Light Weight IP)”[21]中是非常重要的一個環節。在網卡驅動編寫時最核心的部分是數據的存儲與傳輸方式[6]。而在LwIP中主要利用4種不同類型的pbuf來對數據包進行分類管理。

由于實際存入pbuf結構的數據可能會很大,所以需要由多個pbuf才可以實現對數據包的存放。這些pbuf可以是相同的類型,也可以是多種類型的混合使用。pbuf的申請和釋放是通過兩個函數pbuf_alloc()和pbuf_free()來完成的,pbuf_alloc()函數中含有兩個重要的參數:layer和type,其中枚舉類型pbuf_layer通過參數layer決定是協議棧的哪一層(PBUF_TRANSPORT、PBUF_IP、PBUF_LINK以及PBUF_RAW)和pbuf中的offset“偏移量”。pbuf的類型主要通過枚舉類型Pbuf_type體現出來,然后根據參數type的不同進行不同的選擇,最后再通過switch語句選擇用哪一種類型。LwIP中的 pbuf 有4種類型: PBUF_POOL、PBUF_RAM、PBUF_ROM、PBUF_REF[1]。pbuf結構如下:

struct pbuf {

struct pbuf *next; /*指向下一個pbuf*/

void *payload; /*指向數據緩沖區*/

u16_t tot_len; /*所有pbuf的數據長度*/

u16_t len; /*當前pbuf的數據長度*/

u8_t type; /*pbuf類型*/

u8_t flags /*狀態標志*/

u16_t ref; /*記錄當前pbuf被引用次數*/

};

2 pbuf類型的探索與研究

2.1 PBUF_RAM類型

PBUF_RAM類型的pbuf是從LwIP的內存堆中申請得到的,主要用來儲存協議棧和應用程序中的待發送數據,所以在學習和了解PBUF_RAM之前要先對內存堆的結構進行分析和了解。從圖 1內存堆的結構示意圖中可以看出,每一個被分配的存儲塊都包含一個小的結構。其結構體的成員變量分別包括next、prev以及used。為了能夠更加清楚地了解內存堆的分配狀況,特意對其組織結構圖進行了顏色區別,其中陰影部分表示被分配(used 被置位為1),否則為0。內存堆組織結構還可以通過*next和*prev將相鄰的結構塊連接起來。在內存堆分配內存時需要注意:在其分配時每個內存塊的大小是有一定差異的,而且可能會隨時變動。在對內存堆分析過后,再對PBUF_RAM類型的pbuf進行代碼講解,其源代碼主要在源文件pbuf.c中。其部分代碼如下:

case PBUF_RAM:

p=(structpbuf*)mem_malloc(LwIP_MEM_ALIGN_S

IZE(SIZEOF_STRUCT_PBU+offset)+LwIP_MEM_ALIGN_SIZE(length));

/*獲取PBUF_RAM類型內存大小*/

if (p == NULL) {return NULL;}

p->payload = LwIP_MEM_ALIGN((void *)((u8_t *)

p+SIZEOF_STRUCT_PBUF+offset));

p->len = p->tot_len = length;/*數據包幀的大小*/

p->next = NULL;

p->type = type;

break;

圖2 PBUF_RAM類型的pbuf結構

通過源代碼可知,PBUF_RAM類型的pbuf結構內存的大小分別包括offset、length和SIZEOF_STRUCT_PBU。其中offset表示一個偏移量里面用來存儲一些首部字段,如TCP報文首部、IP首部等。由于next和payload占用4個字,然而tot_len、len和ref占用2個字節,type和flags為1個字節,因為圖2中每一行分配為4個字節,所以next和payload各占用一行,tot_len和len兩者共同占用一行,而type、flags和ref三者共同占用一行,最后的空白區域表示數據存儲區。又因為其先后順序不同,最終申請的PBUF_RAM類型的pbuf結構如圖2所示。

2.2 PBUF_POOL類型

PBUF_POOL類型的pbuf與PBUF_RAM類似,都包括offset、length和SIZEOF_STRUCT_PBU,不同之處在于兩者申請內存的地方不同,從而導致特性不同,由于分配PBUF_POOL速度快,所以可以用來存放對分配內存速度要求較高的數據。其部分代碼如下:

p=(structpbuf*)memp_malloc(MEMP_PBUF_POOL);

/*獲取PBUF_POOL內存大小*/

if (p == NULL) {

PBUF_POOL_IS_EMPTY();

return NULL;}

p->type = type;

p->next = NULL;

p->payload = LwIP_MEM_ALIGN((void *)((u8_t *)

p + (SIZEOF_STRUCT_PBUF + offset)));

break;

由于PBUF_POOL類型的pbuf其內存是從MEMP_PBUF_POOL中申請得到的,所以能夠通過在MEMP_PBUF_POOL中改變宏定義PBUF_POOL_SIZE的大小來設置內存池的個數,通過改變PBUF_POOL_BUFSIZE的數值來改變內存池大小。但是其不能設置的太大,要根據數據實際應用的大小來定義,因為每個POOL都具有固定大小,如果設置太大會造成內存的浪費[16],如果設置太小可能會出現以下問題:

① 每個pbuf結構在內存池中占用的內存大小是一定的,假如POOL設置太小,就會導致內存利用率下降;

② 如果pbuf中數據區分配太小,可能會導致數據分組首部信息得存放到下一個pbuf結構中,從而導致操作不方便。

事實上,應用程序發送和接收的數據可能會遠遠大于一個PBUF_POOL所存儲的數據量,而且內存池類型的內存分配每次分配到的大小是固定的,圖3所示一般需要多個PBUF_POOL類型并通過指針next指向下一個PBUF_POOL類型,從而使多個PBUF_POOL類型鏈接成一個鏈表,用于存儲數據分組。雖然經過多次分配構成一個鏈表,但是它們仍然是一個數據包,因此只有第一個pbuf有offset來存儲有關數據包的信息,其余的則不需要。

圖3 PBUF_POOL

2.3 PBUF_ROM和PBUF_REF類型

圖4 PBUF_ROM和PBUF_REF

PBUF_ROM、PBUF_REF與PBUF_POOL一樣都是從內存池中申請得到的,但是不同之處是它們使用的是內存池MEMP_PBUF。如圖4所示,這兩種類型的pbuf所申請的內存主要是用來存放pbuf結構體,并沒有給數據空間申請內存,但是這兩個的數據空間可以應用其它地方的內存(RAM/ROM)進行數據存儲。

3 pbuf的釋放

在對pbuf進行內存釋放的時候是通過調用pbuf_free()來完成,當釋放pbuf的時候,LwIP會自動檢測pbuf的類型,然后再調用相關的函數進行相對應的刪除。但是在對其內存進行釋放的時候需要先滿足一定的條件,其中主要是通過檢測ref“引用(reference)”的大小,只有當ref的數值不小于1的時候,pbuf才有可能被釋放,但不是一定會被釋放,當有其它類型的pbuf通過next指針指向該pbuf的時候,其相對應的ref的值就會相對應的增加1,當釋放pbuf的時候其先對應的那個ref數值也會相對應的減去1。當有多個pbuf結構連接在一起時,釋放第一個pbuf時,該pbuf鏈的第二個節點就會成為pbuf鏈的第一個節點同時會自動檢測pbuf節點是否被其它的所引用,即判斷ref是否大于1,如果不大于則繼續刪除,否則終止。

4 試驗結果

本實驗是在以Cortex-M3為內核的開發板上進行[9],對PBUF_RAM類型的pbuf在RAM中的內存分配和釋放進行模擬實驗,探究了其如何進行內存分配和存儲數據以及如何進行內存的釋放。因為pbuf的類型較多,而且在對數據管理的時候可能為多種類型混合使用,不易針對某個類型的pbuf進行單獨內存分配和釋放實驗。對該內存堆的操作類似于C語言中的malloc/free[1,3]。所以該實驗主要是通過運用malloc/free函數在內部內存RAM分配和釋放內存的方式來模擬PBUF_RAM在RAM中的分配和釋放[16-18],并通過LCD進行字符串的存儲地址、寫入的字符串,以及RAM使用率的顯示。

其中圖5、圖6中的SRAMIN USED字樣表示RAM的使用率,Addr用來表示數據存放的地址。通過圖5可以看出,當向內部內存RAM中寫入字符串“Memory Malloc Test123”時,其內存使用率為10%,存儲地址為0X2000 92C0,說明已經將字符串寫入到RAM中。圖6是對其內存釋放,可以看出其內存使用率減小,其地址變為0X0000 0000,表明將RAM中的數據進行了釋放,但是其內存使用率理論上應該為0,這里的5%就是內存碎片。由于嵌入式系統的內存空間是非常寶貴的,尤其對于數據的傳輸而言,如果每次傳輸都產生碎片,那就是資源的浪費。所以對pbuf結構的分析與探究是非常必要的。

圖5 內存申請

圖6 內存釋放

結 語

[1] 付曉軍,夏應清,何軒.嵌入式LwIP協議棧的內存管理[J].電子技術應用,2006(3):56-57.

[2] 來愛華,盧軍,游繼安.基于LwIP協議的多點控制系統研究[J].湖北工程學院學報,2016,36(3):28-33.

[3] 蔡雄飛,王新華,郭淑琴.嵌入式TCP/IP協議LwIP的內存管理機制研究[J].杭州電子科技大學報,2012,32(4):118-121.

[4] 王祖云,楊思國,王建偉,等.嵌入式LwIP協議棧的移植與測試研究[J].計算機與數字工程,2014,42(2):272-275,318.

[5] 趙智增,馮春鵬.基于STM32的以太網接口轉多串口透傳模塊設計[J]. 山西電子技術,2016(2):30-33.

[6] 曹紹華,史永宏.基于32位處理器的網絡驅動及協議棧研究[J].現代電子技術,2016,39(19):317-321.

[7] 張齊,勞熾元.輕量級協議棧LwIP的分析與改進[J].計算機工程與設計,2010,31(10):2169-2171,2256.

[8] 韓德強,楊淇善,王宗俠,等.基于μC/OS-III的LwIP協議棧的移植與實現[J].電子技術應用,2013,39(5):18-21.

[9] 楊明極,祝慶峰,李碩.基于STM32的嵌入式網絡控制器設計[J].測控技術,2014,33(10):93-96.

[10] 徐立艷.基于ARM和LabVIEW的網絡數據采集測試系統設計[J].現代電子技術,2016,39(5):24-27,32.

[11] 高羅卿,莊源昌.基于LwIP協議的嵌入式遠程監控終端的研發與實現[J].電氣自動化,2015,37(1):49-51.

[12] 劉培剛,杜靖中.基于μC/OS-II和LwIP嵌入式設備以太網通信研究與實現[J].電子設計工程,2017,25(16):129-133.

[13] 薛建彬,郭燕波,許洋,等.LwIP在微控制系統中的移植與應用[J].數字技術與應用,2016(10):2.

[14] 周一兵,劉憲鵬.LwIP 在嵌入式系統中的應用[J].科技視界,2013(6):40.

[15] 曹輝.基于μC/OS-III的嵌入式web服務器的應用研究[J].自動化技術與應用,2016,35(2):36-39.

[16] 鄢濤,于曦.基于C++的高效內存池的設計與實現[J].成都大學學報:自然科學版,2017,36(3):257-261.

[17] Bryant R E.深入理解計算機系統[M].龔奕利,等譯.北京:北京機械工業出版社,2016.

[18] Wang N,Liu X,He J,et al.Collaborative memory pool inCluster system[C]//International Conference on ParallelProcessing,007.China:Xi'an,2007.

[19] 侯捷.STL 源碼剖析[M].武漢:華中科技大學出版社,2002.

[20] HAN D,YANG Q,WANG Z,et al.Implementationof LwIP porting based on μC/OS-III[J].Application of Electronic Technique,2013.

[21] 蔣俊,鐘偉勝.μC/OS-II和LwIP的并發服務器與代理線程設計模式[J].單片機與嵌入式系統應用,2014(12):42-44.

徐健(副教授),主要研究方向為電能質量、數字信號處理;孫慶,主要研究方向為計算機控制網絡。

猜你喜歡
嵌入式分配結構
《形而上學》△卷的結構和位置
哲學評論(2021年2期)2021-08-22 01:53:34
應答器THR和TFFR分配及SIL等級探討
論結構
中華詩詞(2019年7期)2019-11-25 01:43:04
遺產的分配
一種分配十分不均的財富
績效考核分配的實踐與思考
搭建基于Qt的嵌入式開發平臺
嵌入式軟PLC在電鍍生產流程控制系統中的應用
電鍍與環保(2016年3期)2017-01-20 08:15:32
論《日出》的結構
創新治理結構促進中小企業持續成長
現代企業(2015年9期)2015-02-28 18:56:50
主站蜘蛛池模板: 亚洲不卡av中文在线| 黄网站欧美内射| 九九热精品在线视频| 亚洲乱亚洲乱妇24p| 亚洲美女久久| 最新加勒比隔壁人妻| 免费人成在线观看成人片| 无码久看视频| yy6080理论大片一级久久| 国产精品第一区在线观看| 日韩精品毛片| 欧美成人看片一区二区三区| 五月婷婷综合网| 欧美人在线一区二区三区| 亚洲一区二区无码视频| 视频一区亚洲| 欧美激情网址| 亚洲男人的天堂在线| 久久99精品久久久大学生| 精品欧美一区二区三区久久久| 老司机午夜精品视频你懂的| 国产成人超碰无码| 欧美亚洲欧美区| 中文字幕 欧美日韩| 亚洲天堂日韩在线| 综合色区亚洲熟妇在线| 亚洲精品无码日韩国产不卡| 国产在线视频福利资源站| 老司机久久99久久精品播放| 四虎在线观看视频高清无码| 国产成人综合在线视频| 国产在线拍偷自揄观看视频网站| 72种姿势欧美久久久大黄蕉| 9啪在线视频| 找国产毛片看| 久久男人资源站| 国产成人8x视频一区二区| 亚洲日韩精品伊甸| 欧美午夜视频在线| 日韩东京热无码人妻| 亚洲一区二区在线无码| 亚洲国产一区在线观看| 久久久亚洲色| 久久夜色精品国产嚕嚕亚洲av| 亚洲欧美日韩中文字幕在线| 欧美成人午夜在线全部免费| 嫩草国产在线| 精品国产91爱| 国产噜噜在线视频观看| 性69交片免费看| 91网址在线播放| 亚洲欧美激情小说另类| 欧美精品成人| 国产在线视频二区| 日韩国产无码一区| 国产玖玖视频| 国产在线视频福利资源站| 原味小视频在线www国产| 97综合久久| 国产精品xxx| 日韩小视频在线播放| 精品视频一区在线观看| 特级aaaaaaaaa毛片免费视频 | 一级一毛片a级毛片| 免费国产小视频在线观看| 激情综合网激情综合| 91亚洲视频下载| 干中文字幕| 国产精品女同一区三区五区| jizz国产视频| 久久精品视频一| 日韩无码视频播放| 欧美在线视频不卡| 2019年国产精品自拍不卡| 青青青视频91在线 | 国产午夜人做人免费视频| 国产精品青青| 影音先锋丝袜制服| 久久久噜噜噜| 国产h视频免费观看| 美女扒开下面流白浆在线试听| 日日噜噜夜夜狠狠视频|