OpenEdv-开源电子网

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

tcp_output()成功后没有释放RAM数据,MEM_SIZE设置问题

[复制链接]

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-12-6
在线时间
16 小时
发表于 2016-12-6 11:29:58 | 显示全部楼层 |阅读模式
1金钱
为什么用tcp_output(pcb)后并没有清理tcp_write(pcb,data,len,1),write的数据是保存在RAM中的这有关MEM_SIZE的值的设置,是不是需要循环tcp中断一次即tcp_close(tpcb)才能清理RAM的数据,MEM_SIZE 要设置很大才能发送大量数据,应用的开发板不可能说是无限大的内存,期待帮助,自己设置循环一次可以处理大量数据,可是这样传输速率完全降低从500K~1M降到不足100k的速度

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

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-12-6
在线时间
16 小时
 楼主| 发表于 2016-12-6 18:25:12 | 显示全部楼层
本帖最后由 Jachson 于 2016-12-8 08:44 编辑

大神赐教吧,困惑了一个星期了err_t send_data(uint32_t ps, u16_t plen)
{
        err_t wr_err, output_err;
        if(ps !=NULL)
        {
                wr_err = tcp_write(test_pcb, (uint32_t *)ps, plen, 1);
                output_err = tcp_output(test_pcb);
                tcp_recved(test_pcb, plen);
                mem_free(test_pcb);
              if (wr_err == ERR_OK && output_err == ERR_OK)
             {
                 return ERR_OK;
            }
     
      }
        return NULL;
}

在另一个函数 int32 DMA_date_send(uint32_t sourse_address, uint16_t byte_len)
{
    for(check_flag=0; check_flag<MAX_NUM;check_flag++ )
    {
       send_data(sourse_address, byte_len);
    }
}

后来通过调试改变lwipopts.h 中MEM_SIZE 还有一些参数,调试返回错误一直在tcp_enqueue()中几个memerr,ERR_MEM中来回
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-12-8 21:51:41 | 显示全部楼层
帮顶
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-12-6
在线时间
16 小时
 楼主| 发表于 2016-12-9 16:36:44 | 显示全部楼层
本帖最后由 Jachson 于 2016-12-9 16:37 编辑

原子哥请教一下,是必须循环一次(从主函数进入tcp中断)才会对tcp_write()到tcp_enqueue(struct tcp_pcb *pcb, void *arg, u16_t len, u8_t flags, u8_t apiflags, u8_t optflags);复制的发送数据包进行清理??在tcp_enqueue()函数最后有一个memp_free(MEMP_TCP_SEG, queue);即时这样还是不能够完全清除tcp发送过程复制的数据,若是tcp_write()最后一个参数设置为0,虽然数据发完了但是数据不对位,
还是有一个平衡点,关于内存栈设置的大小问题,lwipopts.h里面值到底该如何设置为好,并不是一起调大了就好了,也参考了一些其他人的配置问题,即使tcp_enqueue没有问题,数据还是没有发送完,自己设置的发送函数用
while(data != 0){   send_data(sourse_address, byte_len);
sourse_address++;      
data --
}这只是形式一样的,其实就是调用函数不断改变地址,改变数据长度发送,就是一直用while循环,知道数据为0 跳出循环;
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-11 03:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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