####一、在定義pbuf之前,首先定義了pbuf的層次和幾種型別。
在定義pbuf之前,首先定義了資料報運送最大值和資料報ip最大值
#define pbuf_transport_hlen 20; /*定義資料報運送最大值*/
#define pbuf_ip_hlen 20; //定義資料報ip最大值
然後定義了pbuf資料報的幾種層次。
typedef enum pbuf_layer;
然後定義了pbuf的四種型別
typedef enum pbuf_type;
類別
分配方式
特點使用場合
pbuf_ram
由記憶體堆分配,包括pbuf和資料區
長度不定,分配耗時,用的最多
應用程式和協議棧(協議棧要傳送的資料和應用程式要傳遞的資料一般都採用這個形式)
pbuf_pool
由記憶體池分配,包括pbuf和資料區
長度固定,分配快
中斷服務程式
pbuf_rom
由記憶體池分配,僅包括pbuf
所指資料都位於rom中
應用程式引用記憶體區
pbuf_ref
由記憶體池分配,僅包括pbuf
所指資料位於ram中
應用程式引用記憶體區
1)pbuf_ram記憶體申請(在pbuf.c檔案中):
struct pbuf *p;
p = (struct pbuf*)mem_malloc(lwip_memalign_size(sizeof_struct_pbuf + offset) + lwip_mem_align_size(length));
分配空間:
sizeof_struct_pbuf:pbuf結構頭大小。
offset:資料的包頭(tcp包頭,ip包頭等)。
length:資料儲存空間大小。
2)pbuf_pool記憶體申請:
q = memp_malloc(memp_pbuf_pool);
其中memp_malloc()中引數為memp_t型別。
對於pool型別:memp_pbug_pool屬於pool三大型別中的pbuf_mempool型別。
3)pbuf_rom記憶體申請:
p = memp_alloc(memp_pbuf); /** 在記憶體池中分配乙個相應的pbuf結構頭,而不申請資料區的空間。*/
pbuf_rom指向rom空間內的某段資料
4)pbuf_ref記憶體申請:
p = memp_malloc(memp_pbuf); /** 在記憶體池中分配乙個相應的pbuf結構頭,而不申請資料區的空間 */
pbuf_ref指向ram空間內的某段資料。
每一種pbuf分配記憶體的方式都不一樣,圖1所示
圖1 四種資料報管理結構
只有選擇合適的pbuf型別才能發揮lwip的最大效能,乙個資料報可能是多種pbuf的組合,用鍊錶連線起來,如圖2所示。
圖2 pbuf鍊錶
###二 定義pbuf
struct pbuf ;
###三 定義pbuf的處理函式
pbuf.h中定義,pbuf.c中實現
struct pbuf *pbuf_alloc( );
void pbuf_realloc( );
u8_t pbuf_header( );
void pbuf_ref( );
void pbuf_ref_chain( );
u8_t pbuf_free( );
u8_t pbuf_clen( );
void pbuf_cat( );
void pbuf_chain( );
struct pbuf *pbuf_dechain( );
err_t pbuf_copy( );
u16_t pbuf_copy_partial( );
PHP原始碼分析(記憶體管理)
void ptr emalloc size efree ptr 釋放記憶體的時候只傳入ptr,並沒有傳入釋放記憶體大小 當我們申請乙個size大小的記憶體的時候,我們多申請一些存起來,下次使用者申請的時候,直接給出相應大小的記憶體即可,這樣減少了使用者態和核心態的切換,提高效率,記憶體 的時候需要知...
Redis原始碼分析 記憶體管理
原始碼版本 redis 2.4.4 redis記憶體相關函式都放在zmalloc.h zmalloc.c中 redis中可以使用tcmalloc jemalloc makefile ifeq use tcmalloc yes alloc dep alloc link ltcmalloc alloc ...
FreeRTOS記憶體管理原始碼分析
記憶體管理一直都是重中之重的知識。記憶體管理在freertos系統中是可裁剪可配置的。freertos提供了5種記憶體管理方案。暫時可能分析不完5種方案,今天能寫多少先寫多少,後續有時間了再一點一點的寫吧。5中方案對比如下 方案1 記憶體一旦分配出去就無法 了。記憶體釋放函式是乙個空函式,什麼都沒做...