背景
STM32型号:STM32F47VGTx
初始LWIP版本:1.4.1
PHY: ksz8051
最近遇到了个问题,从sd卡读数据存储到一个1024大小的数组,每次读200个字节,while循环读取,每次读取完成后立即通过lwip的conn_write接口通过tcp方式发送出去。但是会出现发送速率只有9kb/s的情况,而且高频率快速发送大量数据(1MB以上)很容易死机,通过串口读取conn_write的err返回值是-6,即ERR_VAL数据无效。
解决LWIP发送频率和速度过快卡死的问题
一开始参照网上,对各类参数和配置进行不断地尝试,试了一个星期都一无所获。后来发现有写文章说LWIP老版本,如1.4.1版本,在对高频率快速发送大量数据的支持不太好,有BUG,就这一怀疑,尝试将1.4.1版本升级到目前比较常用教程的主流版本 LWIP 2.1.2。关于如何从LWIP 1.4.1升级到LWIP 2.1.2可以参考这位大神的文章:
LWIP v1.4.1和v2.1.2的对比以及升级过程
移植升级完成后,把自己LWIP1.4.1的配置文件(如lwipopts.h)一同替换过去,然后就是结合自己实际情况解决编译报错。完成以上,再次编译烧录到板子,可以看到不再出现conn_write的err返回值是-6,即ERR_VAL数据无效的问题。但具体LWIP 2.1.2相比 1.4.1在哪个地方解决这个bug还没时间去深究,后续有时间可以去研究下。
解决LWIP发送时传输速度只有9kb/s的问题
首先,通过增大sd卡单次读取的数据量(在我这将每次读取200字节提高,多次验证发现4096个字节比较稳定快速,具体能增加多少字节要视自己的调试环境而定),可以发现速率能达到100多kb/s,但是相比来说还是比较慢。其次,通过查阅文章:
1. STM32F407+lwip传输速度该怎么提升?
2. LWIP学习笔记8——提高 LwIP 网络传输的速度
可以得知很多提升LWIP传输速度的办法,但最终经过本人实测,发现最好不要修改TCP_WND的值,只修改TCP_SND_BUF和TCP_SND_QUEUELEN,以及MEMP_NUM_TCP_SEG就可以了,注意TCP_SND_QUEUELEN的值不能大于MEMP_NUM_TCP_SEG!其它参数修改了好像没啥提升,看了其他文章说STM32不同型号资源不同也会对传输速率有限制,估计目前我的速率(1MB大概耗时1.5s,折合666.66kb/s,哈哈666)估计到顶了,不过也够用了。
LWIP的lwipopts.h的部分配置:
#define SYS_LIGHTWEIGHT_PROT 1 //为1时使用实时操作系统的轻量级保护,保护关键代码不被中断打断
#define NO_SYS 0 //使用UCOS操作系统
#define MEM_ALIGNMENT 4 //使用4字节对齐模式
#define MEM_SIZE 16*1024 //内存堆heap大小
#define MEMP_NUM_PBUF 50 //MEMP_NUM_PBUF:memp结构的pbuf数量,如果应用从ROM或者静态存储区发送大量数据时,这个值应该设置大一点
#define MEMP_NUM_UDP_PCB 6 //MEMP_NUM_UDP_PCB:UDP协议控制块(PCB)数量.每个活动的UDP"连接"需要一个PCB.
#define MEMP_NUM_TCP_PCB 10 //MEMP_NUM_TCP_PCB:同时建立激活的TCP数量
#define MEMP_NUM_TCP_PCB_LISTEN 6 //MEMP_NUM_TCP_PCB_LISTEN:能够监听的TCP连接数量
#define MEMP_NUM_TCP_SEG 400 //MEMP_NUM_TCP_SEG:最多同时在队列中的TCP段数量
#define MEMP_NUM_SYS_TIMEOUT 8 //MEMP_NUM_SYS_TIMEOUT:能够同时激活的timeout个数
//pbuf选项
#define PBUF_POOL_SIZE 20 //PBUF_POOL_SIZE:pbuf内存池个数
#define PBUF_POOL_BUFSIZE 512 //PBUF_POOL_BUFSIZE:每个pbuf内存池大小
#define LWIP_TCP 1 //使用TCP
#define TCP_TTL 255 //生存时间
#undef TCP_QUEUE_OOSEQ
#define TCP_QUEUE_OOSEQ
先说明,在一开始使用LWIP 1.4.1版本时候,除了对sd卡的单次读取数据量修改对速度有提升,其他对LWIP的配置都没有效果,但换了2.1.2后对lwipopts.h配置后有效果。当然了,对sd卡配置也是属于sd卡层次,不属于lwip问题。文章来源:https://www.toymoban.com/news/detail-758331.html
结语
目前对LWIP也是用的比较少,后续对他的具体实现和特性还要继续深入研究,目前仅记录解决方法。对了,由于是项目代码所以还是不方便贴出。文章来源地址https://www.toymoban.com/news/detail-758331.html
到了这里,关于【STM32】关于LWIP高频率快速发送大量数据(1MB以上)卡死问题解决 + 提高LWIP发送速率的办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!