5. 同时打开 图17双方同时打开 6. 同时关闭
图18双方同时关闭 五正确使用LWIP一般说来LWIP协议栈是比较稳定的,尤其像V1.3.2经历过业界广泛使用和工程应用,完全可以应用于嵌入式产品。那为什么还是有很多人反映LWIP不稳定呢?主要是以下几个方面的原因:
1. 网络硬件驱动
确保EMAC口接收与发送稳定可靠
2. 移植LWIP 基于OS的移植代码正确稳定
3. 配置LWIP 根据设备RAM尺寸进行合理配置
1) 值(PBUF_POOL_SIZE * PBUF_POOL_BUFSIZE)必须大于TCP_SND_BUF和TCP_WND,否则容易引起错误;
2) 当内存有限时TCP发送不能太快(具体值依赖于分配内存的大小),否则引起tcp_enqueue()逻辑错误;
4. 调用LWIP的API函数
正确使用API函数,特别防止内存泄露。
5. 资源不足
打开报警提醒,当资源不够时提醒设计者
六 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的短小数据包填充功能。 |