gpt4 book ai didi

关于如何为 lwip 堆栈中声明的一个全局数组计算大小的困惑

转载 作者:太空宇宙 更新时间:2023-11-04 03:46:07 25 4
gpt4 key购买 nike

目前我正在尝试在嵌入式板上移植 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 宏是如何使用的吗?数组是如何定义的?该数组的大小如何知道?

最佳答案

好像用了X-macros。

思路是memp_std.h中包含数据,我们可以定义LWIP_MEMPOOL宏来过滤出我们需要的数据。

由于 X-macros 可以非常快速地变得复杂,我建议您在编译器上启用预处理器输出以在预处理完成后查看实际输出。

这是第一个代码示例的大致样子(调整了空白,而不是扩展了所有宏符号):

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) ) ) )
];

关于关于如何为 lwip 堆栈中声明的一个全局数组计算大小的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24299425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com