硬汉嵌入式论坛

 找回密码
 立即注册
查看: 920|回复: 5
收起左侧

lwip走http上传文件速度优化

[复制链接]

29

主题

178

回帖

265

积分

高级会员

积分
265
发表于 2023-12-19 11:39:00 | 显示全部楼层 |阅读模式
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步
[C] 纯文本查看 复制代码
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?
这里还有哪里可以优化的或者有其他可行的推荐方案。


[C] 纯文本查看 复制代码
/* 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__ */





回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111540
QQ
发表于 2023-12-19 11:56:27 | 显示全部楼层
可以使用FTP或者TFTP试试。
回复

使用道具 举报

29

主题

178

回帖

265

积分

高级会员

积分
265
 楼主| 发表于 2023-12-19 13:02:50 | 显示全部楼层
eric2013 发表于 2023-12-19 11:56
可以使用FTP或者TFTP试试。

关键对方没有
回复

使用道具 举报

29

主题

178

回帖

265

积分

高级会员

积分
265
 楼主| 发表于 2023-12-19 13:34:45 | 显示全部楼层
本帖最后由 LinY 于 2023-12-19 16:39 编辑

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

2.png

1.png
回复

使用道具 举报

29

主题

178

回帖

265

积分

高级会员

积分
265
 楼主| 发表于 2023-12-20 16:23:54 | 显示全部楼层
用了SDRAM 上传文件不对 文件内容乱了
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2023-12-22 11:41:14 | 显示全部楼层
IRAM2的CCM RAM也可以用起来,有64K 可以分给LWIP用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-11-1 07:21 , Processed in 0.287679 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表