LWIP协议栈发送异常,内存无法分配

环境:

单片机型号:STM32H750
LWIP协议栈版本:LWIP 2.1.2

问题现象:

在协议栈大量收发数据的时候,断开网络或者断开路由(模拟网络不稳定情况),等待应用层心跳超时,待send数据包进入发送等待状态FIN_WAIT1,内存无法释放。
解决:
在tcp_slowtmr(void)函数内部,复制FIN_WAIT2的处理程序,改成FIN_WAIT1即可。

  /* Check if this PCB has stayed too long in FIN-WAIT-1 */
    if (pcb->state == FIN_WAIT_1) {
      /* If this PCB is in FIN_WAIT_1 because of SHUT_WR don't let it time out. */
      if (pcb->flags & TF_RXCLOSED) {
        /* PCB was fully closed (either through close() or SHUT_RDWR):
           normal FIN-WAIT timeout handling. */
        if ((u32_t)(tcp_ticks - pcb->tmr) >
            TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) {
          ++pcb_remove;
          LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in FIN-WAIT-1\n"));
        }
      }
    }

扩展知识

TCP状态
LISTEN:侦听来自远方的TCP端口的连接请求
SYN-SENT:再发送连接请求后等待匹配的连接请求(客户端)
SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认(服务器)
ESTABLISHED:代表一个打开的连接
FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2:从远程TCP等待连接中断请求
CLOSE-WAIT:等待从本地用户发来的连接中断请求
CLOSING:等待远程TCP对连接中断的确认
LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED:没有任何连接状态

主动端可能出现的状态:FIN_WAIT1、FIN_WAIT2、CLOSING、TIME_WAIT
被动端可能出现的状态:CLOSE_WAIT LAST_ACK

客户端的状态可以用如下的流程来表示:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED

服务器的状态可以用如下的流程来表示:
CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

NOTE:
(1)主动端出现大量的FIN_WAIT1时需要注意网络是否畅通、出现大量的FIN_WAIT2需要仔细检查程序为何迟迟收不到对端的FIN(可能是主动方或者被动方的bug)、出现大量的TIME_WAIT需要注意系统的并发量/socket句柄资源/内存使用/端口号资源等。
(2)被动端出现大量的 CLOSE_WAIT 需要仔细检查为何自己迟迟不愿调用close关闭连接(可能是bug,socket打开用完没有关闭)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32是一种微控制器系列,其中使用了轻型IP协议栈(LWIP)作为网络通信的基础框架。LWIP提供了一组用于处理网络通信的函数和数据结构,可以轻松地实现TCP/IP协议。 接收死机指的是在使用STM32LWIP进行网络通信时,接收数据的过程中程序出现了死机现象。这种问题可能是由以下几个原因引起的: 1. 资源不足:可能是由于缓冲区大小不够,导致接收数据时出现溢出而导致死机。解决方法是增加接收缓冲区的大小或者优化代码,提高接收数据的处理速度。 2. 中断冲突:可能是由于中断优先级设置不当,导致网络接收中断无法正确触发而引发死机。解决方法是根据实际需求重新设置中断优先级,确保网络接收中断的及时触发。 3. 网络连接问题:可能是由于网络连接断断续续,或者网络质量较差导致接收数据时出现异常。可以通过检查网络连接状况,调试网络设置以及使用合适的网络调试工具来解决问题。 4. 代码错误:可能是由于代码逻辑错误,例如接收数据的处理过程中出现了死循环或者无限阻塞的情况。需要对代码进行仔细检查和调试,确保程序逻辑正确。 总之,接收死机问题需要综合考虑硬件和软件等多个方面的因素。通过逐步排查和调试,可以找到问题的根源并采取相应的解决方法,使STM32LWIP能够正常进行网络通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值