OpenEdv-开源电子网

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

一个lwip协议栈的问题。。。。

[复制链接]

0

主题

0

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2020-8-4
在线时间
6 小时
发表于 2017-3-11 23:55:00 | 显示全部楼层 |阅读模式
环境:STM32F407VET6,跑UCOSIII,FATFS,IDE为MDK5.18,调试工具ST-LINK。
             根据战舰开发板,移植好了LWIP(lwip-1.4.1版本),phy芯片为LAN8720。


  遇见的问题:
         STM32端做TCP CLIENT,在PC端使用TCP/UDP测试工具建SERVER
        复位板子,二者能建立连接,而且能正常通信。发送几首数据包持续测试几天,没有出现问题。
   但是,无论任何时候,如果SERVER端主动点断开连接,STM32就死机。
         此时,我在入HardFault_Handler函数的while(1)加断点,通过LR寄存器的值,找到了进入HardFault_Handler之前执行的代码。
         发生在测试代码的的任务的收数据部分。如下:
1.        err = netconn_recv(priv->tcpconn, &rbuf);
2.       if(err == ERR_OK)
3.       {
4.            if(netbuf_data(rbuf, &pdata, &rlen) == ERR_OK)
5.          {

6.                if(pdata != NULL && rlen > 0)
7.              {
8.                    if(rlen > 1000)
9.                    rlen = 1000;   
10.                   /*put data in fifo*/
11.                  //qmutex_put(&priv->fifo, pdata, rlen);
12.                   memcpy(&gTestBuf[0], pdata, rlen);
13.               }
14.          }
15.          netbuf_delete(rbuf);

16.      }
         进入HardFault_Handler之前,程序执行了以上代码的12行(拷贝收到的数据),
         以上代码在一个UCOS任务的while(1)里面执行。
      
         也就是说,在TCP/UDP测试工具的TCP SERVER执端点断开连接,STM32的CLIENT端收到了数据,执行以上代码的第1行,err = netconn_recv(priv->tcpconn, &rbuf); 返回的err值还是ERR_OK;
         为什么会这样? 为什么server 执行断开socket的动作,client会认为收到了数据。
         既然是拷贝数据出这个错,那我们一般都认为是不是出现了野指针,或者数据越界之类的。   那么我们把收数据的pdata指针,收数据的长度rlen,
        加入MDK的watch窗口。发现,rlen的值为0x0020,收数据netbuf结构体rbuf指针是0x2000E3B4, 数据指针pdata是0x0020001C。
        指针都不为NULL,rlen长的也不为0。
        麻烦各位兄弟指教下。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-9 01:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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