本帖最后由 zdfwyh 于 2016-6-2 09:48 编辑
我们公司正在开发一款产品,采用MODBUS TCP和TCPServer数据交换我开始采用UCOS-ii和LWIP实现,可以说已经能够正常运行了,单独运行TCPServer,每2秒发送一次数据,数据包大小为5k左右,可以连续运行一周没有问题,但是加上MODBUS TCP只10个小时就是报错,20个小时左右就会重启,最长没有挺过25小时.后来各种增加,PBUF_POOL_BUFSIZE增加到1024,TCP_SND_BUF 为(10*TCP_MSS),TCP_SND_QUEUELEN为(100* TCP_SND_BUF/TCP_MSS),TCP_WND 为(10*TCP_MSS)而lWIP的内存管理也采用了MEMPOOL方式,避免内存碎片,同时对网卡的数据收发也加了互斥信号量,不会出现同时收发的情况,等等,这些手段只是延长了LWIP的生命周期而已,如果MODBUS TCP 采用10ms的轮询周期,1个多小时就会报错,能挺2~3小时左右就会死掉.这个测试我进行了两个多月,但是我如果把Modbus TCP的轮询周期改为一秒,那么它就会活得好好的,连续1周(7*24小时)不会出任何问题,连错误都没有.
测试过程中发生的第一个错误就是:
Assertion "pcb->snd_queuelen >= pbuf_clen(next->p)" failed at line 1021 in ..\LWIP\lwip-1.4.1\src\core\tcp_in.c
Assertion "pbuf_free: p->ref > 0" failed at line 664 in ..\LWIP\lwip-1.4.1\src\core\pbuf.c
只要这个错误出现,那么LWIP就注定要死亡了,两个多月的测试,没有一次例外.
这期间我曾经只运行MODBUS TCP ,其他任务全部停掉,还是避免不了LWIP死亡的结局.其他TCP任务加入之后只能加快它的死亡.但是如果数据周期超过1秒,那么就很稳定.这期间我还试过FreeRTOS+LWIP的组合,程序模板都是官方的,不会有移植错误的,似乎FreeRTOS+LWIP更稳定一点,但还是避免不了LWIP的死亡结局,在MODBUS TCP以500ms轮询的情况下都无法长期工作,所以我感觉LWIP不能适用于短周期高频数据访问的情况.
最近我又在试RTX+RL_TCPnet的情况,目前已经测试MODBUS TCP 200ms轮询,TCPServer 1s轮询,外加三个ping命令(两个1024字节,1个32字节),现在已经运行36小时,未死亡,因为没移植出错调试信息输出,也就不知道是否存在错误信息输出,但36小时的运行已经超出之前最好的情况了,而且66万次的MODBUS的访问没有一次超时(50ms)和读写错误发生,唯一不足的是ping的速度没有LWIP快,最长的延迟会超过10ms(LWIP没有超过1ms的)但这都不影响我的程序,我要的是稳定.观察还在继续,如果能挺过7*24小时,那么我就可以认为MDK的RL_TCPnet更适合高频数据访问的情况.
|