OpenEdv-开源电子网

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

lwip tcp_write 在while循环中连续发送内存不足问题

[复制链接]

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-12-6
在线时间
16 小时
发表于 2016-12-19 11:03:25 | 显示全部楼层 |阅读模式
30金钱
新手求教
Lwip tcp_output 后有没有清理tcp_write(,,,1)保存的数据,应用while循环tcp_write一段时间提示内存错误,也有更新函数
while(;i<ffff;i++){
wr_err = tcp_write(test_pcb, (uint32_t *)ps, plen, 1);
output_err = tcp_output(test_pcb);
tcp_recved(test_pcb, plen);
}有没有办法再设置一个清除数据的函数在while中自己清除,可以实现无限循环发送数据
(memset()只是清理应用层的,pbuf_free()清理链表申请的内存数据,memp_free()清理内核链表的数据?怎么样才可以清除write保存的数据,只有接受到ACK后自动清理?)
小弟不才,望大神指导!!!





最佳答案

查看完整内容[请看2#楼]

只能自己通过控制传输次数来清理write数据了,确保每次传输数据到达TCP_SND_BUF,TCP_SND_QUEUELEN值,应用send_buf(pcb)来确定还能够这次申请的内存,否则就会出现ERR_MEM,err_mem,各种问题,判断还能够申请下次发送的内存后继续下次发送,因为底层有检测数据发送情况,由于ERR_MEM问题就会对write在内核的数据进行删除,确保了下次传输正常进行,因为设置的poll时间500ms,自己跟踪代码好像是不需要这么久,底层有对数据发送的检 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-12-6
在线时间
16 小时
 楼主| 发表于 2016-12-19 11:03:26 | 显示全部楼层
只能自己通过控制传输次数来清理write数据了,确保每次传输数据到达TCP_SND_BUF,TCP_SND_QUEUELEN值,应用send_buf(pcb)来确定还能够这次申请的内存,否则就会出现ERR_MEM,err_mem,各种问题,判断还能够申请下次发送的内存后继续下次发送,因为底层有检测数据发送情况,由于ERR_MEM问题就会对write在内核的数据进行删除,确保了下次传输正常进行,因为设置的poll时间500ms,自己跟踪代码好像是不需要这么久,底层有对数据发送的检测,会直接进入ETH中断处理中,所以想要提高发送速率,提高lwipopts.h几个跟发送内存相关的数据,还有就是控制发送量及次数,基本解决问题
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-12-6
在线时间
16 小时
 楼主| 发表于 2016-12-22 11:40:18 | 显示全部楼层
对了还有一些就是很多人都提到的,还有原子哥也强调的tcp_recved()滑动窗口的设置每次确保数据接收发送都有,不然很影响发送速度,还有可能造成数据丢失
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-12-25 23:03:03 | 显示全部楼层
帮顶
回复

使用道具 举报

601492584 该用户已被删除
发表于 2017-1-13 09:51:11 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-12-6
在线时间
16 小时
 楼主| 发表于 2017-1-16 08:42:15 | 显示全部楼层
查看你发送后有没有调整滑动窗口tcp_rcv()
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-12-6
在线时间
16 小时
 楼主| 发表于 2017-1-16 08:43:52 | 显示全部楼层
601492584 发表于 2017-1-13 09:51
请问,我调用tcp_write之前检查了tcp_sndbuf,缓冲队列还有20k左右的情况下,1K数据就写不下去了,返回ERR_ ...

原子哥交代几个注意的一定要加入发送接收代码否则就会越发数据量越小
回复

使用道具 举报

601492584 该用户已被删除
发表于 2017-1-16 13:25:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

601492584 该用户已被删除
发表于 2017-1-17 15:46:34 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-12-6
在线时间
16 小时
 楼主| 发表于 2017-1-18 15:08:23 | 显示全部楼层
我做的是server
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-12-6
在线时间
16 小时
 楼主| 发表于 2017-1-18 15:09:15 | 显示全部楼层
601492584 发表于 2017-1-16 13:25
请问在哪里查看你说的资料呢?谢谢!

就在这里面原子哥的技术资料可以下来看看
回复

使用道具 举报

3

主题

19

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2023-5-31
在线时间
6 小时
发表于 2023-6-1 15:53:21 | 显示全部楼层
Jachson 发表于 2017-1-16 08:42
查看你发送后有没有调整滑动窗口tcp_rcv()

大佬需要怎么调整啊
回复

使用道具 举报

3

主题

19

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2023-5-31
在线时间
6 小时
发表于 2023-6-1 15:54:18 | 显示全部楼层
Jachson 发表于 2017-1-16 08:43
原子哥交代几个注意的一定要加入发送接收代码否则就会越发数据量越小

具体怎么加入发送接收代码
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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