Problem s alokaci PCB v lwIP
Tomáš Hamouz
hamouz na divesoft.cz
Středa Únor 11 08:09:34 CET 2015
Odpověď v textu
> Dobrý den všem,
> 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.
Tomáš
> #if MEMP_OVERFLOW_CHECK
. memp->>next = NULL;
. memp->>file = file;
. memp->>line = line;
> #endif /* MEMP_OVERFLOW_CHECK */
> . MEMP_STATS_INC_USED(used, type);
> . LWIP_ASSERT("memp_malloc: memp properly aligned",
> . ((mem_ptr_t)memp % MEM_ALIGNMENT) == 0);
> . memp = (struct memp*)(void *)((u8_t*)memp + MEMP_SIZE);
> . } else {
> . LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
> ("memp_malloc: out of memory in pool %s\n", memp_desc[type]));
> . MEMP_STATS_INC(err, type);
> . }
> .
> . SYS_ARCH_UNPROTECT(old_level);
> .
> . return memp;
> }
> ---------------------------------------------------------
> LWIP_ERROR vypadá takto:
> #define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \
> . LWIP_PLATFORM_ASSERT(message); handler;}} while(0)
> ---------------------------------------------------------
> MEMP_OVERFLOW_CHECK není definováno
> ---------------------------------------------------------
> MEMP_MAX je definováno, ale nějak úchylně:
> /* 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 "lwip/memp_std.h"
> . MEMP_MAX
> } memp_t;
> ---------------------------------------------------------
> V includovaném souboru se text "MEMP_MAX" nenachází. K přečtení např. zde:
> http://users.ece.utexas.edu/~mcdermot/arch/projects_fall_09/Team_04/project/lwip-1.3.1/src/include/lwip/memp_std.h
> (Nevím, zda jsem "definici" získal správně, na tuhle mě hodilo CCS 550 při "Open declaration".)
> Tak tedy nevím... jsem z toho jelen.
> PH
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list