【转贴】lwip TCP传输速率振荡问题解决
这些天使用VDSP集成的在VDK上移植的lwip协议栈传输视频数据,使用交叉线在DSP BF537与PC机之间用TCP传数据,速率变化很大,在50kbps ~ 8Mbps之间快速变化,速率不断的振荡,而且网络中如果有其它的速据则我们的传输速率迅速下降,一般低于1Mbps。 我原来以为是协议栈的参数设置得不够好,于是不断地更改 lwipopts.h,测试得结果都差不多,当把lwip的缓冲区调到最大时也没有什么改善,速率还是和以前一样,不断的振荡,测试花了不少的时间,让我 很郁闷。据我所知,lwip虽然是一个开源的协议栈,但已经得到广泛的应用了,应该不是协议栈本身的原因,我开始怀疑是协议栈移植的原因了,于是开始看
lwip移植以及部分源代码,看了焦大侠的lwip在ucos的移植笔记,这个笔记非常的详细,焦大侠还提供了源代码,是一个难得的学习资料,真应该向焦 大侠说声谢谢!根据焦大侠的笔记,我把移植部分的源代码看了一遍,发现没有什么不对的地方,我只得怀疑协议栈的原因了。以前看了unix网络编程,知道 socket编程还是有很多的选项可以更改了,这些选项也会影响到协议栈的性能,其中发送和接收缓冲区的大小可以在VDSP IDDE上设置,其余的影响性能的选项主要是一个叫做Nagle的算法。我开始看lwip源码socket.c,这里面就包含了设置选项的函数,
setsocketopt(),看看支持了哪些选项,在IPPROTO_TCP选项里就有TCP_NODELAY选项,这个可以关闭Nagle算法,这个 算法我不是很清楚,所以我就登陆
http://lists.gnu.org/archive/html/lwip-users/,搜索TCP_NODELAY,其中就有我遇到的类似的问题,我非常的兴奋,问题应该就是这里了。我在程序中添加socket的选项TCP_NODELAYint
optval = 1;setsocketopt(socket_fd, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof(optval) );重新编译程序,果然发送数据稳定在8Mbps,呵呵,终于搞定了。。。。。。。 另外在运行程序时死机,打印消息 Assertion " sys_mbox_post: mbox not full " in arch-VDKsys_arch.c,在前一段时间看lwip在VDK移植的时候看了sys_arch.c文件,找到产生这个Assertion的
语句,原来是向一个已经满了的邮箱发送邮件,这当然是个错误,邮箱的大小是通过SYS_MBOX_SIZE来定义的,我将这个值改成1024,重编译, OK,问题解决了,呵呵 总之,项目开发的过程中会遇到各种想不到了问题,一般还是可以解决的,关键是时间和耐心。。。。。。