В настоящее время я пытаюсь перенести 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
? как определены массивы? как известен размер этого массива?