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