#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. О .. я вижу, большое спасибо.