Problem s alokaci PCB v lwIP

Pavel Hudeček edizon na seznam.cz
Úterý Únor 10 22:01:52 CET 2015


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];
.  
.  if (memp != NULL) {
.    memp_tab[type] = memp->next;
#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


Další informace o konferenci Hw-list