OpenEdv-开源电子网

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

STM32F407+LWIP,怎么复用TCP-Client的缓冲区

[复制链接]

2

主题

17

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-1-15
在线时间
12 小时
发表于 2019-12-31 18:24:31 | 显示全部楼层 |阅读模式
30金钱
是这样的,我用的正点原子的战舰版,STM32F407+LAN8720+LWIP,想要做一个局域网的网络播放器,参考了实验43 音乐播放器实验,和实验55 网络通信实验。
看了下资料,这个网络的例程,应该是用的RAW方式的LWIP。
我记得很早的时候,测试了下接收速度,比较慢,具体数值现在给不出。

对于这个速度比较慢的问题,有些头疼。
我习惯了拷贝数据,至少在linux上,也是通过read/recive把数据读到应用层的buf中。
现在,我怀疑是不是因为拷贝数据导致速度慢。那如果不拷贝数据,就得去熟悉Lwip的架构了,看了几天也没有搞懂。

看到不少网友提到说自己测试的速度能上兆字节每秒,这个是怎么做到的呢?
还请指点一二!多谢!

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

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-1-15
在线时间
12 小时
 楼主| 发表于 2020-1-2 18:36:43 | 显示全部楼层
tcp_recved(struct tcp_pcb *pcb, u16_t len)
这个函数,如果说TCP接收缓冲区已经接收了1000B的数据,但是我现在只能处理掉300B数据,我这里可否调用这个函数先消除30,剩下700B下次弄?
因为例程中是这么调用的:
tcp_recved(tpcb,p->tot_len);
这相当于就是把当前收到的p区中的数据全都释放掉,如果当前不能释放这么多,能分次释放吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-1-3 02:07:04 | 显示全部楼层
lr6410 发表于 2020-1-2 18:36
tcp_recved(struct tcp_pcb *pcb, u16_t len)
这个函数,如果说TCP接收缓冲区已经接收了1000B的数据,但是 ...

可以用fifo处理。
至于F407加LAN8720,网络通信速度可以达到5MB以上的速度,完全满足音乐 播放了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-1-15
在线时间
12 小时
 楼主| 发表于 2020-1-3 09:34:46 | 显示全部楼层
正点原子 发表于 2020-1-3 02:07
可以用fifo处理。
至于F407加LAN8720,网络通信速度可以达到5MB以上的速度,完全满足音乐 播放了

谢谢回复。

但是我还是不知道tcp_recved();这个能不能分次释放,而不是这里直接用
p->tot_len这个完整的长度一次全部释放
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-1-15
在线时间
12 小时
 楼主| 发表于 2020-1-3 15:39:24 | 显示全部楼层
lr6410 发表于 2020-1-3 09:34
谢谢回复。

但是我还是不知道tcp_recved();这个能不能分次释放,而不是这里直接用

如果可以分次释放,似乎又会引出一个问题。
一次没释放完,那这个回调是不是还会触发,如果不触发,那是不是下次收到了数据才触发回调。如果不用等到下次触发,那触发的频率是怎么样的呢?触发的机制又是怎么样的呢?

为了避免把LWIP收到的数据又再一次的拷贝到自己定义的缓冲区,那应该就是利用好LWIP的缓冲区,我可以把外部的SRAM全部开给LWIP的接收缓冲区,因为发送的数据不多也不频繁。然后在处理收到的数据时,相当于是其他的程序和LWIP共享这个区域,用完了就回收,这样的话,既不会浪费多一份的内存,也不会浪费CPU去做拷贝工作。
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-1-15
在线时间
12 小时
 楼主| 发表于 2020-1-3 18:31:33 | 显示全部楼层
再补充一下,看到了tcp_recved();后面紧跟了个pbuf_free(p);这下心都凉了。这难道真的是非要一次就的全部释放吗?
那到底要怎么避免拷贝呢?
回复

使用道具 举报

2

主题

17

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-1-15
在线时间
12 小时
 楼主| 发表于 2020-1-6 11:49:41 | 显示全部楼层
正点原子 发表于 2020-1-3 02:07
可以用fifo处理。
至于F407加LAN8720,网络通信速度可以达到5MB以上的速度,完全满足音乐 播放了

大佬,请问,你说的FIFO,是指什么?
是软件的buf,然后用DMA来传输?还是有专有的硬件FIFO来处理?
盼回,谢谢!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-11 13:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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