OpenEdv-开源电子网

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

STM32 F4 LWIP TCP连续调用tcp_write发送大量数据出现问.

[复制链接]

10

主题

31

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-4-9
在线时间
17 小时
发表于 2020-4-15 00:10:17 | 显示全部楼层 |阅读模式
12金钱
板卡作为客户端,电脑是服务器,客户端10ms内要发送8000个字节,分成10包发送,每一包发1000个字节,也就是连续写10个tcp_send函数(这个函数我自定义的)。发送50万个字节后就卡死,tcp_write(tpcb, ptr->payload, ptr->len, 1);的返回值变成了ERR_MEM,请问各位做这种连续发送大量数据TCP的项目时,这个问题是如何解决的。

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

使用道具 举报

10

主题

31

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-4-9
在线时间
17 小时
 楼主| 发表于 2020-4-15 09:38:01 | 显示全部楼层
有人做过类似的项目吗?
回复

使用道具 举报

10

主题

31

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-4-9
在线时间
17 小时
 楼主| 发表于 2020-4-21 22:46:22 | 显示全部楼层
目前还是没有解决tcp_write(tpcb, ptr->payload, ptr->len, 1) 返回值还是ERR_MEM,绝对不是tcp_sndbuf或者snd_queuelen的问题,原因如下:
while ((wr_err == ERR_OK) &&
         (es->p_tx != NULL) &&
         (es->p_tx->len <= tcp_sndbuf(tpcb))&&(es->pcb->snd_queuelen<=TCP_SND_QUEUELEN))  
  {
    /* get pointer on pbuf from es structure */
    ptr = es->p_tx;
    /* enqueue data for transmission */
    wr_err = tcp_write(tpcb, ptr->payload, ptr->len, 1);
}
我是判断后才进入tcp_write;在仿真的时候在tcp_write函数里打断点,发现程序进入到了这里卡主:
if ((concat_p = tcp_pbuf_prealloc(PBUF_RAW, seglen, space, &oversize, pcb, apiflags, 1)) == NULL) {
          LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2,
                      ("tcp_write : could not allocate memory for pbuf copy size %"U16_F"\n",
                       seglen));
          goto memerr;
        }
这里出错,进入memerr。因此返回ERR_MEM,继续跟踪,tcp_pbuf_prealloc()返回的空值,进入这里查看:
  p = pbuf_alloc(layer, alloc, PBUF_RAM);
  if (p == NULL) {
    return NULL;
只有在p = pbuf_alloc(layer, alloc, PBUF_RAM) == NULL的时候返回空值,因此 是什么原因导致pbuf_alloc()无法分配内存呢?
回复

使用道具 举报

2

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2020-3-19
在线时间
23 小时
发表于 2020-7-29 15:34:21 | 显示全部楼层
楼主解决了吗,我也要做大容量发送数据
回复

使用道具 举报

3

主题

19

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2023-5-31
在线时间
6 小时
发表于 2023-5-31 18:25:27 | 显示全部楼层
wangxinli2 发表于 2020-4-21 22:46
目前还是没有解决tcp_write(tpcb, ptr->payload, ptr->len, 1) 返回值还是ERR_MEM,绝对不是tcp_sndbuf或者 ...

大哥搞定了吗
回复

使用道具 举报

3

主题

19

帖子

0

精华

新手上路

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

使用道具 举报

3

主题

19

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2023-5-31
在线时间
6 小时
发表于 2023-5-31 18:55:18 | 显示全部楼层
FPGAZX 发表于 2023-5-31 18:54
只能自己通过控制传输次数来清理write数据了,确保每次传输数据到达TCP_SND_BUF,TCP_SND_QUEUELEN值,应用s ...

http://www.openedv.com/forum.php ... mp;page=1#pid518451
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-6-8 23:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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