解决STM32 FreeRTOS LWIP TCP快速发送和内存泄漏问题

现象1:

发送缓慢,tcp_write之后要等200多ms才能过发送出去,而且粘包严重。

解决办法
tcp_write之后,立马调用tcp_output ,tcp就会立马发送。

tcp_write
tcp_output 

现象2:

持续快速发送和接受TCP数据出现断言

pbufs on queue => at least one queue non-empty
 tcp_receive: valid queue length

而且出现TCP断连,死机情况。

其实就是一句话 主程序和以太网中断程序中对PCB->unsent 之类的处理出现了问题,tcp_write 不是没有临界保护,导致中断和主程序直接出现了共同操作
((pcb)->snd_buf)
((pcb)->snd_queuelen)
的问题,导致内存泄漏,越运行越慢

解决办法:

tcp_write 和 tcp_output,调用前关闭网口中断,调用结束开启中断

	NVIC_DisableIRQ(ETH_IRQn);
    err = tcp_write(tpcb, mqtt_ringbuf_get_ptr(rb), send_len, TCP_WRITE_FLAG_COPY);
    tcp_output(tpcb);
	HAL_NVIC_EnableIRQ(ETH_IRQn);

当使用mqtt  publish的时候,也需要关接收中断,

NVIC_DisableIRQ(ETH_IRQn);
err = mqtt_publish(client, pub_topic, pub_buf, data_len, qos, retain, mqtt_client_pub_request_cb, (void*)client);
HAL_NVIC_EnableIRQ(ETH_IRQn);

如果不关中断,会出现如下现象:

现象1:mqtt出现断连的情况。

现象2:Assertion "tcp_receive: valid queue length" failed at line 1207 in ../Middlewares/Third_Party/LwIP/src/core/tcp_in.c
Assertion "tcp_write: pbufs on queue => at least one queue non-empty" failed at line 343 in ../Middlewares/Third_Party/LwIP/src/core/tcp_out.c
<<info>>..\Src\bsp_mqtt.c@:1396: bsp_mqtt_connection_cb: Fail connected, status = 256

现象3:Assertion "tcp_receive: valid queue length" failed at line 1190 in ../Middlewares/Third_Party/LwIP/src/core/tcp_in.c
Assertion "tcp_write: pbufs on queue => at least one queue non-empty" failed at line 341 in ../Middlewares/Third_Party/LwIP/src/core/tcp_out.c

根本原因还是中断和主程序直接出现了共同操作
((pcb)->snd_buf)
((pcb)->snd_queuelen)

参考文献:

关于LWIP中大数据量传输问题的一些解决方法,速度慢,而且越运行越慢的 。另外一些心得_lwip提高收发速度_bird_bai001的博客-CSDN博客

物联沃分享整理
物联沃-IOTWORD物联网 » 解决STM32 FreeRTOS LWIP TCP快速发送和内存泄漏问题

发表评论