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