OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11526|回复: 22

LWIP不适合高频数据交换

[复制链接]

7

主题

188

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2280
金钱
2280
注册时间
2013-12-16
在线时间
448 小时
发表于 2016-6-2 09:44:40 | 显示全部楼层 |阅读模式
本帖最后由 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更适合高频数据访问的情况.

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

188

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2280
金钱
2280
注册时间
2013-12-16
在线时间
448 小时
 楼主| 发表于 2016-6-2 12:33:33 | 显示全部楼层
本帖最后由 zdfwyh 于 2016-6-2 12:36 编辑
正点原子 发表于 2016-6-2 11:16
是参考我们的例程移植的么?  我们目前的lwip存在一个小bug,就是频繁发数据的时候,可能会死机,但是这个b ...

我长期测试的程序就是参考你们的程序写的,主要UCOS-II和LWIP以及malloc部分都有用你们的程序,但是LWIP有自己的内存管理代码,好像不需要用你们的malloc代码,只是在LWIP初始化部分用malloc非配内存,在注销LWIP时用free还是释放内存,在整个LWIP的生命周期中好像不用你们的malloc函数,而且malloc函数都有加临界保护的.LWIP的内存管理函数我看了也有临界保护,我觉得不是这部分原因.
//释放内存(外部调用)
//memx:所属内存块
//ptr:内存首地址
void myfree(u8 memx,void *ptr)  
{  
u32 offset;   
  OS_CPU_SR cpu_sr=0;
if(ptr==NULL)return;//地址为0.  
OS_ENTER_CRITICAL();
  offset=(u32)ptr-(u32)mallco_dev.membase[memx];     
my_mem_free(memx,offset); //释放内存
OS_EXIT_CRITICAL();
}  
//分配内存(外部调用)
//memx:所属内存块
//size:内存大小(字节)
//返回值:分配到的内存首地址.
void *mymalloc(u8 memx,u32 size)  
{  
u32 offset;   
  OS_CPU_SR cpu_sr=0;
OS_ENTER_CRITICAL();
offset=my_mem_malloc(memx,size);            
OS_EXIT_CRITICAL();
if(offset==0XFFFFFFFF){DEBUG_MSGPARA(("内存分配失败!RAM=%s,SIZE=%d\r\n",memx==SRAMIN?"SRAMIN":memx==SRAMEX?"SRAMEX":"SRAMCCM",size))return NULL; }
else return (void*)((u32)mallco_dev.membase[memx]+offset);  
}  


回复 支持 1 反对 0

使用道具 举报

5

主题

277

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1522
金钱
1522
注册时间
2014-5-16
在线时间
217 小时
发表于 2016-6-2 09:53:29 | 显示全部楼层
关注!
我试过LWIP和TCPnet,最后都没有在项目中用,原因是LWIP写得过于复杂,而TCPnet不开源
我用的是microchip的TCPIP协议栈,源码简练,结构清晰,只是移植麻烦点,到目前为止用得都还很稳定.
回复 支持 反对

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2016-6-2 11:00:44 | 显示全部楼层
我们项目上正在做的也是类似的东西,用407跑FreeRTOS+LWIP,之前遇到过申请多个TCP端口无法正常打开的情况,后来修改了栈空间暂时好一点了,还在继续测试中。。
活到老,学到老。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-6-2 11:16:32 | 显示全部楼层
是参考我们的例程移植的么?  我们目前的lwip存在一个小bug,就是频繁发数据的时候,可能会死机,但是这个bug已经解决,办法:malloc和free函数,加禁止中断,不能让中断打断malloc和free,加上这个就好了。
回复 支持 反对

使用道具 举报

7

主题

188

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2280
金钱
2280
注册时间
2013-12-16
在线时间
448 小时
 楼主| 发表于 2016-6-2 12:43:37 | 显示全部楼层
zmingwang 发表于 2016-6-2 09:53
关注!
我试过LWIP和TCPnet,最后都没有在项目中用,原因是LWIP写得过于复杂,而TCPnet不开源
我用的是microc ...

LWIP开源但复杂,移植困难,但例程和资料非常多,TCPnet现在更新到7.1.0改进很多,做了非常多的中间件,不开源,都是封装好的,但是接口非常简单,官方没有TCPServer的例子,但是我参考他们的帮助文档,几个API调用一下就可以实现TCPServer,最关键是TCPnet断网重连做的感觉非常好,我多次断网,长时间断开(超过5分钟)再恢复,仍然能够恢复连接,不需要再干预,而LWIP就不行,我到现在也没有找到好的办法实现断网重连,最终都是直接全部销毁再重新初始化,这很浪费时间.
回复 支持 反对

使用道具 举报

7

主题

188

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2280
金钱
2280
注册时间
2013-12-16
在线时间
448 小时
 楼主| 发表于 2016-6-2 14:44:21 | 显示全部楼层
zmingwang 发表于 2016-6-2 09:53
关注!
我试过LWIP和TCPnet,最后都没有在项目中用,原因是LWIP写得过于复杂,而TCPnet不开源
我用的是microc ...

能否提供一下microchip的TCPIP协议栈,源码,我也研究一下
回复 支持 反对

使用道具 举报

5

主题

277

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1522
金钱
1522
注册时间
2014-5-16
在线时间
217 小时
发表于 2016-6-2 14:57:28 | 显示全部楼层
zdfwyh 发表于 2016-6-2 14:44
能否提供一下microchip的TCPIP协议栈,源码,我也研究一下

去Microchip官网下载,是一个整合在一起的包,叫MPLAB® Harmony
安装好之后,里面就有TCPIP,当然还有其他的一些代码,有兴趣可以看看
我没有有最新版的,最新版支持OS接口,和智能代码生成,所以代码有些膨胀
回复 支持 反对

使用道具 举报

43

主题

481

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1352
金钱
1352
注册时间
2014-12-24
在线时间
321 小时
发表于 2016-6-2 20:40:35 | 显示全部楼层
也发现了有这个问题,不过只是自己玩玩,发现问题就丢一边了,没深入研究!
回复 支持 反对

使用道具 举报

7

主题

188

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2280
金钱
2280
注册时间
2013-12-16
在线时间
448 小时
 楼主| 发表于 2016-6-3 07:32:39 | 显示全部楼层
zmingwang 发表于 2016-6-2 14:57
去Microchip官网下载,是一个整合在一起的包,叫MPLAB® Harmony
安装好之后,里面就有TCPIP,当然还有 ...

谢谢
回复 支持 反对

使用道具 举报

13

主题

296

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2066
金钱
2066
注册时间
2012-5-26
在线时间
291 小时
发表于 2016-6-3 08:39:53 | 显示全部楼层
最近项目也是要用到stm32 freerots+lwip,也是要用modbus tcp和tcpserver,但是还没试过长时间测试,看来要测试一下了
不过项目只是用modbus tcp来监控一下数据,应该不需要高频
活着才是王道!健康是一切的前提!
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-9-2
在线时间
0 小时
发表于 2016-6-14 18:13:48 | 显示全部楼层
说不稳定的,都是不会用而已,很多人都是似懂非懂,其实lwip会用是很稳定的
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-9-2
在线时间
0 小时
发表于 2016-6-14 18:14:39 | 显示全部楼层
我也遇到过各种问题,都怀疑过,但是都解决了。有问题就看源码吧。懂了就没问题了
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-9-2
在线时间
0 小时
发表于 2016-6-14 18:16:13 | 显示全部楼层
你这个还是比较简单,我们是做plc的,还要上位机编程,modbus tcp ,tcp,udp。程序上传下载监控,run,stop,网线拔插。也没有问题
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-7-16
在线时间
9 小时
发表于 2016-7-16 21:40:01 | 显示全部楼层
正点原子 发表于 2016-6-2 11:16
是参考我们的例程移植的么?  我们目前的lwip存在一个小bug,就是频繁发数据的时候,可能会死机,但是这个b ...

请教一下,怎么在malloc和free 上加禁止中断,不让中断打断malloc和free呢?
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-9-8
在线时间
7 小时
发表于 2016-9-8 14:53:30 | 显示全部楼层
正点原子 发表于 2016-6-2 11:16
是参考我们的例程移植的么?  我们目前的lwip存在一个小bug,就是频繁发数据的时候,可能会死机,但是这个b ...

你好,我移植的也是您的程序,也是会有一定概率出现Assertion "pbuf_free: p->ref > 0" failed at line 654 in ..\LWIP\lwip-1.4.1\src\core\pbuf.c,请问是否是程序bug,我用的程序是裸lwip,没有跑系统
回复 支持 反对

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2016-9-8 15:24:56 | 显示全部楼层
qq1003442507 发表于 2016-9-8 14:53
你好,我移植的也是您的程序,也是会有一定概率出现Assertion "pbuf_free: p->ref > 0" failed at line 6 ...

我遇到过这种报错,但是经过我检查,发现是申明了strutc netbuf *inbuf,结果这个inbuf没有使用造成的
根据我的猜测,可能是你声明了某个协议栈buf,例如这里的inbuf,而这个buf最终调用到pbuf,但是这个pbuf你在某些情况下根本没有使用,然后你就将它删除,于是就出现了上述情况
电子爱好者
回复 支持 反对

使用道具 举报

24

主题

208

帖子

0

精华

高级会员

Rank: 4

积分
714
金钱
714
注册时间
2014-4-8
在线时间
160 小时
发表于 2016-9-8 22:41:27 | 显示全部楼层
shengzhou02 发表于 2016-7-16 21:40
请教一下,怎么在malloc和free 上加禁止中断,不让中断打断malloc和free呢?

权威指南上有说
回复 支持 反对

使用道具 举报

1

主题

140

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2016-8-15
在线时间
20 小时
发表于 2016-9-9 08:27:30 | 显示全部楼层
guanzhu
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-9-8
在线时间
7 小时
发表于 2016-9-10 17:34:12 | 显示全部楼层
liuchang 发表于 2016-9-8 15:24
我遇到过这种报错,但是经过我检查,发现是申明了strutc netbuf *inbuf,结果这个inbuf没有使用造成的
根据 ...

并不是的,我的设备一直在执行建立TCP,通信,释放TCP这种动作,反复执行,然后执行的次数多了,就有概率挂掉,一旦出现,lwip肯定就死了
回复 支持 反对

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1350
金钱
1350
注册时间
2012-4-25
在线时间
195 小时
发表于 2016-9-24 14:49:31 | 显示全部楼层
最近2天也在整LWIP tcp,  板子做服务器端用的是raw api.先用官方例子测试Server ECHO 。用网络调试助手1ms 连续发包 到 60W字节左右 发送和接收没丢包。
然后我把自发自收,修改了下。板子收到数据 先拷出来,然后 复制个另一个pbuf,再发送。  经过这样修改 1ms发包 发不到 3W 就丢失包,而且也不在接收新数据了。
后面增加到 50ms 左右 还算可以,再长就没测试了。

不知道你们说稳定的是不是 使用LWIP TCP  都是 1s 次通讯这样的。 我现在的板子,上位机如果40ms 一直发,需要一直处理的,以前用的是UDP发现丢包严重(经过交换机,路由器)。所以就测试下了 TCP,发现数据还是一样丢失的。不知道是不是发送数据处理没写好。
1-1
回复 支持 反对

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-7-18
在线时间
29 小时
发表于 2017-7-31 15:20:00 | 显示全部楼层
正点原子 发表于 2016-6-2 11:16
是参考我们的例程移植的么?  我们目前的lwip存在一个小bug,就是频繁发数据的时候,可能会死机,但是这个b ...

加了这个之后系统的确不会卡住了,但过段时间之后数据传输还是会终止,不过依旧可以ping通,很奇怪
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-6-16
在线时间
4 小时
发表于 2020-1-19 10:44:55 | 显示全部楼层
移植会出现各种问题,实在找不到问题就重新移植,我移植过3次LWIP一个F103,两个F429最开始也是有问题,我最终移植稳定后,用网络调试助手,每1ms、发送7000个字节(现实没这么快,用网络调试助手可以达到500K字节/秒,用上位机其它测速软件测试F429可以达到单独的收、发数据10M字节/秒),我的板子接收到之后再返回给网络调试助手,连续收发一周也不会死机,中间有因为网络环境等其他原因断开过与网络调试助手的连接,对于以太网来说断开重联都算正常,重新联通之后还是可以正常收发数据。移植LWIP最好还是找一个ST官方给的移植例程移植,虽然官方移植是基于freertos版本的,但还是有很大参考价值。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 15:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表