Lwip 內存對齊 memp_memory[] 源碼分析

Lwip內存對齊 

// 一個字節
#define MEM_SIZE                        15
#define MEM_ALIGNMENT                   1
#define LWIP_MEM_ALIGN(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1))
LWIP_MEM_ALIGN(MEM_SIZE) = 15;//當1字節對齊的時候,內存對齊(也能夠認爲是內存調整)後的值爲15

// 改成2字節
#define MEM_ALIGNMENT                   2
LWIP_MEM_ALIGN(MEM_SIZE) = 16;//當1字節對齊的時候,內存對齊(也能夠認爲是內存調整)後的值爲16

// 改成4字節
#define MEM_ALIGNMENT                   4
LWIP_MEM_ALIGN(MEM_SIZE) = 16;//當1字節對齊的時候,內存對齊(也能夠認爲是內存調整)後的值爲16

1字節對齊:地址的LSB位能夠是1,好比地址0x00000001。數組

字節對齊:地址的LSB位要位0,好比  地址0x00000002。tcp

4 字節對齊:地址的第0位和第1位要位0,好比  地址0x00000004。spa

內存對齊好處是,cpu編譯方便,查找快,全部的size格式統一,方便管理code


Lwip memp_memory大小定義方式

// 預約義 #define 
static u8_t memp_memory[MEM_ALIGNMENT - 1 
#define LWIP_MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) )
#include "lwip/memp_std.h"
];

 宏定義的做用域是同文件內從定義開始起做用 直到取消定義 orm

memp_std.h文件中部分代碼ip

#if LWIP_RAW
LWIP_MEMPOOL(RAW_PCB,        MEMP_NUM_RAW_PCB,         sizeof(struct raw_pcb),        "RAW_PCB")
#endif /* LWIP_RAW */
#if LWIP_UDP
LWIP_MEMPOOL(UDP_PCB,        MEMP_NUM_UDP_PCB,         sizeof(struct udp_pcb),        "UDP_PCB")
#endif /* LWIP_UDP */
#if LWIP_TCP
LWIP_MEMPOOL(TCP_PCB,        MEMP_NUM_TCP_PCB,         sizeof(struct tcp_pcb),        "TCP_PCB")
LWIP_MEMPOOL(TCP_PCB_LISTEN, MEMP_NUM_TCP_PCB_LISTEN,  sizeof(struct tcp_pcb_listen), "TCP_PCB_LISTEN")
LWIP_MEMPOOL(TCP_SEG,        MEMP_NUM_TCP_SEG,         sizeof(struct tcp_seg),        "TCP_SEG")
#endif /* LWIP_TCP */
 
#undef LWIP_MEMPOOL

數組裏的宏定義:內存

static u8_t memp_memory[MEM_ALIGNMENT - 1 
#define LWIP_MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) )
#include "lwip/memp_std.h"
];作用域

上面紅色部分的便是一個宏定義,可單獨拿出來,與數組無關,由於用#define定義的宏是在預處理階段進行處理的,而非編譯時期進行it

#define LWIP_MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) )

static u8_t memp_memory[MEM_ALIGNMENT - 1 
#include "lwip/memp_std.h"
]; 

//memp_std.h文件中部分代碼 

#if LWIP_RAW
LWIP_MEMPOOL(RAW_PCB,        MEMP_NUM_RAW_PCB,         sizeof(struct raw_pcb),        "RAW_PCB")
#endif /* LWIP_RAW */
#if LWIP_UDP
LWIP_MEMPOOL(UDP_PCB,        MEMP_NUM_UDP_PCB,         sizeof(struct udp_pcb),        "UDP_PCB")
#endif /* LWIP_UDP */
#if LWIP_TCP
LWIP_MEMPOOL(TCP_PCB,        MEMP_NUM_TCP_PCB,         sizeof(struct tcp_pcb),        "TCP_PCB")
LWIP_MEMPOOL(TCP_PCB_LISTEN, MEMP_NUM_TCP_PCB_LISTEN,  sizeof(struct tcp_pcb_listen), "TCP_PCB_LISTEN")
LWIP_MEMPOOL(TCP_SEG,        MEMP_NUM_TCP_SEG,         sizeof(struct tcp_seg),        "TCP_SEG")
#endif /* LWIP_TCP */

#undef LWIP_MEMPOOL

預處理,後面的include也是預處理。能夠根據前面進行展開。編譯

//若是LWIP_RAW定義了
memp_memory[[MEM_ALIGNMENT - 1+ ( (MEMP_NUM_RAW_PCB) * (MEMP_SIZE + MEMP_ALIGN_SIZE(sizeof(struct raw_pcb)) ) )]
 
//若是LWIP_UDP定義了
memp_memory[[MEM_ALIGNMENT - 1+ ( (MEMP_NUM_UDP_PCB) * (MEMP_SIZE + MEMP_ALIGN_SIZE(sizeof(struct udp_pcb)) ) )]
 
//若是二者都定義了
memp_memory[[MEM_ALIGNMENT - 1+ ( (MEMP_NUM_RAW_PCB) * (MEMP_SIZE + MEMP_ALIGN_SIZE(sizeof(struct raw_pcb)) ) ) + ( (MEMP_NUM_UDP_PCB) * (MEMP_SIZE + MEMP_ALIGN_SIZE(sizeof(struct udp_pcb)) ) )]

 

說明這個數組根據你是否認義LWIP_RAW等宏(這些宏實際可看作TCPIP的各個模塊,根據須要選擇),數組的長度是可變的。

相關文章
相關標籤/搜索