关于如何在lwip堆栈中为声明的一个全局数组计算大小的混淆

时间:2014-06-19 05:35:21

标签: c lwip

目前我正在尝试在嵌入式主板上移植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

memp_std.h中,sizeof(struct xxx)使用了许多结构名称,但我无法包含所有结构的定义。所以你可以假设它有一定的尺寸。

您能解释LWIP_MEMPOOL宏的使用方式吗?数组如何定义?如何知道那个数组的大小?

1 个答案:

答案 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)       ) ) )
];