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