色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

LWIP內(nèi)存管理知識(shí)匯總

Q4MP_gh_c472c21 ? 2018-03-06 10:01 ? 次閱讀

一LWIP內(nèi)存管理

LWIP的內(nèi)存管理使用了2種方式:內(nèi)存池memp和內(nèi)存堆mem,如圖1所示。

內(nèi)存池的特點(diǎn)是預(yù)先開辟多組固定大小的內(nèi)存塊組織成鏈表,實(shí)現(xiàn)簡(jiǎn)單,分配和回收速度快,不會(huì)產(chǎn)生內(nèi)存碎片,但是大小固定,并且需要預(yù)估算準(zhǔn)確。

內(nèi)存堆的本質(zhì)是對(duì)一個(gè)事先定義好的內(nèi)存塊進(jìn)行合理有效的組織和管理,主要用于任意大小的內(nèi)存分配,實(shí)現(xiàn)較復(fù)雜,分配需要查找,回收需要合并,容易產(chǎn)生內(nèi)存碎片,需要合理估算內(nèi)存堆的總大小。

圖1內(nèi)存池與內(nèi)存堆

1. 數(shù)據(jù)包管理

數(shù)據(jù)包管理結(jié)構(gòu)pbuf共有四種類型,它們的特點(diǎn)和使用場(chǎng)合如表1所示。

表1 pbuf類型與特點(diǎn)

每一種pbuf分配內(nèi)存的方式都不一樣,如圖2所示。

圖2四種數(shù)據(jù)包管理結(jié)構(gòu)

只有選擇合適的pbuf類型才能發(fā)揮LWIP的最大性能,一個(gè)數(shù)據(jù)包可能是多種pbuf的組合,用鏈表連接起來(lái),如圖3所示。

圖3 pbuf鏈表

2. 設(shè)置內(nèi)存大小

為L(zhǎng)WIP開辟一個(gè)專用的內(nèi)存堆是應(yīng)該的,這樣一來(lái)LWIP的mem_alloc()和mem_free()都將基于該堆內(nèi)存進(jìn)行分配和回收,不影響其他系統(tǒng)內(nèi)存的使用。如圖1左所示,lwipopt.h文件中宏MEM_SIZE定義了堆區(qū)的大小,對(duì)于一個(gè)負(fù)荷較重的系統(tǒng)堆區(qū)需要分配較大。

圖4堆和PBUF_ROM內(nèi)存區(qū)

LWIP使用PBUF_ROM類型的內(nèi)存池來(lái)發(fā)送“只讀”數(shù)據(jù)(處于ROM中或者其他進(jìn)程中不可修改),宏MEMP_NUM_PBUF定義了該緩沖池的個(gè)數(shù),如圖2右所示。

在ISR(中斷服務(wù)程序中)經(jīng)常需要快速分配一部分內(nèi)存進(jìn)行數(shù)據(jù)存儲(chǔ),這是通過PBUF_POOL類型的緩沖區(qū)實(shí)現(xiàn)的。為此需要定義兩個(gè)宏:PBUF_POOL_SIZE定義緩沖池的個(gè)數(shù),PBUF_POOL_BUFSIZE定義單個(gè)緩沖區(qū)的大小,如圖5所示。

圖5PBUF_POOL內(nèi)存區(qū)

3宏編譯開關(guān)

若定義MEM_LIBC_MALLOC=1,直接使用C庫(kù)中的malloc、free來(lái)分配動(dòng)態(tài)內(nèi)存;否則使用LWIP自帶的mem_malloc、mem_free等函數(shù)。

若定義MEMP_MEM_MALLOC=1,則memp.c中的全部?jī)?nèi)容不會(huì)被編譯,用內(nèi)存堆來(lái)實(shí)現(xiàn)內(nèi)存池分配,使用這種方式得考慮是否能忍受內(nèi)存堆分配帶來(lái)的時(shí)間延遲。

若定義MEM_USE_POOLS=1,則mem.c中的全部?jī)?nèi)容不會(huì)被編譯,用內(nèi)存池來(lái)實(shí)現(xiàn)內(nèi)存堆的分配,使用這種方式得考慮是否能忍受因?yàn)镻OOL內(nèi)存固定大小而帶來(lái)的內(nèi)存浪費(fèi)。此外用戶需要定義宏MEM_USE_CUSTOM_POOLS=1,還需要額外實(shí)現(xiàn)一個(gè)頭文件lwippools.h,并在其中開辟一些用于內(nèi)存堆分配函數(shù)的內(nèi)存池POOL,開辟空間的格式如下:

LWIP_MALLOC_MEMPOOL_START

LWIP_MALLOC_MEMPOOL(20, 256)

LWIP_MALLOC_MEMPOOL(10, 512)

LWIP_MALLOC_MEMPOOL_END

二LWIP啟動(dòng)時(shí)序

圖6展示了LWIP啟動(dòng)時(shí)序,大部分函數(shù)都是LWIP自帶的,主要的移植代碼是eth_init()實(shí)現(xiàn)初始化以太網(wǎng)接口,啟動(dòng)程序會(huì)創(chuàng)建2個(gè)線程:tcpip_thread負(fù)責(zé)LWIP的絕大部分工作(主要是協(xié)議棧的解析和系統(tǒng)運(yùn)行),ethernetif_thread負(fù)責(zé)從網(wǎng)口接收數(shù)據(jù)包再交付給tcpip_thread線程進(jìn)行處理。

圖6LWIP啟動(dòng)函數(shù)

三LWIP運(yùn)行邏輯

1接收數(shù)據(jù)包

圖7接收數(shù)據(jù)包

當(dāng)以太網(wǎng)口接收到一個(gè)數(shù)據(jù)包后,EMAC_IRQ中斷服務(wù)程序通過信號(hào)量通知ethernetif線程,ethernetif線程調(diào)用low_level_input()接收該數(shù)據(jù)包并通過郵箱交付給tcpip_thread線程,tcpip_thread根據(jù)該數(shù)據(jù)包的類型進(jìn)行相應(yīng)處理。它是建立在消息傳遞的基礎(chǔ)上的,如圖8所示。

圖8數(shù)據(jù)包消息的產(chǎn)生和處理

2 SequentialAPI函數(shù)調(diào)用

API設(shè)計(jì)的核心在于讓用戶進(jìn)程負(fù)責(zé)盡可能多的工作,例如數(shù)據(jù)的計(jì)算、拷貝等;而協(xié)議棧進(jìn)程只負(fù)責(zé)簡(jiǎn)單的通信工作,這是很合理的,因?yàn)橄到y(tǒng)可能存在多個(gè)應(yīng)用程序,它們都使用協(xié)議棧進(jìn)程提供的通信服務(wù),保證內(nèi)核進(jìn)程的高效性和實(shí)時(shí)性是提高系統(tǒng)性能的重要保障。進(jìn)程之間通信使用IPC技術(shù),包括郵箱、信號(hào)量和共享內(nèi)存,如圖9所示。

圖9協(xié)議棧API實(shí)現(xiàn)

以函數(shù)netconn_bind()為例看API是如何實(shí)現(xiàn)的,首先用戶程序中調(diào)用函數(shù)netconn_bind()綁定一個(gè)連接,則這個(gè)函數(shù)實(shí)現(xiàn)時(shí),是通過向內(nèi)核進(jìn)程發(fā)送一個(gè)TCPIP_MSG_API類型的消息,告訴內(nèi)核進(jìn)程執(zhí)行do_bind函數(shù):在消息發(fā)送后,函數(shù)阻塞在信號(hào)量上,等待內(nèi)核處理該消息;內(nèi)核在處理消息時(shí),會(huì)根據(jù)消息內(nèi)容調(diào)用do_bind,而do_bind會(huì)根據(jù)連接的類型調(diào)用內(nèi)核函數(shù)udp_bind、tcp_bind或raw_bind;當(dāng)do_bind執(zhí)行完后,它會(huì)釋放信號(hào)量,這使被阻塞的netconn_bind得以繼續(xù)執(zhí)行,整個(gè)過程如圖10所示。

圖10API函數(shù)實(shí)現(xiàn)

四TCP/IP核心知識(shí)點(diǎn)

1. 滑動(dòng)窗口

圖11滑動(dòng)窗口

接收窗口相關(guān)的字段中,rcv_nxt是自己期望收到的下一個(gè)字節(jié)編號(hào),rcv_wnd表示接收窗口的大小,rcv_ann_wnd表示將向?qū)Ψ酵ǜ娴拇翱诖笮≈担@個(gè)值在報(bào)文發(fā)送時(shí)會(huì)被填在首部中的窗口大小字段,rcv_ann_right_edge記錄了上一次窗口通告時(shí)窗口右邊界取值。上面這四個(gè)字段都會(huì)隨著數(shù)據(jù)的發(fā)送和接收動(dòng)態(tài)地改變,如圖12所示。

圖12接收窗口

發(fā)送窗口中,lastack記錄了被接收方確認(rèn)的最高序列號(hào),snd_nxt表示自己將要發(fā)送的下一個(gè)數(shù)據(jù)的起始編號(hào),snd_wnd記錄了當(dāng)前的發(fā)送窗口大小,它常被設(shè)置為接收方通告的接收窗口值,snd_lbb記錄了下一個(gè)被應(yīng)用程序緩存的數(shù)據(jù)的起始編號(hào),如圖10所示。

上面這四個(gè)字段的值也是動(dòng)態(tài)變化的,每當(dāng)收到接收方的一個(gè)有效ACK后,lastack的值就做相應(yīng)的增加,指向下一個(gè)待確認(rèn)數(shù)據(jù)的編號(hào),當(dāng)發(fā)送一個(gè)報(bào)文后,snd_nxt的值就做相應(yīng)的增加,指向下一個(gè)待發(fā)送數(shù)據(jù),snd_nxt和lastack之間的差值不能超過snd_wnd的大小。

由于實(shí)際數(shù)據(jù)發(fā)送時(shí)是按照?qǐng)?bào)文段的形式組織的,因此可能存在這樣的情況:即使發(fā)送窗口允許,但并不是窗口內(nèi)的所有數(shù)據(jù)都能發(fā)送以填滿窗口,如圖13中編號(hào)為11~13的數(shù)據(jù),可能因?yàn)樗鼈兲〔荒芙M織成一個(gè)有效的報(bào)文段,因此不會(huì)被發(fā)送。發(fā)送方會(huì)等到新的確認(rèn)到來(lái),從而使發(fā)送窗口向右滑動(dòng),使得更多的數(shù)據(jù)被包含在窗口中,這樣再啟動(dòng)下一個(gè)報(bào)文段的發(fā)送。

圖13發(fā)送窗口

2. 三次握手

圖14連接建立過程

3. 斷開連接

圖15連接斷開過程

4.TCP狀態(tài)轉(zhuǎn)換

圖16 TCP狀態(tài)轉(zhuǎn)換圖

5. 同時(shí)打開

圖17雙方同時(shí)打開

6. 同時(shí)關(guān)閉

圖18雙方同時(shí)關(guān)閉

五正確使用LWIP

一般說(shuō)來(lái)LWIP協(xié)議棧是比較穩(wěn)定的,尤其像V1.3.2經(jīng)歷過業(yè)界廣泛使用和工程應(yīng)用,完全可以應(yīng)用于嵌入式產(chǎn)品。那為什么還是有很多人反映LWIP不穩(wěn)定呢?主要是以下幾個(gè)方面的原因:

1. 網(wǎng)絡(luò)硬件驅(qū)動(dòng)確保EMAC口接收與發(fā)送穩(wěn)定可靠

2. 移植LWIP基于OS的移植代碼正確穩(wěn)定

3. 配置LWIP根據(jù)設(shè)備RAM尺寸進(jìn)行合理配置

1) 值(PBUF_POOL_SIZE * PBUF_POOL_BUFSIZE)必須大于TCP_SND_BUF和TCP_WND,否則容易引起錯(cuò)誤;

2) 當(dāng)內(nèi)存有限時(shí)TCP發(fā)送不能太快(具體值依賴于分配內(nèi)存的大小),否則引起tcp_enqueue()邏輯錯(cuò)誤;

4. 調(diào)用LWIP的API函數(shù)正確使用API函數(shù),特別防止內(nèi)存泄露。

5. 資源不足打開報(bào)警提醒,當(dāng)資源不夠時(shí)提醒設(shè)計(jì)者

六LWIP常見問題

1. 網(wǎng)卡驅(qū)動(dòng)程序

首先,必須將協(xié)議棧完全初始化才能打開網(wǎng)絡(luò)接收功能,接收中斷必須將數(shù)據(jù)封裝在PBUF中,然后交會(huì)給協(xié)議棧內(nèi)核處理。其次,LWIP的全局變量(arp_table,netif_list,udp_pcbs等)確保賦初值0,否則容易一運(yùn)行就崩潰。

2. 內(nèi)存泄露

第一個(gè)原則(責(zé)任制):誰(shuí)分配內(nèi)存,誰(shuí)就負(fù)責(zé)回收。

第二個(gè)原則(對(duì)稱性):分配內(nèi)存者與回收內(nèi)存者一一對(duì)應(yīng)構(gòu)成閉環(huán)。

另外,需要特別注意一些系統(tǒng)函數(shù)的調(diào)用,它們也會(huì)帶來(lái)內(nèi)存泄露,如:

例1

newconn = netconn_accept(conn);

do_something_for(newconn);

netconn_close(newconn);

netconn_delete(newconn);/*一定要釋放newconn否則將導(dǎo)致內(nèi)存泄露*/

例2

inbuf = netconn_recv(conn);

do_something_for(inbuf);

netbuf_delete(inbuf);/*一定要釋放inbuf否則將導(dǎo)致內(nèi)存泄露*/

3.PC機(jī)無(wú)法與LWIP建立TCP連接

問題:PC機(jī)能夠與LWIP設(shè)備PING操作成功,但是無(wú)法建立TCP連接。

原因:通過代碼跟蹤,發(fā)現(xiàn)LWIP發(fā)出了SYN+ACK數(shù)據(jù)包,但是PC機(jī)無(wú)法接收該握手?jǐn)?shù)據(jù)包,該數(shù)據(jù)包為60字節(jié),小于以太網(wǎng)的最小長(zhǎng)度(64字節(jié)),而LWIP設(shè)備的EMAC沒有設(shè)置短小數(shù)據(jù)包填充功能,導(dǎo)致PC機(jī)無(wú)法接收該短數(shù)據(jù)包。

解決:使能EMAC的短小數(shù)據(jù)包填充功能。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3019

    瀏覽量

    74005

原文標(biāo)題:收藏!嵌超全的LWIP內(nèi)存管理經(jīng)驗(yàn)總結(jié)

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    #硬聲創(chuàng)作季 #LWIP 學(xué)LWIP-08 LWIP內(nèi)存管理-1

    LwIP
    水管工
    發(fā)布于 :2022年11月11日 14:39:47

    Linux 內(nèi)存管理知識(shí)學(xué)習(xí)經(jīng)驗(yàn)總結(jié)

    現(xiàn)在的服務(wù)器大部分都是運(yùn)行在Linux上面的,所以,作為一個(gè)程序員有必要簡(jiǎn)單地了解一下系統(tǒng)是如何運(yùn)行的。對(duì)于內(nèi)存部分需要知道:地址映射內(nèi)存管理的方式缺頁(yè)異常先來(lái)看一些基本的知識(shí),在進(jìn)程
    發(fā)表于 02-25 17:08

    LwIP 內(nèi)存配置

    還是opt.h進(jìn)行修改,都必須保證是在已經(jīng)對(duì)你所改動(dòng)的內(nèi)容足夠的了解的情況下進(jìn)行,所做的改動(dòng)是正確的,否則有可能導(dǎo)致協(xié)議棧 不能正常工作,或者效率低下。LwIP內(nèi)存管理機(jī)制在進(jìn)行內(nèi)存
    發(fā)表于 08-23 16:10

    請(qǐng)問戰(zhàn)艦LWIP移植是怎么實(shí)現(xiàn)內(nèi)存管理的?

    如題,最近在移植LWIP,參考原子戰(zhàn)艦V3,由于我的系統(tǒng)沒實(shí)現(xiàn)內(nèi)存管理,因此,涉及到malloc的函數(shù)我全部使用全局?jǐn)?shù)據(jù)區(qū)來(lái)開辟空間(暫時(shí)先這么粗略地實(shí)現(xiàn)),但對(duì)內(nèi)存池的
    發(fā)表于 09-02 04:36

    嵌入式Linux內(nèi)存管理知識(shí)

    這個(gè)內(nèi)存管理知識(shí)點(diǎn)還真的需要我們專門的去理解一下,今天大家一起來(lái)學(xué)習(xí)學(xué)習(xí)嵌入式Linux內(nèi)存管理知識(shí)
    發(fā)表于 02-03 06:30

    嵌入式Linux內(nèi)存管理知識(shí)點(diǎn)

    這個(gè)內(nèi)存管理知識(shí)點(diǎn)還真的需要我們專門的去理解一下,今天大家一起來(lái)學(xué)習(xí)學(xué)習(xí)嵌入式Linux內(nèi)存管理知識(shí)
    發(fā)表于 03-04 06:22

    文件管理知識(shí)點(diǎn)匯總,錯(cuò)過絕對(duì)后悔

    文件管理知識(shí)點(diǎn)匯總,錯(cuò)過絕對(duì)后悔
    發(fā)表于 12-23 06:31

    危險(xiǎn)化學(xué)品安全管理知識(shí)競(jìng)賽題

    危險(xiǎn)化學(xué)品安全管理知識(shí)競(jìng)賽題  ⒈《危險(xiǎn)化學(xué)品安全管理條例》自 起施行。    A.2002年1月15日 B.2002年2月15日    C.2002年3月15日 D. 2002年4月15日 
    發(fā)表于 12-31 23:01 ?14次下載

    品質(zhì)管理知識(shí)教程

    品質(zhì)管理知識(shí)教程
    發(fā)表于 01-29 15:41 ?42次下載

    無(wú)線電管理知識(shí)競(jìng)答試題

    無(wú)線電管理知識(shí)競(jìng)答試題 姓      名_______________身份證號(hào)碼_________________
    發(fā)表于 04-16 18:58 ?1762次閱讀

    電池車間生產(chǎn)管理知識(shí)培訓(xùn)——5S管理

    電池車間生產(chǎn)管理知識(shí)培訓(xùn)——5S管理 什么是5S管理 5S管理就是整理(SEIRI)、整頓(SEITON
    發(fā)表于 10-22 11:26 ?2090次閱讀

    LwIP內(nèi)存管理

    wIP(Light weight IP)是瑞士計(jì)算機(jī)科學(xué)院Adam Dunkels等開發(fā)的一套用于嵌入式系統(tǒng)的開放源代碼TCP/IP協(xié)議棧。LwIP可以移植到操作系統(tǒng)上,
    發(fā)表于 05-10 11:46 ?3970次閱讀
    <b class='flag-5'>LwIP</b>的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>

    嵌入式Linux內(nèi)存管理知識(shí)匯總

    這個(gè)內(nèi)存管理知識(shí)點(diǎn)還真的需要我們專門的去理解一下,今天大家一起來(lái)學(xué)習(xí)學(xué)習(xí)嵌入式Linux內(nèi)存管理知識(shí)
    發(fā)表于 04-09 05:58 ?1023次閱讀
    嵌入式Linux<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>的<b class='flag-5'>知識(shí)</b><b class='flag-5'>匯總</b>

    Linux內(nèi)存管理的基礎(chǔ)知識(shí)科普

    ,為什么還要看你這一篇,這正是我寫此文的原因,網(wǎng)上碎片化的相關(guān)知識(shí)點(diǎn)大都是東拼西湊,先不說(shuō)正確性與否,就連基本的邏輯都沒有搞清楚,我可以負(fù)責(zé)任的說(shuō)Linux內(nèi)存管理只需要看此文一篇就可以讓你入Linux內(nèi)核的大門,省去你東找西找
    的頭像 發(fā)表于 06-08 15:24 ?2108次閱讀

    科普|電源管理知識(shí)

    科普|電源管理知識(shí)
    的頭像 發(fā)表于 10-17 16:31 ?604次閱讀
    科普|電源<b class='flag-5'>管理知識(shí)</b>
    主站蜘蛛池模板: 国产精品无码亚洲网| 午夜深情在线观看免费| RUN AWAY无删减全集动漫| 男人边吃奶边挵进去呻吟漫画| 在线精品视频免费观看| 九九热在线视频观看这里只有精品| 亚洲精品线在线观看| 黑色丝袜在线观看| 野花4在线观看| 久久久久久久尹人综合网亚洲| 曰批国产精品视频免费观看| 老板揉搓秘书丰满大乳| 3d无遮挡h肉动漫在线播放| 美女18黄| jiapanese50欧美熟妇| 秋霞电影院兔费理论84MB| 岛国大片在线观看免费版| 天美传媒 免费观看| 国产色青青视频在线观看| 亚洲免费精品| 久久亚洲伊人| 99国产精品久久人妻无码| 秋霞伦理电影在2017韩国在线伦| 俄罗斯videosbest8| 乌克兰内射私拍| 果冻传媒 在线播放观看| 一天不停的插BB十几次| 麻豆沈芯语| 被两根巨大同时进去高H| 婷婷久久综合九色综合伊人色| 国产午夜伦鲁鲁| 伊人久久国产| 女人高潮被爽到呻吟在线观看| 岛国片免费看| 亚洲成人免费| 啦啦啦影院视频在线看高清... | 高H纯肉NP 弄潮NP男男| 熟女理发厅| 精品含羞草免费视频观看| 97超碰射射射| 视频一区亚洲视频无码|