You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LWIP TCP服务器脱离ST-Link调试后无法运行问题排查求助

LWIP TCP服务器调试正常但脱离ST-Link后故障排查

问题现象

基于LWIP实现的TCP服务器代码,在ST-Link调试状态下可正常与Hercules或树莓派客户端建立连接并收发数据;但拔掉ST-Link脱离调试环境后,设备板载LED闪烁提示故障,服务器完全无法工作,无法建立连接。

实现代码

void Tcp_Task(void const * argument)
{
  /* USER CODE BEGIN Tcp_Task */
  
  struct netconn *conn, *newconn;
  err_t err, accept_err;
  struct netbuf *buf;
  void *data;
  u16_t len;
  
  MX_LWIP_Init();
  
  LWIP_UNUSED_ARG(argument);
  
  conn = netconn_new(NETCONN_TCP);
  
  if (conn!=NULL)
  {  
    // netconn_bind(conn, NULL, port 번호)
    err = netconn_bind(conn, NULL, 5001);
    
    if (err == ERR_OK)
    {
      netconn_listen(conn);
      
      while (1) 
      {
        accept_err = netconn_accept(conn, &newconn);
    
        if (accept_err == ERR_OK) 
        {
          while (netconn_recv(newconn, &buf) == ERR_OK) 
          {
            do 
            {
              netbuf_data(buf, &data, &len);
              memcpy(receivemsg, data, len);
              
              
              transmitmsg = procPacket();
              
              msg_len = getsendPackSize();
              
              netconn_write(newconn, transmitmsg, msg_len, NETCONN_COPY);
              
            } 
            while (netbuf_next(buf) >= 0);
            
            netbuf_delete(buf);
          }
          netconn_close(newconn);
          netconn_delete(newconn);
        }
       
       osDelay(100);
      }
    }
    else
    {
      netconn_delete(newconn);
    }

  }

  
  /* Infinite loop */
    for(;;)
    {
      osDelay(100);
    }
  /* USER CODE END Tcp_Task */
}

代码中的明显问题

  1. 野指针错误:netconn_bind失败的else分支中,调用netconn_delete(newconn),但此时newconn未被初始化(仅在netconn_accept成功时才会赋值),属于野指针操作,会直接导致程序崩溃。应改为删除conn而非newconn。
  2. LWIP初始化时机错误:MX_LWIP_Init()被放在TCP任务中执行,通常LWIP需要在系统启动阶段完成初始化,确保网络栈在任务运行前就绪。调试环境下可能掩盖了初始化时序问题,脱离调试后因初始化时机错误导致网络栈无法正常工作。
  3. 未验证全局变量内存安全性:receivemsg、transmitmsg作为全局缓冲区,未明确其内存大小及分配情况,若memcpy时数据长度超过缓冲区大小,会触发内存越界,调试时可能因内存监控机制未崩溃,但脱离调试后直接导致程序异常。
  4. 冗余延迟与阻塞逻辑冲突:netconn_accept是阻塞式API,后续的osDelay(100)属于冗余操作,可能影响连接响应效率;且未处理netconn_accept的错误返回,若持续出错会导致无效循环占用系统资源。

故障排查方法

  1. 修复代码错误:
    • 将netconn_bind失败分支的netconn_delete(newconn)改为netconn_delete(conn)。
    • 把MX_LWIP_Init()移至main函数的系统初始化阶段,在所有任务启动前完成网络栈初始化。
    • 明确receivemsg、transmitmsg的缓冲区大小,添加长度校验(比如len不超过缓冲区最大容量),避免内存越界。
  2. 定位程序崩溃点:
    • 添加串口日志,在关键步骤(如netconn_new、netconn_bind、netconn_accept、netconn_recv等)输出状态信息,脱离调试后通过串口查看程序执行到哪一步崩溃。
    • 检查硬件看门狗配置,若LED闪烁是看门狗复位导致,说明程序运行过程中出现死循环或崩溃,需重点排查内存操作、未初始化变量等问题。
  3. 硬件与环境排查:
    • 检查系统时钟配置:确认脱离ST-Link后,MCU的外部晶振、系统时钟是否正常工作,LWIP依赖精准的时钟驱动网络栈。
    • 检查以太网硬件:验证PHY芯片的供电、复位引脚状态,确保网络硬件在脱离调试后能正常初始化。
    • 任务优先级配置:确保LWIP核心任务(如tcpip_thread)的优先级高于Tcp_Task,避免网络栈消息处理被阻塞。
  4. 依赖函数排查:
    • 检查procPacket()和getsendPackSize()的实现,确认是否存在依赖调试环境的逻辑(如未初始化的变量、调试专用接口),确保脱离调试后能正常返回有效数据。

内容的提问来源于stack exchange,提问作者user11503466

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:35:19