2014-06-19 10 views
1

현재 임베디드 보드에서 LWIP (경량 TCP/IP 스택)를 포팅하려고합니다.lwip 스택에서 선언 된 하나의 전역 배열에 대해 계산 된 크기에 관한 혼동

찾고있는 코드 중에 하나의 배열 선언 (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" 
}; 

/* 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 여기

을 정의하면 array 선언 위에에서 사용되는 각 매크로 해상력을 제공 할 수

같은 여기
/* 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)  ))) 
]; 
+0

+1 yes..getting 몇 가지 아이디어를 :

다음은 첫 번째 코드 샘플이 약 (공백을 조정하고, 모든 매크로 기호 확장) 어떻게 보일까입니다. –

+0

하나의 의심, 여기서'+'연산자는 어디서 오는가? –

+0

@Jayesh 이것은 매크로 정의의 첫 번째 문자입니다 :'#define LWIP_MEMPOOL (name, num, size, desc) + ((... ... – user694733