OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5539|回复: 7

无操作系统stm32+lwip+tcp发送数据提速,求思路

[复制链接]

4

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2020-8-25
在线时间
25 小时
发表于 2020-11-1 22:23:10 | 显示全部楼层 |阅读模式
无操作系统stm32+lwip+tcp发送数据目前通过修改lwipopts.h配置文件,并通过直接在stm32上开辟一个原始数据缓冲区,一直发送这个缓冲区里的数据,使用网络助手接收数据,通过这样的方式测得速度是300KB/s,而项目至少需要做到4、5MB/s去。请问有人有测无操作系统网速的方法没  和  有什么提升发送数据的速度方法没,求助了


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

2257

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4424
金钱
4424
注册时间
2013-4-22
在线时间
331 小时
发表于 2020-11-2 11:02:09 | 显示全部楼层
首先速率和有无操作系统没有太大的关系,这个取决于你处理数据收发数据的效率问题,提高主要还是提高CPU时钟,使用DMA的方式等等;软件上估计也就那样了,即使再优化也不会有质的提升。
回复 支持 1 反对 0

使用道具 举报

4

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2020-8-25
在线时间
25 小时
 楼主| 发表于 2020-11-2 16:55:02 | 显示全部楼层
我也觉得和有无操作系统无关,我查了一下网上基本都是上操作系统做的,他们可以做到4、5M/s去,原子哥的代码能上4、5M的也是带操作系统的,可是项目不能上操作系统
回复 支持 反对

使用道具 举报

25

主题

686

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1342
金钱
1342
注册时间
2012-4-25
在线时间
193 小时
发表于 2020-11-3 08:14:25 | 显示全部楼层
simple551 发表于 2020-11-2 16:55
我也觉得和有无操作系统无关,我查了一下网上基本都是上操作系统做的,他们可以做到4、5M/s去,原子哥的代 ...

理论上无OS 比有操作系统的发送更快,你这么慢,肯定哪不对,要么设置不对,要么,,
1-1
回复 支持 反对

使用道具 举报

4

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2020-8-25
在线时间
25 小时
 楼主| 发表于 2020-11-3 09:17:27 | 显示全部楼层
下面是我的设置,我试过网友的设置,提升效果不明显。代码用的原子哥407的RAW_tcp_client代码,研究了一下,感觉没有什么优化的地方,稳定性也还可以。发送数据方式采用poll轮询的方式发送,轮询时间我修改成了10ms;试过原子哥不采用poll轮询方式发送,使用tcp_client_usersent直接调用发送,结果还是一样,稳定性还没以前好

#ifndef __LWIPOPTS_H__
#define __LWIPOPTS_H__

#define SYS_LIGHTWEIGHT_PROT    0

//NO_SYS==1:不使用操作系统
#define NO_SYS                  1  //不使用UCOS操作系统

//使用4字节对齐模式
#define MEM_ALIGNMENT           4  

//MEM_SIZE:heap内存的大小,如果在应用中有大量数据发送的话这个值最好设置大一点
#define MEM_SIZE                (16*1024)  //16000 //内存堆大小

//MEMP_NUM_PBUF:memp结构的pbuf数量,如果应用从ROM或者静态存储区发送大量数据时,这个值应该设置大一点
#define MEMP_NUM_PBUF           20  //10  //修改成20

//MEMP_NUM_UDP_PCB:UDP协议控制块(PCB)数量.每个活动的UDP"连接"需要一个PCB.
#define MEMP_NUM_UDP_PCB        6

//MEMP_NUM_TCP_PCB:同时建立激活的TCP数量
#define MEMP_NUM_TCP_PCB        10

//MEMP_NUM_TCP_PCB_LISTEN:能够监听的TCP连接数量
#define MEMP_NUM_TCP_PCB_LISTEN 6

//MEMP_NUM_TCP_SEG:最多同时在队列中的TCP段数量
#define MEMP_NUM_TCP_SEG        250//45

//MEMP_NUM_SYS_TIMEOUT:能够同时激活的timeout个数
#define MEMP_NUM_SYS_TIMEOUT    8


/* ---------- Pbuf选项---------- */
//PBUF_POOL_SIZE:pbuf内存池个数.
#define PBUF_POOL_SIZE          20  //20

//PBUF_POOL_BUFSIZE:每个pbuf内存池大小.
#define PBUF_POOL_BUFSIZE       1460


/* ---------- TCP选项---------- */
#define LWIP_TCP                1  //为1是使用TCP
#define TCP_TTL                 255//生存时间

/*当TCP的数据段超出队列时的控制位,当设备的内存过小的时候此项应为0*/
#define TCP_QUEUE_OOSEQ         0

//最大TCP分段
#define TCP_MSS                 (1500 - 40)          //TCP_MSS = (MTU - IP报头大小 - TCP报头大小

//TCP发送缓冲区大小(bytes).
#define TCP_SND_BUF             (15*TCP_MSS) //4

//TCP_SND_QUEUELEN: TCP发送缓冲区大小(pbuf).这个值最小为(2 * TCP_SND_BUF/TCP_MSS)
#define TCP_SND_QUEUELEN        (15* TCP_SND_BUF/TCP_MSS)  //6

//TCP发送窗口
#define TCP_WND                 (11*TCP_MSS)   //11


/* ---------- ICMP选项---------- */
#define LWIP_ICMP                 1 //使用ICMP协议

/* ---------- DHCP选项---------- */
//当使用DHCP时此位应该为1,LwIP 0.5.1版本中没有DHCP服务.
#define LWIP_DHCP               0  // 1

/* ---------- UDP选项 ---------- */
#define LWIP_UDP                1 //使用UDP服务
#define UDP_TTL                 255 //UDP数据包生存时间


/* ---------- Statistics options ---------- */
#define LWIP_STATS 0
#define LWIP_PROVIDE_ERRNO 1


//STM32F4x7允许通过硬件识别和计算IP,UDP和ICMP的帧校验和
#define CHECKSUM_BY_HARDWARE //定义CHECKSUM_BY_HARDWARE,使用硬件帧校验


#ifdef CHECKSUM_BY_HARDWARE
  //CHECKSUM_GEN_IP==0: 硬件生成IP数据包的帧校验和
  #define CHECKSUM_GEN_IP                 0
  //CHECKSUM_GEN_UDP==0: 硬件生成UDP数据包的帧校验和
  #define CHECKSUM_GEN_UDP                0
  //CHECKSUM_GEN_TCP==0: 硬件生成TCP数据包的帧校验和
  #define CHECKSUM_GEN_TCP                0
  //CHECKSUM_CHECK_IP==0: 硬件检查输入的IP数据包帧校验和
  #define CHECKSUM_CHECK_IP               0
  //CHECKSUM_CHECK_UDP==0: 硬件检查输入的UDP数据包帧校验和
  #define CHECKSUM_CHECK_UDP              0
  //CHECKSUM_CHECK_TCP==0: 硬件检查输入的TCP数据包帧校验和
  #define CHECKSUM_CHECK_TCP              0
#else
  //CHECKSUM_GEN_IP==1: 软件生成IP数据包帧校验和
  #define CHECKSUM_GEN_IP                 1
  // CHECKSUM_GEN_UDP==1: 软件生成UDOP数据包帧校验和
  #define CHECKSUM_GEN_UDP                1
  //CHECKSUM_GEN_TCP==1: 软件生成TCP数据包帧校验和
  #define CHECKSUM_GEN_TCP                1
  // CHECKSUM_CHECK_IP==1: 软件检查输入的IP数据包帧校验和
  #define CHECKSUM_CHECK_IP               1
  // CHECKSUM_CHECK_UDP==1: 软件检查输入的UDP数据包帧校验和
  #define CHECKSUM_CHECK_UDP              1
  //CHECKSUM_CHECK_TCP==1: 软件检查输入的TCP数据包帧校验和
  #define CHECKSUM_CHECK_TCP              1
#endif


/*
   ----------------------------------------------
   ---------- SequentialAPI选项----------
   ----------------------------------------------
*/

//LWIP_NETCONN==1:使能NETCON函数(要求使用api_lib.c)
#define LWIP_NETCONN                    0

/*
   ------------------------------------
   ---------- Socket API选项----------
   ------------------------------------
*/
//LWIP_SOCKET==1:使能Socket API(要求使用sockets.c)
#define LWIP_SOCKET                     0

#define LWIP_COMPAT_MUTEX               1

#define LWIP_SO_RCVTIMEO                1 //通过定义LWIP_SO_RCVTIMEO使能netconn结构体中recv_timeout,使用recv_timeout可以避免阻塞线程


/*
   ----------------------------------------
   ---------- Lwip调试选项----------
   ----------------------------------------
*/
//#define LWIP_DEBUG                     1 //开启DEBUG选项 //

#define ICMP_DEBUG                      LWIP_DBG_OFF //开启/关闭ICMPdebug

#endif /* __LWIPOPTS_H__ */

回复 支持 反对

使用道具 举报

7

主题

236

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2019-5-6
在线时间
124 小时
发表于 2020-12-4 14:05:46 | 显示全部楼层
simple551 发表于 2020-11-3 09:17
下面是我的设置,我试过网友的设置,提升效果不明显。代码用的原子哥407的RAW_tcp_client代码,研究了一下 ...

解决了兄弟??留个QQ:771683737
一步一个脚印
回复 支持 反对

使用道具 举报

7

主题

236

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2019-5-6
在线时间
124 小时
发表于 2020-12-4 14:15:01 | 显示全部楼层
mygod 发表于 2020-11-3 08:14
理论上无OS 比有操作系统的发送更快,你这么慢,肯定哪不对,要么设置不对,要么,,

大神,您搞过裸机LWIP么?留个Q:771683737,请教下啊
一步一个脚印
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2023-7-13
在线时间
17 小时
发表于 2024-1-15 16:33:24 | 显示全部楼层
楼主我也是裸机编程,问题是不断发送的话最多只能发送小于等于发送缓冲区大小的数据,然后就停了,试过增大缓冲区大小什么的但是没从根本上解决,请问这个问题是什么原因呀?万分感谢
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-14 05:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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