путаница в том, как вычисляется размер объявленного одного глобального массива в стеке 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? как определены массивы? как известен размер этого массива?


person Jayesh Bhoi    schedule 19.06.2014    source источник


Ответы (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)       ) ) )
];
person user694733    schedule 19.06.2014
comment
одно сомнение, тут оператор + откуда? - person Jayesh Bhoi; 19.06.2014
comment
@Jayesh Это первый символ в определении макроса: #define LWIP_MEMPOOL(name,num,size,desc) + ( ( ... - person user694733; 19.06.2014
comment
О..я вижу Большое спасибо. - person Jayesh Bhoi; 19.06.2014