OpenEdv-开源电子网

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

STM32F429 ucosIII+LWIP1.4.1不稳定

查看数: 9759 | 评论数: 11 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2017-4-29 23:29

正文摘要:

如题。裸机的LWIP没有这个问题,加上操作系统就出现了这个问题。 具体情况是:STM32F429+DP8S848.开发板做服务器。 用网口调试助手建立TCP连接之后,不断收发数据一上午没问题,但是一旦网口调试助手主动断开连 ...

回复

XUZJWWSZ 发表于 2017-5-6 13:45:46

感谢开源电子网。
正点原子 发表于 2017-5-4 22:35:36
XUZJWWSZ 发表于 2017-5-3 23:22
我通过下面的代码暂时解决了问题,这个写法是参考一个别人分享的代码。
至于为什么用q->len==28 && q->fla ...

谢谢分享
XUZJWWSZ 发表于 2017-5-2 17:32:02
另外我在官方FREE RTOS + LWIP的例程中找到一个开发板做服务器的例子:
用这个代码每次TCP客户端发送一组数据,作为服务器的开发板收到数据原样返回,然后它自己就主动断开连接了!这种情况下也不存在卡死的情况了
我试着把主动断开连接的代码删掉,然后问题依旧。
[mw_shl_code=applescript,true]void another_server_netconn_thread(void *arg)
{
         struct netconn *conn, *newconn;
  err_t err, accept_err;
  
  /* Create a new TCP connection handle */
  conn = netconn_new(NETCONN_TCP);
  
  if (conn!= NULL)
  {
    /* Bind to port 80 (HTTP) with default IP address */
    err = netconn_bind(conn, NULL, 1032);
   
    if (err == ERR_OK)
    {
      /* Put the connection into LISTEN state */
      netconn_listen(conn);
  
      while(1)
      {
        /* accept any icoming connection */
        accept_err = netconn_accept(conn, &newconn);
        if(accept_err == ERR_OK)
        {
          /* serve connection */
          http_server_serve(newconn);

          /* delete connection */
          netconn_delete(newconn);
        }
      }
    }
    else
    {
      /* delete connection */
      netconn_delete(newconn);
      printf("can not bind netconn");
    }
  }
  else
  {
    printf("can not create netconn");
  }

}[/mw_shl_code][mw_shl_code=applescript,true]void http_server_serve(struct netconn *conn)
{
  struct netbuf *inbuf;
  err_t recv_err;
  char* buf;
  u16_t buflen;
  struct fs_file * file;
  
下面这段代码被我简化了,原本是发送网页的程序。
  /* Read the data from the port, blocking if nothing yet there.
   We assume the request (the part we care about) is in one netbuf */
  recv_err = netconn_recv(conn, &inbuf);
  
  if (recv_err == ERR_OK)
  {
    if (netconn_err(conn) == ERR_OK)
    {
                        netbuf_data(inbuf, (void**)&buf, &buflen);
                        netconn_write(conn,&buf,buflen,NETCONN_NOCOPY);
    }
  }
  /* Close the connection (server closes in HTTP) */
  netconn_close(conn);
  
  /* Delete the buffer (netconn_recv gives us ownership,
   so we have to make sure to deallocate the buffer) */
  netbuf_delete(inbuf);
}[/mw_shl_code]
zmingwang 发表于 2017-5-1 23:26:23
XUZJWWSZ 发表于 2017-5-1 22:06
请看一下第5楼,我找到了导致卡死的语句,但还是想不通。
仿真调试我没用过,上网查了一下方法都不详细 ...

STLINK当然是可以在线调试的,你就在线调试,出fault之后看看调用栈,应该可以发现问题点
另外注意,你的ucos是否移植正确
再一个,检查是否在中断中调用了不能调用的API函数
XUZJWWSZ 发表于 2017-5-1 22:06:18
zmingwang 发表于 2017-4-30 18:55
跟踪TCP的FIN状态,便可知哪里出了问题
另外,在进入HardFault中断后,查看调用栈,或许会有有用的信息.

请看一下第5楼,我找到了导致卡死的语句,但还是想不通。
仿真调试我没用过,上网查了一下方法都不详细,能否详细说一下,我手边只有ST-LINK可以吗?
XUZJWWSZ 发表于 2017-5-1 06:25:12
zmingwang 发表于 2017-4-30 18:55
跟踪TCP的FIN状态,便可知哪里出了问题
另外,在进入HardFault中断后,查看调用栈,或许会有有用的信息.

多谢你,我试试,昨晚不小心睡着了
zmingwang 发表于 2017-4-30 18:55:15
跟踪TCP的FIN状态,便可知哪里出了问题
另外,在进入HardFault中断后,查看调用栈,或许会有有用的信息.
XUZJWWSZ 发表于 2017-4-29 23:29:47
我通过下面的代码暂时解决了问题,这个写法是参考一个别人分享的代码。
至于为什么用q->len==28 && q->flags == 0 && q->type == 20做判断条件我也不知,是通过实验得到的。
[mw_shl_code=applescript,true]     while(1)
      {
        accept_err=netconn_accept(conn,&newconn);
      if (newconn)
        {
            struct netbuf *inbuf;
            char* buf;
            u16_t buflen;
             while(netconn_recv(newconn, &inbuf) == ERR_OK)
             {
                                                                        recv_err=ERR_OK;
                                                                        //sys_arch_protect();//&#189;&#248;&#200;&#235;&#193;&#217;&#189;&#231;&#199;&#248;
                                                                        for(q=inbuf->p;q!=NULL;q=q->next)  //±é&#192;ú&#205;ê&#213;&#251;&#184;&#246;pbuf&#193;&#180;±í
                                                                        {                                                                       
                                                                                if(q->len==28 && q->flags == 0 && q->type == 20)
                                                                                        {
                                                                                                recv_err=ERR_CONN;
                                                                                                //printf("\r\n q->flags=%d ,q->ref=%d ,q->type=%d\r\n",q->flags,q->ref,q->type);
                                                                                                break;
                                                                                        }//&#212;&#221;&#202;±&#189;&#226;&#190;&#246;TCP&#182;&#207;&#191;&#170;&#193;&#172;&#189;&#211;&#203;&#192;&#187;ú&#181;&#196;&#206;&#202;&#204;&#226;2015-8-17@zzh
                                                                        }

                                                                        //sys_arch_protect();//&#205;&#203;&#179;&#246;&#193;&#217;&#189;&#231;&#199;&#248;         
                                                                                if(recv_err < ERR_ISCONN)//&#212;&#221;&#202;±&#189;&#226;&#190;&#246;TCP&#182;&#207;&#191;&#170;&#193;&#172;&#189;&#211;&#203;&#192;&#187;ú&#181;&#196;&#206;&#202;&#204;&#226;2015-8-17@zzh
                                                                                {
                                                                                        netbuf_delete(inbuf);
                                                                                        netconn_close(newconn);       
                                                                                        netconn_delete(newconn);
                                                                                        printf("\r\n ·&#254;&#206;&#241;&#198;÷&#182;&#207;&#191;&#170;&#193;&#172;&#189;&#211; \r\n");
                                                                                        break;
                                                                                }
                                                                                else
                                                                                {
                                                                                        do
                                                                                                {       
                                                                                                        netbuf_data(inbuf, (void**)&buf, &buflen);
                                                                                                        commandbuf[0]=*buf;
                                                                                                        commandbuf[1]=*(buf+1);
                                                                                                        ETH_receive_Handle(commandbuf,buflen);
                                                                                                        netconn_write(newconn, buf, buflen, NETCONN_COPY);
                                                                                                }
                                                                                                while (netbuf_next(inbuf) >= 0);
                                                                                               
                                                                                                //netconn_close(newconn);
                                                                                                netbuf_delete(inbuf);
                                                                                        }
               
             }
              netconn_close(newconn);
              netconn_delete(newconn);
        }
      }[/mw_shl_code]



关闭

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

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

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

GMT+8, 2026-4-23 17:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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