目前我正在尝试在嵌入式主板上移植LWIP(轻量级TCP / IP堆栈)。
在查找代码期间,我想出了一个数组声明(在memp.c
文件中),这看起来很奇怪,我从未见过这种类型的声明。
虽然它是有效的声明,但我很困惑,这意味着它占用了多少空间,我如何计算它? LWIP_MEMPOOL
宏如何扩展?
声明似乎是
/** This is the actual memory used by the pools (all pools in one big block). */
static unsigned char memp_memory[MEM_ALIGNMENT - 1
#define LWIP_MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) )
#include "memp_std.h"
];
和
/** This array holds the number of elements in each pool. */
static const unsigned int memp_num[MEMP_MAX] = {
#define LWIP_MEMPOOL(name,num,size,desc) (num),
#include "memp_std.h"
};
现在让我给你上面array
声明
/* 32-bit alignment */
#define MEM_ALIGNMENT 4
#define MEMP_SIZE 0
#define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1))
#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x))
MEMP_MAX
此处定义
/* Create the list of all memory pools managed by memp. MEMP_MAX represents a NULL pool at the end */
typedef enum {
#define LWIP_MEMPOOL(name,num,size,desc) MEMP_##name,
#include "memp_std.h"
MEMP_MAX <--------------------//MEMP_MAX
} memp_t;
在memp_std.h
中,sizeof(struct xxx)
使用了许多结构名称,但我无法包含所有结构的定义。所以你可以假设它有一定的尺寸。
您能解释LWIP_MEMPOOL
宏的使用方式吗?数组如何定义?如何知道那个数组的大小?
答案 0 :(得分:1)
似乎使用X-macros。
想法是memp_std.h
包含数据,我们可以定义LWIP_MEMPOOL
宏来过滤掉我们需要的数据。
由于X-macro的速度非常快,我建议您在编译器上启用预处理器输出,以便在预处理完成后查看实际输出。
以下是第一个代码示例的粗略外观(调整了空格,并未扩展所有宏符号):
static unsigned char memp_memory[MEM_ALIGNMENT - 1
+ ( (MEMP_NUM_UDP_PCB) * (MEMP_SIZE + MEMP_ALIGN_SIZE(sizeof(struct udp_pcb) ) ) )
+ ( (MEMP_NUM_TCP_PCB) * (MEMP_SIZE + MEMP_ALIGN_SIZE(sizeof(struct tcp_pcb) ) ) )
+ ( (MEMP_NUM_TCP_PCB_LISTEN) * (MEMP_SIZE + MEMP_ALIGN_SIZE(sizeof(struct tcp_pcb_listen)) ) )
+ ( (MEMP_NUM_TCP_SEG) * (MEMP_SIZE + MEMP_ALIGN_SIZE(sizeof(struct tcp_seg) ) ) )
+ ( (MEMP_NUM_NETBUF) * (MEMP_SIZE + MEMP_ALIGN_SIZE(sizeof(struct netbuf) ) ) )
+ ( (MEMP_NUM_NETCONN) * (MEMP_SIZE + MEMP_ALIGN_SIZE(sizeof(struct netconn) ) ) )
];