txcy的笔记 https://bbs.21ic.com/?589027 [收藏] [复制] [RSS]

日志

数组定义---预处理的妙用

已有 927 次阅读2009-9-24 00:46 |系统分类:单片机

该数组存放TCPIP各个模块的内存缓存。


每个不同模块又分解为多个包,每个包的尺寸相同。


当接到到数据包之后,根据不同内存模式,将包分解存储到相应的模块缓存中,发送也一样。


详见(low_level_input和low_level_output两个函数)


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


数组中的宏定义,可单独拿出来,与数组无关,因为用#define定义的宏是在预处理阶段进行处理的,而非编译时期进行


预处理,后面的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的各个模块,根据需要选择)


#define  MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )


 


#ifdefine MIN   (正确)


 


#ifdefine MIN(x,y)   (错误)


 


unsigned char a[]={
#define pi 3.14                 //这个可以宏可以看做与数组无关
1,2,3,4
};


 



 


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)