// 一個字節 #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。數組
2 字節對齊:地址的LSB位要位0,好比 地址0x00000002。tcp
4 字節對齊:地址的第0位和第1位要位0,好比 地址0x00000004。spa
內存對齊好處是,cpu編譯方便,查找快,全部的size格式統一,方便管理code
// 預約義 #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的各個模塊,根據須要選擇),數組的長度是可變的。