путаница в отношении того, как вычисляется размер для объявленного одного глобального массива в стеке lwip

#c #lwip

#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) amp; ~(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:

Кажется, он использует 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)       ) ) )
];
  

Комментарии:

1. одно сомнение, откуда берется оператор here?

2. @Jayesh Это первый символ в определении макроса: #define LWIP_MEMPOOL(name,num,size,desc) ( ( ...

3. О .. я вижу, большое спасибо.