问题现象:LWIP使用NAT功能报sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEOUT is empty,发现报错的地方是failed at line 190 in LwIP\src\core\timeouts.c
问题分析:
1、仿真进入memp_malloc函数,查看memp_tab []的值和传入的type的值,MEMP_SYS_TIMEOUT作为参数传进来的话,type是11,然后观察memp_tab[]里面对应的值,然后就发现程序执行到memp_tab = memp_alloc->next;
这句的时候,memp_tab的值就变成了NULL,所以执行memp_malloc(MEMP_SYS_TIMEOUT)就分配为NULL了。
2、追踪到了memp_std.h里面的一个定义:
#if NO_SYS==0
LWIP_MEMPOOL(SYS_TIMEOUT, MEMP_NUM_SYS_TIMEOUT, sizeof(struct sys_timeo), "SYS_TIMEOUT")
#endif /* NO_SYS==0 */
#define LWIP_NUM_SYS_TIMEOUT_INTERNAL (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + PPP_NUM_TIMEOUTS + (LWIP_IPV6 * (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD)))
问题原因:
1、系统允许同时存在的timeouts的个数,初始值是8,memp_malloc(MEMP_SYS_TIMEOUT)时无法获取memory
2、memp_malloc(MEMP_SYS_TIMEOUT);此时就申请不到内存
问题解决:
将LWIP_NUM_SYS_TIMEOUT_INTERNAL加上LWIP_NAT(值为1)
问题说明:
1、LWIP使用2.1.0版本
2、使用STM32F407硬件平台