您的位置:首页 > 其它

Lwip 内存对齐 memp_memory[] 源码分析

2014-06-01 00:00 302 查看
摘要: 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。
2 字节对齐:地址的LSB位要位0,比如 地址0x00000002。
4 字节对齐:地址的第0位和第1位要位0,比如 地址0x00000004。
内存对齐好处是,cpu编译方便,查找快,所有的size格式统一,方便管理

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"
];


宏定义的作用域是同文件内从定义开始起作用 直到取消定义

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


数组里的宏定义:
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定义的宏是在预处理阶段进行处理的,而非编译时期进行
#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的各个模块,根据需要选择),数组的长度是可变的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息