六 LWIP常见问题1. 网卡驱动程序 首先,必须将协议栈完全初始化才能打开网络接收功能,接收中断必须将数据封装在PBUF中,然后交会给协议栈内核处理。其次,LWIP的全局变量(arp_table,netif_list,udp_pcbs等)确保赋初值0,否则容易一运行就崩溃。 2. 内存泄露第一个原则(责任制):谁分配内存,谁就负责回收。 第二个原则(对称性):分配内存者与回收内存者一一对应构成闭环。 另外,需要特别注意一些系统函数的调用,它们也会带来内存泄露,如: 例1 newconn = netconn_accept(conn); do_something_for(newconn); netconn_close(newconn); netconn_delete(newconn); /*一定要释放newconn否则将导致内存泄露 */ 例2 inbuf = netconn_recv(conn); do_something_for(inbuf); netbuf_delete(inbuf); /*一定要释放inbuf否则将导致内存泄露 */ 3. PC机无法与LWIP建立TCP连接问题:PC机能够与LWIP设备PING操作成功,但是无法建立TCP连接。 原因:通过代码跟踪,发现LWIP发出了SYN+ACK数据包,但是PC机无法接收该握手数据包,该数据包为60字节,小于以太网的最小长度(64字节),而LWIP设备的EMAC没有设置短小数据包填充功能,导致PC机无法接收该短数据包。 解决:使能EMAC的短小数据包填充功能。
|