一、前言
我需要用STM32作为TCP Server,周期性地通过网口向上位机发送数据(10个字节),时间周期需低于200us。
二、遇到问题
我在STM32上用LWIP库实现TCP Server,但是发现发送数据时间间隔不能低于800us,否则LWIP会报内存错误,报错如下:
Assertion "mem_free: illegal memory" failed at line 639 in ../Middlewares/Third_Party/LwIP/src/core/mem.c
Assertion "pbuf_free: p->ref > 0" failed at line 753 in ../Middlewares/Third_Party/LwIP/src/core/pbuf.c
Assertion "pbbuf ref overflow" failed at line 834 in ../Middlewares/Third_Party/LwIP/src/core/pbuf.c
三、解决方法
参考某位博主的方法(https://blog.csdn.net/weixin_41719055/article/details/102740216),在数据发送函数tcp_write()前,加入tcp_nagle_disable()这个函数即可解决问题,如下图代码:
这样便可解决发送数据时间间隔过短导致LWIP DEBUG报错问题,经我测试,加入tcp_nagle_disable()函数后,周期性发送10个字节,发送数据时间间隔最短可为20us。如下图代码,以20us时间间隔发送一万次10字节数据,测试成功,不再出现报内存错误的情况:
四、代码
代码我无法分享,实现比较简单,用STM32CubeMX生成LWIP库(切记不要用STM32CubeMX 6.5这个版本,这个版本有问题),然后参考正点原子的网口例程,用TCP Server那个,然后就差不多可以实现了。