*/void*mem_malloc(mem_size_tsize){void*ret;structmemp_malloc_helper*element;memp_tpoolnr;mem_size_trequired_size = size +LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper));for(poolnr = MEMP_POOL_FIRST; poolnr <= MEMP_POOL_LAST; poolnr = (memp_t)(poolnr +1)) {#ifMEM_USE_...
u16_t payload_len = (u16_t)(LWIP_MEM_ALIGN_SIZE(offset) + LWIP_MEM_ALIGN_SIZE(length)); mem_size_t alloc_len = (mem_size_t)(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF) + payload_len); if ((payload_len < LWIP_MEM_ALIGN_SIZE(length)) || (alloc_len < LWIP_MEM_ALIGN_SIZE(lengt...
根据假定size为15,经过(size) + MEM_ALIGNMENT - 1计算得到18(0b10010),最后经过第a不得掩码(0x1…100)得出16(0b10000),即15向上取整对齐后位16。 3、数据起始地址对齐 #define LWIP_MEM_ALIGN(addr) ((void *)(((mem_ptr_t)(addr) + MEM_ALIGNMENT - 1) & ~(mem_ptr_t)(MEM_ALIGNMENT-1))...
1#defineLWIP_MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) )2staticu8_t memp_memory [ MEM_ALIGNMENT -13#include"lwip/memp_std.h"4]; 这里的LWIP_MEMPOOL(name,num,size,desc)定义成了+ ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) ) include关...
首先会计算payload_len和alloc_len,如果是传输数据,那么LWIP_MEM_ALIGN_SIZE(offset)就是54,计算得到payload_len=1554,alloc_len=1570;然后进入判断payload和alloc的长度是否<length(54),如果其中一个满足(或语句)就return NULL;pbuf的结构体p进入内存申请内存堆,然后调用pbuf_init_alloced_pbuf;该函数完成p的初始...
const u16_t memp_sizes[MEMP_MAX] ={LWIP_MEM_ALIGN_SIZE(sizeof(struct raw_pcb)),LWIP_MEM_ALIGN_SIZE(sizeof(struct udp_pcb)),LWIP_MEM_ALIGN_SIZE(sizeof(struct tcp_pcb)),LWIP_MEM_ALIGN_SIZE(sizeof(structtcp_pcb_listen)),LWIP_MEM_ALIGN_SIZE(sizeof(struct tcp_seg)),…….} ...
LWIP_MEM_ALIGN_SIZE(sizeof(struct tcp_pcb)), LWIP_MEM_ALIGN_SIZE(sizeof(struct tcp_pcb_listen)), ... }; 数组要比实际需要的大MEM_ALIGNMENT – 1,作者考虑的是编译器的字对齐问题。详细说明可见《嵌入式网络那些事-LwIP协议深度剖析与实战演练》,朱老大说的很是明白。
static u8_t memp_memory[ MEM_ALIGNMENT – 1 ((MEMP_NUM_RAW_PCB) * (MEMP_SIZE MEMP_ALIGN_SIZE(sizeof(struct raw_pcb)) )) ( (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...
mem_init(void) { struct mem *mem; ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER); //内存堆对齐 //初始化内存堆的头部,初始内存堆只有一个空闲的内存块 mem = (struct mem *)(void *)ram; mem->next = MEM_SIZE_ALIGNED; //MEM_SIZE_ALIGNED是内存堆对齐后的总大小,这里表示该内存的...
LWIP_MEM_ALIGN_BUFFER可以用户实现,如果用户未定义,arch.h中默认为 #ifndef LWIP_MEM_ALIGN_BUFFER 即人为的放大了,保证对齐之后始终能保证有足够size的空间。 比如size是8,但是数组的基地址则可能是任意地址,比如是0x0001,要保证地址4字节对齐, 那么只能往后移动实际用的地址是0x0004,那么前面就浪费了3字节,此时...