скрытое меню

регион памяти MALLOC

Это заменитель стандартной функции malloc. Использует свои зарезервированные области памяти. Области задаются макросами :

LWIP_MALLOC_MEMPOOL_START
LWIP_MALLOC_MEMPOOL(6, 256)
LWIP_MALLOC_MEMPOOL(2, 512)
LWIP_MALLOC_MEMPOOL(2, 1512)
LWIP_MALLOC_MEMPOOL_END

Еще надо установить дефайн : #define MEMP_USE_CUSTOM_POOLS 1

Влетаем в этот вариант выделения памяти при вызове функции pbuf_alloc с типом PBUF_RAM.

Сначала вызывается вроде бы mem_malloc :

p = ( struct pbuf* ) mem_malloc ( LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE( length ) );

Но внутри mem_malloc все-таки используется memp_malloc. Поэтому состав такого блока памяти :

struct memp
MEMP_SANITY_REGION_BEFORE_ALIGNED
struct memp_malloc_helper
struct pbuf
offset
.... payload ..... сами данные
MEMP_SANITY_REGION_AFTER_ALIGNED

Но возвращается из mem_malloc указатель не на memp , а на pbuf.

Далее в коде pbuf указатель payload устанавливается на данные следующие за pbuf + offset .

p->payload = LWIP_MEM_ALIGN( (void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset) );

Это стандартный подход как и к любому другому региону памяти. Но есть маленький нюанс : при выводе содержания блока памяти надо учитывать наличие memp_malloc_helper в отличии от других регионов.

Размер memp_malloc_helper = LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper)).