LWIP移植成功了

2020-01-01 17:34发布

成功移植lwip1.3.1 1.3.2 1.4.1,裸机能跑tcp客户端和服务器。
开心之余,又有些问题需要请教了,lwip里面如何处理断线重连的问题?

下面是我实验的现象:
我在裸机上使用lwip,tcp做了服务器和客户端,在连接后把网线拔掉,tcp_poll函数还是会被执行的,这时候把网线插上(还没出现abort错误),需要重新连接(端口没变,原连接已经没反应了),连接后上一次连接的pcb仍然存在,这时候会发现轮询时候有两个pcb连接在运行。等了好几分钟后(关闭了保活设置)第一个pcb连接出现连接错误,自动断开。。。
这两个pcb占用同一个端口不会产生冲突吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
99条回答
Lee2012
1楼-- · 2020-01-08 19:24
 精彩回答 2  元偷偷看……
落叶知秋
2楼-- · 2020-01-08 22:22
落叶知秋 发表于 2013-9-5 12:10
添加了sys_now()这个函数后,LwIP1.4.1可以跑起来了。可以ping通。
但是,在测试中遇到了这样一个问题:( ...

问题已解决!
是IAR5.41编译器的BUG!lwip源码中的src/include/lwip/tcp_impl.h文件中,有这样一段宏定义:

#define TCP_SEQ_LT(a,b)     ((s32_t)((u32_t)(a) - (u32_t)(b)) < 0)
#define TCP_SEQ_LEQ(a,b)    ((s32_t)((u32_t)(a) - (u32_t)(b)) <= 0)
#define TCP_SEQ_GT(a,b)     ((s32_t)((u32_t)(a) - (u32_t)(b)) > 0)
#define TCP_SEQ_GEQ(a,b)    ((s32_t)((u32_t)(a) - (u32_t)(b)) >= 0)

由于直接用lwip官网下载的源码移植,忽略了这个BUG的存在!以下是TI官网配套的lwip-1.3.2源码中的修改:

/* Modified by TI to work around an IAR 5.41 compiler bug */
#if 0
#define TCP_SEQ_LT(a,b)     ((s32_t)((a)-(b)) < 0)
#define TCP_SEQ_LEQ(a,b)    ((s32_t)((a)-(b)) <= 0)
#define TCP_SEQ_GT(a,b)     ((s32_t)((a)-(b)) > 0)
#define TCP_SEQ_GEQ(a,b)    ((s32_t)((a)-(b)) >= 0)
#else
/* TI replacement definitions... */
#define TCP_SEQ_LT(a,b)     ((s32_t)(a) < (s32_t)(b))
#define TCP_SEQ_LEQ(a,b)    ((s32_t)(a) <= (s32_t)(b))
#define TCP_SEQ_GT(a,b)     ((s32_t)(a) > (s32_t)(b))
#define TCP_SEQ_GEQ(a,b)    ((s32_t)(a) >= (s32_t)(b))
#endif

覆盖后,tcp_write()就可以成功发送数据了。
出现发送不成功的原因,查了一下,是在函数tcp_in()中,由于上述的BUG,进不来一下判断:

/*五个连续的判断,DUP_Ack*/
if (TCP_SEQ_LEQ(ackno, pcb->lastack))
{……}
else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt))
{……}//<--------这里进不来,假设为A部分

在A部分中有pcb->unacked的处理,由于BUG的影响,一直没有处理,即一直都是有unack的标志。
然后,在慢启动函数tcp_slowtmr()中,会由于pcb->unacked != NULL而启动重发。
所以有了这个问题。
总结:编译器还是用最新版本的比较好……
P.S. 硬件平台:LM3S8962
      软件环境:IAR 5.41
63502925
3楼-- · 2020-01-09 01:41
新版IAR破解比以前麻烦了
落叶知秋
4楼-- · 2020-01-09 02:54
落叶知秋 发表于 2013-9-7 16:06
问题已解决!
是IAR5.41编译器的BUG!lwip源码中的src/include/lwip/tcp_impl.h文件中,有这样一段宏定义 ...

更正!

第一:用了IAR 6.4(目前最新版本)进行了同样的源码编译,还是会有同样的问题(发不出数据)!
没有具体比较过汇编的异同,只知道是不同的!如果有哪位高人知道,请告知!!

第二:用TI的代码替换后,会衍生出新的问题!就是边界问题!
TI的代码比较是用的s32_t类型,即是有符号数据类型!到达了符号位后,有问题!比如0x7FFFFFFF和0x80000000!
现象是:发送的数据量到达了一定后,比较的结果不对就会导致数据传输出问题(即是停止不动)!

还在苦逼调试中……
落叶知秋
5楼-- · 2020-01-09 06:52
落叶知秋 发表于 2013-9-9 19:50
更正!

第一:用了IAR 6.4(目前最新版本)进行了同样的源码编译,还是会有同样的问题(发不出数据)!

发了一个关于这个问题的帖子
LM3S8962 + LwIP + 无操作系统,长时间数据收发问题的解决
http://www.amobbs.com/thread-5550592-1-1.html
有兴趣的朋友可以去看看。
现在发了14个小时都没有停下来,希望板子不会自己停啦……念咒中……
xhyzjiji
6楼-- · 2020-01-09 09:18
 精彩回答 2  元偷偷看……

一周热门 更多>