lwip--有趣的数组定义(预处理) ——转 该数组存放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 #if LWIP_UDP LWIP_MEMPOOL(UDP_PCB, MEMP_NUM_UDP_PCB, sizeof(struct udp_pcb), "UDP_PCB") #endif #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 #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 }; 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zyboy2000/archive/2009/06/29/4305816.aspx |
|