LinY 发表于 2023-12-19 11:39:00

lwip走http上传文件速度优化

STM32F429的
搭配:

16MB的SDRAM
32GB的eMMC颗粒,8位数据总线,同时USB HS挂载

现在有上传文件的需求,文件大小会达到2G
对方要求走http

所以目前是通过裸机lwip 封装成http

目前的lwipopts.h配置见最后面
走tcp测速可以到4MB/s,但是http上传文件才1MB/s甚至有时候还达不到。
代码逻辑:
1.tcp连接
2.连接成功后发送http请求头
3.再发送请求体,请求体中循环

文件都能上传成功的 封装整体是没问题的
用的这样的请求包
POST /server/api/uploadFile HTTP/1.0
Host: 192.168.10.9:8081
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows;U;Windows NT 5.1;en-US;rv:1.7.6) Gecko/20050225 Firefox/1.0.1
checknum:4564
Content-Type: multipart/form-data; boundary=------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: 7654

--------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="files"; filename="//test.txt"
Content-Type: application/octet-stream


xx
------WebKitFormBoundary7MA4YWxkTrZu0gW--


关键在第3步

while(!f_eof(&USERFile)) {

// 循环判断send_buf_size,大于0就读取send_buf_size大小的文件内容并发送
start_time = HAL_GetTick();

while (send_buf_size == 0) {
    MX_LWIP_Process();
    send_buf_size = tcp_client_getsndbufsize();
}
retUSER = f_read(&USERFile, HttpRequestBody, send_buf_size, &fnum);
tcp_write(tcp_pcb, HttpRequestBody, fnum, 1);
}



有什么优化手段么?
之前有人推荐加大MEM_SIZE,TCP_SND_BUF。但是我这边还有其他LCD以及业务等等占用不少RAM
所以本身芯片RAM已经不多了。
我在想有没有办法让lwip的内存分配用SDRAM的 这样16MB的SDRAM临时都给lwip用都行,这种方案可行么?可行的话要怎么配置让LWIP用SDRAM?
这里还有哪里可以优化的或者有其他可行的推荐方案。



/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name          : Target/lwipopts.h
* Description      : This file overrides LwIP stack default configuration
*                      done in opt.h file.
******************************************************************************
* @attention
*
* Copyright (c) 2023 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */

/* Define to prevent recursive inclusion --------------------------------------*/
#ifndef __LWIPOPTS__H__
#define __LWIPOPTS__H__

#include "main.h"

/*-----------------------------------------------------------------------------*/
/* Current version of LwIP supported by CubeMx: 2.1.2 -*/
/*-----------------------------------------------------------------------------*/

/* Within 'USER CODE' section, code will be kept by default at each generation */
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */

#ifdef __cplusplus
extern "C" {
#endif

/* STM32CubeMX Specific Parameters (not defined in opt.h) ---------------------*/
/* Parameters set in STM32CubeMX LwIP Configuration GUI -*/
/*----- WITH_RTOS disabled (Since FREERTOS is not set) -----*/
#define WITH_RTOS 0
/*----- CHECKSUM_BY_HARDWARE enabled -----*/
#define CHECKSUM_BY_HARDWARE 1
/*-----------------------------------------------------------------------------*/

/* LwIP Stack Parameters (modified compared to initialization value in opt.h) -*/
/* Parameters set in STM32CubeMX LwIP Configuration GUI -*/
/*----- Default Value for LWIP_UDP: 1 ---*/
#define LWIP_UDP 0
/*----- Default Value for MEMP_NUM_UDP_PCB: 4 ---*/
#define MEMP_NUM_UDP_PCB 6
/*----- Default Value for MEMP_NUM_TCP_PCB: 5 ---*/
#define MEMP_NUM_TCP_PCB 10
/*----- Value in opt.h for NO_SYS: 0 -----*/
#define NO_SYS 1
/*----- Value in opt.h for SYS_LIGHTWEIGHT_PROT: 1 -----*/
#define SYS_LIGHTWEIGHT_PROT 0
/*----- Value in opt.h for MEM_ALIGNMENT: 1 -----*/
#define MEM_ALIGNMENT 4
/*----- Default Value for MEM_SIZE: 1600 ---*/
#define MEM_SIZE 30720
/*----- Default Value for MEMP_NUM_PBUF: 16 ---*/
#define MEMP_NUM_PBUF 50
/*----- Default Value for MEMP_NUM_RAW_PCB: 4 ---*/
#define MEMP_NUM_RAW_PCB 6
/*----- Default Value for MEMP_NUM_TCP_PCB_LISTEN: 8 ---*/
#define MEMP_NUM_TCP_PCB_LISTEN 6
/*----- Default Value for MEMP_NUM_TCP_SEG: 16 ---*/
#define MEMP_NUM_TCP_SEG 80
/*----- Default Value for PBUF_POOL_SIZE: 16 ---*/
#define PBUF_POOL_SIZE 12
/*----- Default Value for PBUF_POOL_BUFSIZE: 592 ---*/
#define PBUF_POOL_BUFSIZE 500
/*----- Value in opt.h for LWIP_ETHERNET: LWIP_ARP || PPPOE_SUPPORT -*/
#define LWIP_ETHERNET 1
/*----- Value in opt.h for LWIP_DNS_SECURE: (LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT) -*/
#define LWIP_DNS_SECURE 7
/*----- Default Value for TCP_WND: 5840 ---*/
#define TCP_WND 2144
/*----- Default Value for TCP_QUEUE_OOSEQ: 1 ---*/
#define TCP_QUEUE_OOSEQ 0
/*----- Default Value for TCP_MSS: 536 ---*/
#define TCP_MSS 1024
/*----- Default Value for TCP_SND_BUF: 2920 ---*/
#define TCP_SND_BUF 20480
/*----- Default Value for TCP_SND_QUEUELEN: 41 ---*/
#define TCP_SND_QUEUELEN 80
/*----- Value in opt.h for TCP_WND_UPDATE_THRESHOLD: LWIP_MIN(TCP_WND/4, TCP_MSS*4) -----*/
#define TCP_WND_UPDATE_THRESHOLD 536
/*----- Value in opt.h for LWIP_NETIF_LINK_CALLBACK: 0 -----*/
#define LWIP_NETIF_LINK_CALLBACK 1
/*----- Value in opt.h for LWIP_NETCONN: 1 -----*/
#define LWIP_NETCONN 0
/*----- Value in opt.h for LWIP_SOCKET: 1 -----*/
#define LWIP_SOCKET 0
/*----- Value in opt.h for RECV_BUFSIZE_DEFAULT: INT_MAX -----*/
#define RECV_BUFSIZE_DEFAULT 2000000000
/*----- Value in opt.h for LWIP_STATS: 1 -----*/
#define LWIP_STATS 0
/*----- Value in opt.h for CHECKSUM_GEN_IP: 1 -----*/
#define CHECKSUM_GEN_IP 0
/*----- Value in opt.h for CHECKSUM_GEN_UDP: 1 -----*/
#define CHECKSUM_GEN_UDP 0
/*----- Value in opt.h for CHECKSUM_GEN_TCP: 1 -----*/
#define CHECKSUM_GEN_TCP 0
/*----- Value in opt.h for CHECKSUM_GEN_ICMP: 1 -----*/
#define CHECKSUM_GEN_ICMP 0
/*----- Value in opt.h for CHECKSUM_GEN_ICMP6: 1 -----*/
#define CHECKSUM_GEN_ICMP6 0
/*----- Value in opt.h for CHECKSUM_CHECK_IP: 1 -----*/
#define CHECKSUM_CHECK_IP 0
/*----- Value in opt.h for CHECKSUM_CHECK_UDP: 1 -----*/
#define CHECKSUM_CHECK_UDP 0
/*----- Value in opt.h for CHECKSUM_CHECK_TCP: 1 -----*/
#define CHECKSUM_CHECK_TCP 0
/*----- Value in opt.h for CHECKSUM_CHECK_ICMP: 1 -----*/
#define CHECKSUM_CHECK_ICMP 0
/*----- Value in opt.h for CHECKSUM_CHECK_ICMP6: 1 -----*/
#define CHECKSUM_CHECK_ICMP6 0
/*-----------------------------------------------------------------------------*/
/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

#ifdef __cplusplus
}
#endif
#endif /*__LWIPOPTS__H__ */





eric2013 发表于 2023-12-19 11:56:27

可以使用FTP或者TFTP试试。

LinY 发表于 2023-12-19 13:02:50

eric2013 发表于 2023-12-19 11:56
可以使用FTP或者TFTP试试。

关键对方没有

LinY 发表于 2023-12-19 13:34:45

本帖最后由 LinY 于 2023-12-19 16:39 编辑

给mem.c和memp.c配置 可以成功。 我准备调大mem_size等参数试下



LinY 发表于 2023-12-20 16:23:54

用了SDRAM 上传文件不对 文件内容乱了

Fitz 发表于 2023-12-22 11:41:14

IRAM2的CCM RAM也可以用起来,有64K 可以分给LWIP用
页: [1]
查看完整版本: lwip走http上传文件速度优化