【STM32】关于LWIP高频率快速发送大量数据(1MB以上)卡死问题解决 + 提高LWIP发送速率的办法

这篇具有很好参考价值的文章主要介绍了【STM32】关于LWIP高频率快速发送大量数据(1MB以上)卡死问题解决 + 提高LWIP发送速率的办法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

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问题。

结语

目前对LWIP也是用的比较少,后续对他的具体实现和特性还要继续深入研究,目前仅记录解决方法。对了,由于是项目代码所以还是不方便贴出。文章来源地址https://www.toymoban.com/news/detail-758331.html

到了这里,关于【STM32】关于LWIP高频率快速发送大量数据(1MB以上)卡死问题解决 + 提高LWIP发送速率的办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于LWIP用法之HTTPD:基于STM32F4搭建web服务器

    一,STM32CUBEMX配置(使用的是6.4.0版本) 前提是在配置好LWIP的情况下(能ping通你的开发板),使能HTTPD功能。 然后是使能LWIP_HTTPD_CGI, 使能:LWIP_HTTPD_SUPPORT_POST(), 使能 :HTTPD_USE_CUSTOM_FSDATA。 会发现fs.c这个文件的#include HTTPD_FSDATA_FILE,这一句编译报错,解决办法:1) 在KEIL中lwipop

    2023年04月08日
    浏览(15)
  • STM32407 FreeRtos系统下lwip实现发送和接收数据包进行链路测试

    下面是一个基于STM32F407 FreeRTOS系统下lwIP实现发送和接收数据包进行链路测试的案例。 硬件配置和软件环境搭建 首先,需要准备好STM32F407开发板、以太网网线和一台电脑,然后在电脑上安装好STM32CubeMX工具和Keil MDK软件,创建一个新的工程,并按照以下步骤进行配置: 1)选择

    2024年02月12日
    浏览(14)
  • 关于STM32F4和GD32F4以太网,LAN8720+lwip+freemodbus,实现modbus tcp

    关于STM32F4和GD32F4以太网,LAN8720+lwip+freemodbus 这里使用了大佬 小灰灰搞电子 的代码,文章看 STM32F407+LAN8720移植Lwip和freeModbus实现MODBUS TCP 代码看 STM32F407+LAN8720+LWIP移植freemodbus TCP.zip 他的代码是基于正点原子F407的板子开发的,如果是别的板子,需要修改引脚 小灰灰的代码里,没

    2024年02月14日
    浏览(16)
  • 关于STM32F103输入捕获高精度采集频率信号的方法

    前段时间需要做一款频率采集设备,由于成本考虑,使用了APM32F103作为主控,APM32F103和STM32F103基本完全通用,有极个别BUG。不影响本次试验。客户要求的频率信号为11KHz到23KHz,精度要求在任何频率范围误差不能大于当前频率的万分之一以上(排除温度影响),采集速度要10

    2024年02月15日
    浏览(16)
  • 基于STM32F407实现快速傅里叶变化(FFT),计算指定频率的幅值

    前言: 本人的课题是关于EIT采集系统设计,所谓的EIT,简单的说就是往人体注入特定频率的电流信号,通过采集反馈的电压信号,进而使用成像算法重构人体内部的阻抗分布。由于采集到的电压包含其它频率的热噪声,为了只保留注入频率的信号成分,需要对采集到的电压信

    2024年02月12日
    浏览(16)
  • STM-32:USART串口协议、串口外设—数据发送/数据发送+接收

    通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统。比如STM32芯片里面集成了很多功能模块,如定时器计数、PWM输出、AD采集等等,这些都是芯片内部的电路,它们的配置寄存器、数据寄存器都在芯片里面,操作简单,直接读写就行。但是有些功能STM32内部没有

    2024年02月04日
    浏览(26)
  • STM32 CubeMX LwIP + freertOS 移植

    开发板: 官方 STM32F746  MCU型号:STM32F746NGH 网卡型号:LAN8742A  原理图如下 先用裸机测试LAN8742A的网卡驱动 使用CubeMX创建工程 系统时钟和时基定时器如下 无系统LWIP协议栈设置,静态IP地址,关闭DHCP 生产代码,下载进开发板。开发板网口与电脑网口通过网线直连,设置电脑本

    2024年01月16日
    浏览(61)
  • STM32以太网通信-LWIP简介

    LwIP全名:Light weight IP,意思是轻量化的TCP/IP协议,是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。 LwIP的设计初衷是:用少量的资源消耗实现一个较为完整的TCP/IP协议栈,其中“完整”主要指的是TCP协议的完整性,实现的重点是在保持TCP协议主要功能

    2024年02月07日
    浏览(23)
  • STM32H743+LWIP+LAN8720+STM32cubeMX6.8.0

    最详细 一步到位 带程序 无偿分享   经历一个星期的痛苦,程序终于调试ping通了 网上的H743的博客我一个一个试一个一个试,到最后没有一个正常ping通,写本篇博客的目的就是为了后续再进行调试的人不在踩坑,听懂掌声,哈哈哈。 废话就不多说了,正文开始: 1、打开S

    2024年02月07日
    浏览(22)
  • STM32 —— DMA 发送与接收数据详解

    DMA(Direct Memory Access) :直接存储器存取,是单片机的一个外设,它的主要功能是用来搬数据,但是不需要占用 CPU ,即在传输数据的时候,CPU 可以干其他的事情,好像是多线程一样。数据传输支持从外设到存储器或者存储器到存储器,这里的存储器可以是 SRAM 或者是 FLASH DMA传

    2024年02月13日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包