Problem s alokaci PCB v lwIP

Pavel Hudeček edizon na seznam.cz
Středa Únor 11 14:23:09 CET 2015


Díky za částečné objasnění.

PH

Od: Tomáš Hamouz 
Odpověď v textu

> v jednom projektu potřebuji přijímat pakety na několika portech
> najednou. Několikrát tedy provedu alokaci PCB s pomocí udp_new() a
> potom udp_bind(...) a udp_recv(...). Jenže u čtvrtého se z udp_new() vrátí NULL.

> Je to na kitu s AM3358, který má 256 MB RAM.

> udp_new vypadá takto:
> (Na začátek odsazených řádků jsem doplnil tečky doufajíc, že
> debilní webové rozhraní Seznamu odsazení neodstraní.)

> /**
>  * Create a UDP PCB.
>  *
>  * @return The UDP PCB which was created. NULL if the PCB data structure
>  * could not be allocated.
>  *
>  * @see udp_remove()
>  */
> struct udp_pcb *
> udp_new(void)
> {
> .  struct udp_pcb *pcb;
> .  pcb = (struct udp_pcb *)memp_malloc(MEMP_UDP_PCB);
> .  /* could allocate UDP PCB? */
> .  if (pcb != NULL) {
> .    /* UDP Lite: by initializing to all zeroes, chksum_len is set to 0
> .     * which means checksum is generated over the whole datagram per default
> .     * (recommended as default by RFC 3828). */
> .    /* initialize PCB to all zeroes */
> .    memset(pcb, 0, sizeof(struct udp_pcb));
.    pcb->>ttl = UDP_TTL;
> .  }
> .  return pcb;
> }

> ----------------------------------------------------------
> A jím volaná memp_alloc takto:

> /**
>  * Get an element from a specific pool.
>  *
>  * @param type the pool to get an element from
>  *
>  * the debug version has two more parameters:
>  * @param file file name calling this function
>  * @param line number of line where this function is called
>  *
>  * @return a pointer to the allocated memory or a NULL pointer on error
>  */
> void *
> #if !MEMP_OVERFLOW_CHECK
> memp_malloc(memp_t type)
> #else
> memp_malloc_fn(memp_t type, const char* file, const int line)
> #endif
> {
> .  struct memp *memp;
> .  SYS_ARCH_DECL_PROTECT(old_level);
> . 
> .  LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;);
> .
> .  SYS_ARCH_PROTECT(old_level);
> #if MEMP_OVERFLOW_CHECK >= 2
> .  memp_overflow_check_all();
> #endif /* MEMP_OVERFLOW_CHECK >= 2 */
> .
> .  memp = memp_tab[type];

Alokuje se z "memory poolu" dle parametru.
Zjevně se jedná o zřetězený seznam, viz dále.

> .  
> .  if (memp != NULL) {

V poolu byl ještě nějaký blok.

> .    memp_tab[type] = memp->next;

Blok vyjmeme a do seznamu zapíšeme zřetězený blok, připravený pro
příští alokaci.


Pokud Vám memp_alloc projde 3x a pak vrátí NULL, znamená to že v
seznamu byly na počátku alokovány jen 3 bloky, 4. volání už vrátí
NULL, protže seznam je prázdný.


Hledejte kde se memory pool inicializuje a tam bude uvedeno, kolik
bloků se zařadí do seznamu.


Další informace o konferenci Hw-list