1

目前我正在尝试在嵌入式板上移植 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宏是如何使用的吗?数组是如何定义的?那个数组的大小是怎么知道的?

4

1 回答 1

1

它似乎使用X-宏。

想法是memp_std.h包含数据,我们可以定义LWIP_MEMPOOL宏来过滤掉我们需要的数据。

由于 X 宏会很快变得复杂,我建议您在编译器上启用预处理器输出,以便在预处理完成后查看实际输出。

这是第一个代码示例的大致样子(调整了空格,并非所有宏符号都扩展了):

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)       ) ) )
];
于 2014-06-19T06:44:22.973 回答