OpenEdv-开源电子网

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

LWIP协议怎么提高UDP速度?

[复制链接]

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
发表于 2016-8-26 11:16:18 | 显示全部楼层 |阅读模式
1金钱
void udp_server_rev(void* arg,struct udp_pcb* upcb,struct pbuf* p,struct ip_addr*addr ,u16_t port)
{  
    u32_t crc16_1;
          u32_t crc16_2;
    u32_t data_len=0;
                  struct pbuf *q,*ptr;
       

    if(p!=NULL)
                {  
                                pbuf_free(p);
                        fcl_control_sys[6]=0x00;
                                                fcl_control_sys[7]=0x01;
                                                fcl_control_sys[8]=0x06;
                                                fcl_control_sys[11]=0x03;
                                                fcl_control_sys[9]=(unsigned char)(CRC16_1(fcl_control_sys,9)>>8);
                                                fcl_control_sys[10]=(unsigned char)(CRC16_1(fcl_control_sys,9));
                                                ptr=pbuf_alloc(PBUF_RAW,12,PBUF_RAW);
                                                pbuf_take(ptr,(u8*)fcl_control_sys,12);
                                                udp_sendto(upcb,ptr,addr,UDP_send_PORT);   开发板每次都返回一个指定的端口
                                                pbuf_free(ptr);
                                                               
        }
}
开发板接收到数据之后清空,然后回应一个成功包(测试用,什么都没处理,就只分配发送包需要的内存)。我发送1.8M的mp3文件,为什么要耗时10分钟左右?

PC端使用的是组播230.1.2.3地址,每次发包源端口(PC)都随机改变,开发板每次都返回一个指定的端口。



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

使用道具 举报

11

主题

1041

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3696
金钱
3696
注册时间
2011-5-23
在线时间
2008 小时
发表于 2016-8-26 12:24:28 | 显示全部楼层
bind后就不会变了。
UDP的综合性能其实是比TCP要差的。
如果你的应用逻辑是等收到ACK后再发送的下一包的话,就确实很慢了。
建议使用队列+重发的方式,这样可以少等些时间。
可以双方抓包分析,以找出原因。
另外如果是组播,ACK的作用感觉也不是很大呀。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
 楼主| 发表于 2016-8-26 15:07:15 | 显示全部楼层
aozima 发表于 2016-8-26 12:24
bind后就不会变了。
UDP的综合性能其实是比TCP要差的。
如果你的应用逻辑是等收到ACK后再发送的下一包的 ...

我的校验过程挺快的,也是使用的ACK,这里提一下:收到校验命令,开始一帧一帧的返回数据,每帧数据1024字节,当PC端收到数据之后,和源数据文件进行比较,没有错误之后再发送ACK给开发板,开发板收到ACK之后再继续发送数据,直到发送完成。这个过程的速度比主题上的测试过程还快呢。测试过程只是把包仍了什么都没做为什么速度还那么慢?
回复

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
 楼主| 发表于 2016-8-26 16:40:40 | 显示全部楼层
大文件.PNG 小文件.PNG


不管大文件还是小文件,为什么我这个网络UDP速度慢得离谱?平均3KB/s?????????
回复

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
 楼主| 发表于 2016-8-27 09:49:34 | 显示全部楼层
有大神吗?实在是想不通啊
回复

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
 楼主| 发表于 2016-8-27 10:48:19 | 显示全部楼层
if(p!=NULL)
                {  
                                pbuf_free(p);
                        if(p==NULL)
                        {
                        .....}
我发现pbuf_free并不能释放p,调试的过程中执行不到p==NULL里面的程序
回复

使用道具 举报

11

主题

1041

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3696
金钱
3696
注册时间
2011-5-23
在线时间
2008 小时
发表于 2016-8-27 11:49:18 | 显示全部楼层
本帖最后由 aozima 于 2016-8-27 17:17 编辑
zhoujianwen 发表于 2016-8-27 10:48

[mw_shl_code=c,true]if(p!=NULL)
{  
    pbuf_free(p);
    if(p==NULL)
    {
        .....
    }[/mw_shl_code]

我发现pbuf_free并不能释放p,调试的过程中执行不到p==NULL里面的程序

这你得重修C语言了。

除非你做了  p =xx
不然p不会变(p所指向的内容可能变了)
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
 楼主| 发表于 2016-8-27 15:35:30 | 显示全部楼层
aozima 发表于 2016-8-27 11:49
这你得重修C语言了。

除非你做了  p =xx

那这么说的话,最后还得来一句P=NULL?
回复

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
 楼主| 发表于 2016-8-27 15:48:34 | 显示全部楼层
static struct pbuf * low_level_input(struct netif *netif)
{
  FrameTypeDef frame;
  u8 *buffer;      
  frame = ETH_RxPkt_ChainMode();
  buffer = (u8 *)frame.buffer;        
          frame.descriptor->Status = ETH_DMARxDesc_OWN;//这里是接收描述符的一些处理。确保还能接收下一帧
  if ((ETH->DMASR & ETH_DMASR_RBUS) != (u32)RESET)  
  {

        ETH->DMASR = ETH_DMASR_RBUS;
    ETH->DMARPDR = 0;
  }       
        if((buffer[30]==0xe6)&&(buffer[31]==0x01)&&(buffer[32]==0x02)&&(buffer[33]==0x03)&&(buffer[36]==0x2c)&&(buffer[37]==0x45))//判断组播地址和端口号
        {
                        buffer =  (u8 *)ETH_GetCurrentTxBuffer();
    memcpy(buffer,ceshi_buffer,60);        //这个buffer是正确处理之后的回应包
  ETH_TxPkt_ChainMode(60);
        }
return 0;
}
底层接口函数我已经改成一收到包之后就直接返回,什么都不做,为什么时间还是只有3KB/S左右?
时间更长.PNG 捕获包.PNG
这里给出时间和抓包软件图,证明确实是收到和发送了。希望大侠们能给点建议,为什么我的网络速度那么慢。谢谢大家了!
回复

使用道具 举报

11

主题

1041

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3696
金钱
3696
注册时间
2011-5-23
在线时间
2008 小时
发表于 2016-8-27 17:15:49 | 显示全部楼层
抓我用下过滤器。

代码用下code标签

这么乱,你自己看不累?
速度问题,自己根据抓包显示的时间间隔来调优吧。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
 楼主| 发表于 2016-8-29 11:32:08 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 22:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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