OpenEdv-开源电子网

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

STM32F107移植LWIP进行TCP通讯长时间通讯造成内存泄漏

[复制链接]

3

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-12-25
在线时间
50 小时
发表于 2017-6-29 10:56:25 | 显示全部楼层 |阅读模式
最近在用STM32F107做以太网,移植了LWIP1.3.1进行TCP客户端/服务器通讯,,,短时间通讯没问题,每200ms发送1300字节,串口发给以太网,以太网发给串口这样交互。但是在长时间通讯发现通讯停止,PING不同了,仿真发现进入了硬件错误中断,怀疑是LWIP内存溢出了,请问有什么好的解决办法吗?

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

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11924
金钱
11924
注册时间
2015-11-5
在线时间
2087 小时
发表于 2017-6-29 11:08:53 | 显示全部楼层
查看下以太网数据包接收缓冲区的读写指针是否异常,注意不是LWIP的接收缓冲区
回复 支持 反对

使用道具 举报

3

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-12-25
在线时间
50 小时
 楼主| 发表于 2017-6-29 15:00:29 | 显示全部楼层
FreeRTOS 发表于 2017-6-29 11:08
查看下以太网数据包接收缓冲区的读写指针是否异常,注意不是LWIP的接收缓冲区

我用的是裸机,现在在测试呢,出问题有时候是一天,有时候是2天,后来我计算了一下,串口波特率是115200,也就是1秒钟最多发送或者接收14.4KB字节数据,我要发送1400字节则需要97.2ms,这是发送时间,还有个接受的时间呢,所以串口发送到以太网,再从以太网接收数据发送到川口,一共需要97.2X2=194.4ms,所以留给单片机的空闲时间理论上是200ms-194.4ms=5.6ms(因为我现在是没200ms发送一次数据,数据长度是1400字节),所以问题有没有可能是出现在这里,由于单片机的空闲时间可能会越来越紧张,最终造成接收缓冲区数据溢出而导致死机呢?
回复 支持 反对

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11924
金钱
11924
注册时间
2015-11-5
在线时间
2087 小时
发表于 2017-6-29 17:26:02 | 显示全部楼层
shuimogezi 发表于 2017-6-29 15:00
我用的是裸机,现在在测试呢,出问题有时候是一天,有时候是2天,后来我计算了一下,串口波特率是115200 ...

大部分程序跑飞的情况都是内存越界导致的,收发缓冲区的溢出检测这个肯定得做的,你现在要确认到底是程序跑飞了,还是网络接收出错了
拿来长岛冰茶换我半晚安睡
回复 支持 反对

使用道具 举报

3

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-12-25
在线时间
50 小时
 楼主| 发表于 2017-7-2 14:45:47 | 显示全部楼层
FreeRTOS 发表于 2017-6-29 17:26
大部分程序跑飞的情况都是内存越界导致的,收发缓冲区的溢出检测这个肯定得做的,你现在要确认到底是程序 ...

替换了LWIP1.4.1仿真发现程序在tcp_output(struct tcp_pcb *pcb)的这个位置
/* useg should point to last segment on unacked queue */
  useg = pcb->unacked;
  if (useg != NULL) {
    for (; useg->next != NULL; useg = useg->next);
  }
回复 支持 反对

使用道具 举报

3

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-12-25
在线时间
50 小时
 楼主| 发表于 2017-7-2 14:48:26 | 显示全部楼层
FreeRTOS 发表于 2017-6-29 17:26
大部分程序跑飞的情况都是内存越界导致的,收发缓冲区的溢出检测这个肯定得做的,你现在要确认到底是程序 ...

TCP接收数据包一包是512个字节,我串口发送,做了防止内存溢出的判断,最多一次发送1460字节,多了的忽略
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2017-3-27
在线时间
3 小时
发表于 2017-7-6 22:23:51 | 显示全部楼层
醉了。。
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
发表于 2017-8-3 10:04:16 | 显示全部楼层
shuimogezi 发表于 2017-7-2 14:48
TCP接收数据包一包是512个字节,我串口发送,做了防止内存溢出的判断,最多一次发送1460字节,多了的忽略

楼主,你这个是怎么处理的?我这边在长时间运行的情况下,经常数据发不出去
回复 支持 反对

使用道具 举报

9

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2016-4-22
在线时间
37 小时
发表于 2017-8-8 13:57:19 | 显示全部楼层
你可以试试改 lwipopts.h内的参数
回复 支持 反对

使用道具 举报

3

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-12-25
在线时间
50 小时
 楼主| 发表于 2017-9-8 00:11:12 | 显示全部楼层
huoyancool 发表于 2017-8-8 13:57
你可以试试改 lwipopts.h内的参数

已经没有问题了谢谢
回复 支持 反对

使用道具 举报

3

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-12-25
在线时间
50 小时
 楼主| 发表于 2017-9-8 00:11:37 | 显示全部楼层
lzq12 发表于 2017-8-3 10:04
楼主,你这个是怎么处理的?我这边在长时间运行的情况下,经常数据发不出去

已经处理好了
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-4-18
在线时间
17 小时
发表于 2017-10-12 21:34:59 来自手机 | 显示全部楼层
请问楼主是如何解决的?
回复 支持 反对

使用道具 举报

3

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-12-25
在线时间
50 小时
 楼主| 发表于 2017-10-14 12:35:40 | 显示全部楼层
twinklewho 发表于 2017-10-12 21:34
请问楼主是如何解决的?

裸机跑LWIP和加入操作系统后的LWIP,在注册网卡的时候有点不一样,裸机注册用的是RAW API,加入操作系统后,注册的就是适合操作系统用的API
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2018-9-18
在线时间
1 小时
发表于 2018-9-18 09:36:10 | 显示全部楼层
shuimogezi 发表于 2017-10-14 12:35
裸机跑LWIP和加入操作系统后的LWIP,在注册网卡的时候有点不一样,裸机注册用的是RAW API,加入操作系统后 ...

你好,请问具体是哪个接口?我现在用的是RAW API,运行一段时间之后发现PBUF的内存池和PCB的内存池都被耗光了。我的硬件平台和LWIP版本和你的完全一致,通信测试也很像。能否指点一下,非常感谢
回复 支持 反对

使用道具 举报

0

主题

91

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2018-9-27
在线时间
15 小时
发表于 2018-10-19 09:07:48 | 显示全部楼层
楼主最后是如何解决的呢?
回复 支持 反对

使用道具 举报

1

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2018-11-7
在线时间
16 小时
发表于 2018-11-11 18:54:55 | 显示全部楼层
寻找楼主……
回复 支持 反对

使用道具 举报

3

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-12-25
在线时间
50 小时
 楼主| 发表于 2019-1-13 20:24:58 | 显示全部楼层
asdf89 发表于 2018-10-19 09:07
楼主最后是如何解决的呢?

裸机跑LWIP和加入操作系统后的LWIP,在注册网卡的时候有点不一样,裸机注册用的是RAW API,加入操作系统后,注册的就是适合操作系统用的API
回复 支持 反对

使用道具 举报

3

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-12-25
在线时间
50 小时
 楼主| 发表于 2019-1-13 20:25:25 | 显示全部楼层

还找我吗???
回复 支持 反对

使用道具 举报

13

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2018-1-11
在线时间
74 小时
发表于 2019-2-23 14:42:12 | 显示全部楼层
在debug 模式下  err = 0xFF 内存不足 的错误 ,在网上尝试了各种方法 ,还是没有能 解决问题 。
以下就是在网上查找的方法网址
1:
https://blog.csdn.net/qq_34660409/article/details/80117448
2:
降低通信频率 、timer近量调低
3:
https://www.zhihu.com/question/53528958
4:
https://blog.csdn.net/mmz_xiaoko ... tm_source=blogxgwz5
5:
https://blog.csdn.net/qingfengtsing/article/details/7012702
求大神帮助
方便的话 加个 扣扣  845812646
回复 支持 反对

使用道具 举报

48

主题

135

帖子

0

精华

高级会员

Rank: 4

积分
561
金钱
561
注册时间
2017-8-29
在线时间
89 小时
发表于 2019-7-23 17:18:05 | 显示全部楼层
以后该楼主的提问,大家可以屏蔽了。来这里问问题,解决了不分享。
回复 支持 反对

使用道具 举报

3

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-12-25
在线时间
50 小时
 楼主| 发表于 2019-7-30 10:27:06 | 显示全部楼层
hu25886 发表于 2019-7-23 17:18
以后该楼主的提问,大家可以屏蔽了。来这里问问题,解决了不分享。

错了,已经回复了,之前没有回复是因为没有认证
回复 支持 反对

使用道具 举报

3

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-12-25
在线时间
50 小时
 楼主| 发表于 2019-7-30 10:27:27 | 显示全部楼层
君仁知命 发表于 2019-2-23 14:42
在debug 模式下  err = 0xFF 内存不足 的错误 ,在网上尝试了各种方法 ,还是没有能 解决问题 。
以下就是 ...

主要是我用的RTOS,所以在注册LWIP的时候就不能用RAW的方式来处理了,RAW当然也可以在RTOS下使用,但是LWIP作者不推荐,推荐使用Socket或者NetConn API来操作,所以我把注册接口改成了RTOS支持的就可以。如下函数:
netif_add(&netif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input);

只需要改成tcpip_input就可以了,之前用的是raw的接口,,,,这个地方要注意一下
回复 支持 反对

使用道具 举报

3

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-12-25
在线时间
50 小时
 楼主| 发表于 2019-7-30 10:28:09 | 显示全部楼层
asdf89 发表于 2018-10-19 09:07
楼主最后是如何解决的呢?

主要是我用的RTOS,所以在注册LWIP的时候就不能用RAW的方式来处理了,RAW当然也可以在RTOS下使用,但是LWIP作者不推荐,推荐使用Socket或者NetConn API来操作,所以我把注册接口改成了RTOS支持的就可以。如下函数:
netif_add(&netif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input);

只需要改成tcpip_input就可以了,之前用的是raw的接口,,,,这个地方要注意一下
回复 支持 反对

使用道具 举报

3

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-12-25
在线时间
50 小时
 楼主| 发表于 2019-7-30 10:28:30 | 显示全部楼层
twinklewho 发表于 2017-10-12 21:34
请问楼主是如何解决的?

主要是我用的RTOS,所以在注册LWIP的时候就不能用RAW的方式来处理了,RAW当然也可以在RTOS下使用,但是LWIP作者不推荐,推荐使用Socket或者NetConn API来操作,所以我把注册接口改成了RTOS支持的就可以。如下函数:
netif_add(&netif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input);

只需要改成tcpip_input就可以了,之前用的是raw的接口,,,,这个地方要注意一下
回复 支持 反对

使用道具 举报

3

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-12-25
在线时间
50 小时
 楼主| 发表于 2019-7-30 10:29:00 | 显示全部楼层
huoyancool 发表于 2017-8-8 13:57
你可以试试改 lwipopts.h内的参数

和那个没关系,已经解决了,非常感谢
回复 支持 反对

使用道具 举报

3

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-12-25
在线时间
50 小时
 楼主| 发表于 2019-7-30 10:30:31 | 显示全部楼层
shuimogezi 发表于 2017-7-2 14:48
TCP接收数据包一包是512个字节,我串口发送,做了防止内存溢出的判断,最多一次发送1460字节,多了的忽略

也可以,毕竟TCP的数据包最大1500字节,在抛出去帧头校验什么的也就1400多个字节,具体多少忘记了,一会我脑补一下TCPIP协议去
回复 支持 反对

使用道具 举报

3

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-12-25
在线时间
50 小时
 楼主| 发表于 2019-7-30 10:31:22 | 显示全部楼层
lzq12 发表于 2017-8-3 10:04
楼主,你这个是怎么处理的?我这边在长时间运行的情况下,经常数据发不出去

不知道你用的是裸机还是RTOS?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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