OpenEdv-开源电子网

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

STM32F4+UCOSIII+LWIP网速提速问题

[复制链接]

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-8-16
在线时间
16 小时
发表于 2016-4-15 10:46:18 | 显示全部楼层 |阅读模式
1金钱
各位大神,最近在调试STM32F4+UCOSIII+LWIP网口功能,但是速度一直上不去,实在没有好的办法了!
之前参考了论坛中http://www.openedv.com/thread-43116-1-1.html 这篇文档,如下图

图一

图一


@zuozhongkai

我把我自己的测试结果发上来!
2016-04-15_104458.png

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

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-8-16
在线时间
16 小时
 楼主| 发表于 2016-4-15 10:47:32 | 显示全部楼层
期望各位”码友“能给点参考意见!  
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-4-15 23:10:23 | 显示全部楼层
我们实测TCP传输,速度可以到5MB/S。
回复

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-8-16
在线时间
16 小时
 楼主| 发表于 2016-4-28 11:24:45 | 显示全部楼层
正点原子 发表于 2016-4-15 23:10
我们实测TCP传输,速度可以到5MB/S。

嘻嘻,终于调试出了结果!  我用TCP传输也能达到5MB/s作用  
但是UDP协议只能达到2.5MB/s 左右,这是为什么呢?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-5-1 12:03:04 | 显示全部楼层
zky26 发表于 2016-4-28 11:24
嘻嘻,终于调试出了结果!  我用TCP传输也能达到5MB/s作用  
但是UDP协议只能达到2.5MB/s 左右,这是为 ...

不知道
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

11

主题

80

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4493
金钱
4493
注册时间
2016-8-2
在线时间
51 小时
发表于 2016-9-29 11:23:23 | 显示全部楼层
zky26 发表于 2016-4-28 11:24
嘻嘻,终于调试出了结果!  我用TCP传输也能达到5MB/s作用  
但是UDP协议只能达到2.5MB/s 左右,这是为 ...

楼主网速是怎提高的 给点参考意见
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-9-29 14:12:20 | 显示全部楼层
我用ping测试的,1518字节速率7.6M左右,64字节5M多。不知道你们弄这么慢。
我还是跑F103。
你的系统是不是其他任务抢占了网络task的时间啊?
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2016-6-30
在线时间
71 小时
发表于 2016-10-6 16:56:15 | 显示全部楼层
我基于UCOSIII移植的LWIP总是会在连接一段时间(差不多2个小时)后出现自动断线的情况,这是什么原因呢?
回复

使用道具 举报

0

主题

18

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2013-4-1
在线时间
105 小时
发表于 2016-10-7 18:01:05 | 显示全部楼层
菜鸟。。。 发表于 2016-10-6 16:56
我基于UCOSIII移植的LWIP总是会在连接一段时间(差不多2个小时)后出现自动断线的情况,这是什么原因呢?

TCP长连接,短连接的基本知识啊,你看看就知道了,只要设置一下就可以了。
回复

使用道具 举报

9

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2013-4-26
在线时间
19 小时
发表于 2016-10-8 09:17:35 | 显示全部楼层
LZ,您好,您用的RMII还是MII模式了??我也正在使用DP83848,使用MII模式,好像MII与RMII只是引脚配置,还有外部晶振不一样????
回复

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2016-6-30
在线时间
71 小时
发表于 2016-10-8 14:56:46 | 显示全部楼层
我现在菜鸟一枚,不知道在哪里设置,可以指点一二么,万分感谢
回复

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2013-3-8
在线时间
15 小时
发表于 2016-10-11 10:03:40 | 显示全部楼层
楼主为什么不贴出解决方法?不厚道。
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
发表于 2016-11-14 21:54:26 | 显示全部楼层
zky26 发表于 2016-4-28 11:24
嘻嘻,终于调试出了结果!  我用TCP传输也能达到5MB/s作用  
但是UDP协议只能达到2.5MB/s 左右,这是为 ...

大哥  讲一下怎么调试的呗  跪求啊
回复

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-8-16
在线时间
16 小时
 楼主| 发表于 2016-11-18 18:02:10 | 显示全部楼层
追求卓越2013 发表于 2016-10-8 09:17
LZ,您好,您用的RMII还是MII模式了??我也正在使用DP83848,使用MII模式,好像MII与RMII只是引脚配置,还 ...

我用的是RMII。
不过RMII和MII配置基本上没什么区别。我两个调过,我将代码贴出来供你参考![mw_shl_code=c,true]/**
  * @brief  Configures the different GPIO ports.
  * @param  None
  * @retval None
  * @author Zhangkeyan
  */
static void ETH_GPIO_Config_RMII(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        /* 网卡接口采用RMII
                PA1/ETH_RMII_RX_CLK
                PA2/ETH_MDIO
                PA7/RMII_CRS_DV
                PC1/ETH_MDC
                PC4/ETH_RMII_RX_D0
                PC5/ETH_RMII_RX_D1
                PG11/ETH_RMII_TX_EN
                PB12/ETH_RMII_TXD0
                PB13/ETH_RMII_TXD1

                //PH6/MII_INT
        */
       
        /* Enable GPIOs clocks */
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOG |
                             RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOH, ENABLE);

        /* Enable SYSCFG clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

        SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);

        /* Configure PA1, PA2 and PA7 */
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);

        /* Configure PC1, PC4 and PC5 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);

        /* Configure PG11 **/
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11;
        GPIO_Init(GPIOG, &GPIO_InitStructure);
        GPIO_PinAFConfig(GPIOG, GPIO_PinSource12, GPIO_AF_ETH);
        /* Configure PB12 and PG13  */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_ETH);       
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH);       

    //ETHERNET_NVICConfiguration();//以太网中断分组配置

}

/**
  * @brief  Configures the different GPIO ports.
  * @param  None
  * @retval None
  * @author Zhangkeyan
  */
static void ETH_GPIO_Config_MII(void)       
{
    GPIO_InitTypeDef GPIO_InitStructure;
   
    /* Enable GPIOs clocks */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB |
                         RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE |
                         RCC_AHB1Periph_GPIOG , ENABLE);

    /* Enable SYSCFG clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

/* MII/RMII Media interface selection --------------------------------------*/
#ifdef MII_MODE /* Mode MII with STM324xx-EVAL  */  
    SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_MII);
#endif

    /* Configure PA0,PA1,PA2,PA3,PA7 */
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3|GPIO_Pin_7;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_ETH);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_ETH);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);

    /* Configure PB0,PB1,PB10,PB12,PB13 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_10| GPIO_Pin_12| GPIO_Pin_13;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_ETH);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_ETH);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_ETH);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_ETH);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH);

    /* Configure PC1, PC2, PC3, PC4 , PC5 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource2, GPIO_AF_ETH);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_ETH);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);

    /* Configure PE2 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource2, GPIO_AF_ETH);

    /* Configure PG11 */
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11;
    GPIO_Init(GPIOG, &GPIO_InitStructure);
    GPIO_PinAFConfig(GPIOG, GPIO_PinSource11, GPIO_AF_ETH);
   
    //ETHERNET_NVICConfiguration();//以太网中断分组配置

}[/mw_shl_code]
回复

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-8-16
在线时间
16 小时
 楼主| 发表于 2016-11-18 18:02:54 | 显示全部楼层
shaozp 发表于 2016-9-29 11:23
楼主网速是怎提高的 给点参考意见

改用中断方式!
回复

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-8-16
在线时间
16 小时
 楼主| 发表于 2016-11-18 18:04:07 | 显示全部楼层
刺客mfl 发表于 2016-11-14 21:54
大哥  讲一下怎么调试的呗  跪求啊

你的调试问题在哪?  稍微阐述具体点,我好帮你回答!
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
发表于 2016-11-21 10:48:58 | 显示全部楼层
主要问题有两个:
1,当STM32F407接收到上位机发送的命令后就一直E:\STM32\网络一直不间断的往电脑发数据的时候,速度时快时慢。。。。
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
发表于 2016-11-21 10:50:02 | 显示全部楼层
刺客mfl 发表于 2016-11-21 10:48
主要问题有两个:
1,当STM32F407接收到上位机发送的命令后就一直一直不间断的往电脑发数据的时候,速度时快 ...

截图如下:
111.PNG
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
发表于 2016-11-21 10:51:08 | 显示全部楼层
本帖最后由 刺客mfl 于 2016-11-21 11:15 编辑

第一个问题用到的代码如下:[mw_shl_code=applescript,true]
#include "tcp_client_demo.h"
#include "lwip/opt.h"
#include "lwip_comm.h"
#include "lwip/lwip_sys.h"
#include "lwip/api.h"
#include "includes.h"
#include "key.h"



struct netconn *tcp_clientconn;                                        //TCP CLIENT网络连接结构体
u8 tcp_client_recvbuf[TCP_CLIENT_RX_BUFSIZE];        //TCP客户端接收数据缓冲区
u8 tcp_client_sendbuf[TCP_CLIENT_TX_BUFSIZE];        //TCP客户端接收数据缓冲区
//u8 *tcp_client_sendbuf="Explorer STM32F407 NETCONN TCP Client send data\r\n";        //TCP客户端发送数据缓冲区
u8 tcp_client_flag;                //TCP客户端数据发送标志位
static u16* recv_data;


OS_EVENT *Sem_Event;    //定义一个信号量
OS_EVENT *Str_Box;     //定义一个消息邮箱



//TCP客户端任务
#define TCPCLIENT_PRIO                6
//任务堆栈大小
#define TCPCLIENT_STK_SIZE        300
//任务堆栈
OS_STK TCPCLIENT_TASK_STK[TCPCLIENT_STK_SIZE];
//


//TCP客户端发送任务
#define TCPCLIENT_SEND_PRIO        7
//任务堆栈的大小
#define TCPCLIENT_SEND_STK_SIZE    300    //
//任务堆栈
OS_STK TCPCLIENT_SEND_TASK_STK[TCPCLIENT_SEND_STK_SIZE];


u8 Recv_Lwip_Flag = 0x80;

//任务函数声明
static void tcp_client_send_thread()
{
            OS_CPU_SR  cpu_sr;
            err_t   err;
//            u8 Recv_Lwip_Flag;
            while(1)
                        {
//         Recv_Lwip_Flag = *((u8*)OSMboxPend(Str_Box,5,&err));//请求消息邮箱
                                  if((tcp_client_flag & LWIP_SEND_DATA)==LWIP_SEND_DATA)
                                        {
                                                err = netconn_write(tcp_clientconn ,tcp_client_sendbuf,8192,NETCONN_COPY); //发送tcp_server_sentbuf中的数据
                                                if(err != ERR_OK)
                                                {
                                                        printf("发送失败\r\n");
                                                }
//                                                Recv_Lwip_Flag &= ~LWIP_SEND_DATA;
                                  }
                                        else OS_Sched();

                        }
}
//tcp客户端任务函数
static void tcp_client_thread(void *arg)
{
          OS_CPU_SR cpu_sr;
          u32 data_len = 0;

          err_t err,recv_err;
          static ip_addr_t server_ipaddr,loca_ipaddr;
          static u16_t                  server_port,loca_port;

          LWIP_UNUSED_ARG(arg);
           server_port = REMOTE_PORT;
          IP4_ADDR(&server_ipaddr, lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]);

                tcp_clientconn = netconn_new(NETCONN_TCP);  //创建一个TCP链接
                err = netconn_connect(tcp_clientconn,&server_ipaddr,server_port);//连接服务器
                if(err != ERR_OK)  netconn_delete(tcp_clientconn); //返回值不等于ERR_OK,删除tcp_clientconn连接
                else if (err == ERR_OK)    //处理新连接的数据
                {
                        struct netbuf *recvbuf;
                        netconn_getaddr(tcp_clientconn,&loca_ipaddr,&loca_port,1); //获取本地IP主机IP地址和端口号
                        printf("连接上服务器%d.%d.%d.%d,本机端口号为:%d\r\n",lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3],loca_port);
                        while(1)
                        {                                
                                if((recv_err = netconn_recv(tcp_clientconn,&recvbuf)) == ERR_OK)  //接收到数据
                                {        
                                        OS_ENTER_CRITICAL(); //关中断
                                        recv_data = (u16*)recvbuf->p->payload;        //得到上位机发送的数据
          data_len = recvbuf->p->len;                        
                                
                                        OS_EXIT_CRITICAL();  //开中断
                tcp_client_flag |= LWIP_SEND_DATA;               
//          OSMboxPost(Str_Box,&tcp_client_flag); //发送消息tcp_client_flag                                       
                                        netbuf_delete(recvbuf);
                                }else if(recv_err == ERR_CLSD)  //关闭连接
                                {
                                        netconn_close(tcp_clientconn);
                                        netconn_delete(tcp_clientconn);
                                        printf("服务器%d.%d.%d.%d断开连接\r\n",lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]);
                                        break;
                                }else OS_Sched();
                        
                        }
                }
}

//创建TCP客户端线程
//返回值:0 TCP客户端创建成功
//                其他 TCP客户端创建失败
INT8U tcp_client_init(void)
{
        INT8U res;
        OS_CPU_SR cpu_sr;
        u16 i;
        for(i=0;i<9000;i++)
        {
           tcp_client_sendbuf = i;
        }
        OS_ENTER_CRITICAL();        //关中断
        res = OSTaskCreate(tcp_client_thread,(void*)0,(OS_STK*)&TCPCLIENT_TASK_STK[TCPCLIENT_STK_SIZE-1],TCPCLIENT_PRIO); //创建TCP客户端线程
        res = OSTaskCreate(tcp_client_send_thread,(void*)0,(OS_STK*)&TCPCLIENT_SEND_TASK_STK[TCPCLIENT_SEND_STK_SIZE-1],TCPCLIENT_SEND_PRIO); //创建TCP客户端线程
//        Sem_Event = OSSemCreate(0);     //创建一个信号量用于任务间的同步
//        Str_Box = OSMboxCreate((void*)0);    //创建消息邮箱
        OS_EXIT_CRITICAL();                //开中断
        
        return res;
}
[/mw_shl_code]
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
发表于 2016-11-21 10:52:24 | 显示全部楼层
本帖最后由 刺客mfl 于 2016-11-21 11:14 编辑
刺客mfl 发表于 2016-11-21 10:51
代码如下:
#include "tcp_client_demo.h"
#include "lwip/opt.h"
LWIPOPTS.h的配置如下:
[mw_shl_code=applescript,true]#ifndef __LWIPOPTS_H__
#define __LWIPOPTS_H__

//线程优先级
#ifndef TCPIP_THREAD_PRIO
#define TCPIP_THREAD_PRIO                5        //定义内核任务的优先级为5
#endif
#undef  DEFAULT_THREAD_PRIO
#define DEFAULT_THREAD_PRIO                2


#define SYS_LIGHTWEIGHT_PROT    1                //为1时使用实时操作系统的轻量级保护,保护关键代码不被中断打断
#define NO_SYS                  0                  //使用UCOS操作系统
#define MEM_ALIGNMENT           4                  //使用4字节对齐模式
#define MEM_SIZE                32000         //内存堆heap大小
#define MEMP_NUM_PBUF           30                 //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       300                //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       1500                //PBUF_POOL_BUFSIZE:每个pbuf内存池大小

#define LWIP_TCP                1                  //使用TCP
#define TCP_TTL                 255                //生存时间

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

#undef TCPIP_MBOX_SIZE
#define TCPIP_MBOX_SIZE         MAX_QUEUE_ENTRIES   //tcpip创建主线程时的消息邮箱大小

#undef DEFAULT_TCP_RECVMBOX_SIZE
#define DEFAULT_TCP_RECVMBOX_SIZE       MAX_QUEUE_ENTRIES  

#undef DEFAULT_ACCEPTMBOX_SIZE
#define DEFAULT_ACCEPTMBOX_SIZE         MAX_QUEUE_ENTRIES  


#define TCP_MSS                 (1500 - 40)                  //最大TCP分段,TCP_MSS = (MTU - IP报头大小 - TCP报头大小
#define TCP_SND_BUF             (25*TCP_MSS)                //TCP发送缓冲区大小(bytes).
#define TCP_SND_QUEUELEN        (10* TCP_SND_BUF/TCP_MSS)        //TCP_SND_QUEUELEN: TCP发送缓冲区大小(pbuf).这个值最小为(2 * TCP_SND_BUF/TCP_MSS)
#define TCP_WND                 (10*TCP_MSS)                //TCP发送窗口
#define LWIP_ICMP               1         //使用ICMP协议
#define LWIP_DHCP               0        //使用DHCP
#define LWIP_UDP                1         //使用UDP服务
#define UDP_TTL                 255 //UDP数据包生存时间
#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



#define LWIP_NETCONN                    1         //LWIP_NETCONN==1:使能NETCON函数(要求使用api_lib.c)
#define LWIP_SOCKET                     1        //LWIP_SOCKET==1:使能Sicket API(要求使用sockets.c)
#define LWIP_COMPAT_MUTEX               1
#define LWIP_SO_RCVTIMEO                1         //通过定义LWIP_SO_RCVTIMEO使能netconn结构体中recv_timeout,使用recv_timeout可以避免阻塞线程

//有关系统的选项
#define TCPIP_THREAD_STACKSIZE          1000        //内核任务堆栈大小
#define DEFAULT_UDP_RECVMBOX_SIZE       2000
#define DEFAULT_THREAD_STACKSIZE        1500

//LWIP调试选项
#define LWIP_DEBUG                             0         //关闭DEBUG选项
#define ICMP_DEBUG                      LWIP_DBG_OFF //开启/关闭ICMPdebug

#endif /* __LWIPOPTS_H__ */
[/mw_shl_code]
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
发表于 2016-11-21 11:04:02 | 显示全部楼层
第二个问题就是:当与上位机进行数据交互时,也就是每当接收到一次上位机的命令后都往上位机返回8192个字节,这里采用数据循环发送的方式,每次发送间隔0ms,发送几次就会死机,提示发送失败。。。。。
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
发表于 2016-11-21 11:05:41 | 显示全部楼层
本帖最后由 刺客mfl 于 2016-11-21 11:13 编辑
刺客mfl 发表于 2016-11-21 11:04
第二个问题就是:当与上位机进行数据交互时,也就是每当接收到一次上位机的命令后都往上位机返回8192个字节 ...
这是第二个问题用到的代码。。。。
[mw_shl_code=applescript,true]#include "tcp_client_demo.h"
#include "lwip/opt.h"
#include "lwip_comm.h"
#include "lwip/lwip_sys.h"
#include "lwip/api.h"
#include "includes.h"
#include "key.h"



struct netconn *tcp_clientconn;                                        //TCP CLIENT网络连接结构体
u8 tcp_client_recvbuf[TCP_CLIENT_RX_BUFSIZE];        //TCP客户端接收数据缓冲区
u8 tcp_client_sendbuf[TCP_CLIENT_TX_BUFSIZE];        //TCP客户端接收数据缓冲区
//u8 *tcp_client_sendbuf="Explorer STM32F407 NETCONN TCP Client send data\r\n";        //TCP客户端发送数据缓冲区
u8 tcp_client_flag;                //TCP客户端数据发送标志位
static u16* recv_data;


OS_EVENT *Sem_Event;    //定义一个信号量
OS_EVENT *Str_Box;     //定义一个消息邮箱



//TCP客户端任务
#define TCPCLIENT_PRIO                6
//任务堆栈大小
#define TCPCLIENT_STK_SIZE        300
//任务堆栈
OS_STK TCPCLIENT_TASK_STK[TCPCLIENT_STK_SIZE];
//


//TCP客户端发送任务
#define TCPCLIENT_SEND_PRIO        7
//任务堆栈的大小
#define TCPCLIENT_SEND_STK_SIZE    300    //
//任务堆栈
OS_STK TCPCLIENT_SEND_TASK_STK[TCPCLIENT_SEND_STK_SIZE];


u8 Recv_Lwip_Flag;

//任务函数声明
static void tcp_client_send_thread()
{
            OS_CPU_SR  cpu_sr;
            err_t   err;
//            u8 Recv_Lwip_Flag;
            while(1)
                        {
          Recv_Lwip_Flag = *((u8*)OSMboxPend(Str_Box,5,&err));//请求消息邮箱
                                  if((Recv_Lwip_Flag & LWIP_SEND_DATA)==LWIP_SEND_DATA)
                                        {
                                                err = netconn_write(tcp_clientconn ,tcp_client_sendbuf,8192,NETCONN_COPY); //发送tcp_server_sentbuf中的数据
                                                if(err != ERR_OK)
                                                {
                                                        printf("发送失败\r\n");
                                                }
//                                                Recv_Lwip_Flag &= ~LWIP_SEND_DATA;
                                  }
                                        else OS_Sched();

                        }
}
//tcp客户端任务函数
static void tcp_client_thread(void *arg)
{
          OS_CPU_SR cpu_sr;
          u32 data_len = 0;

          err_t err,recv_err;
          static ip_addr_t server_ipaddr,loca_ipaddr;
          static u16_t                  server_port,loca_port;

          LWIP_UNUSED_ARG(arg);
           server_port = REMOTE_PORT;
          IP4_ADDR(&server_ipaddr, lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]);

                tcp_clientconn = netconn_new(NETCONN_TCP);  //创建一个TCP链接
                err = netconn_connect(tcp_clientconn,&server_ipaddr,server_port);//连接服务器
                if(err != ERR_OK)  netconn_delete(tcp_clientconn); //返回值不等于ERR_OK,删除tcp_clientconn连接
                else if (err == ERR_OK)    //处理新连接的数据
                {
                        struct netbuf *recvbuf;
                        netconn_getaddr(tcp_clientconn,&loca_ipaddr,&loca_port,1); //获取本地IP主机IP地址和端口号
                        printf("连接上服务器%d.%d.%d.%d,本机端口号为:%d\r\n",lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3],loca_port);
                        while(1)
                        {                                
                                if((recv_err = netconn_recv(tcp_clientconn,&recvbuf)) == ERR_OK)  //接收到数据
                                {        
                                        OS_ENTER_CRITICAL(); //关中断
                                        recv_data = (u16*)recvbuf->p->payload;        //得到上位机发送的数据
          data_len = recvbuf->p->len;                        
                                
                                        OS_EXIT_CRITICAL();  //开中断
                tcp_client_flag |= LWIP_SEND_DATA;               
          OSMboxPost(Str_Box,&tcp_client_flag); //发送消息tcp_client_flag                                       
                                        netbuf_delete(recvbuf);
                                }else if(recv_err == ERR_CLSD)  //关闭连接
                                {
                                        netconn_close(tcp_clientconn);
                                        netconn_delete(tcp_clientconn);
                                        printf("服务器%d.%d.%d.%d断开连接\r\n",lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]);
                                        break;
                                }else OS_Sched();
                        
                        }
                }
}

//创建TCP客户端线程
//返回值:0 TCP客户端创建成功
//                其他 TCP客户端创建失败
INT8U tcp_client_init(void)
{
        INT8U res;
        OS_CPU_SR cpu_sr;
        u16 i;
        for(i=0;i<9000;i++)
        {
           tcp_client_sendbuf = i;
        }
        OS_ENTER_CRITICAL();        //关中断
        res = OSTaskCreate(tcp_client_thread,(void*)0,(OS_STK*)&TCPCLIENT_TASK_STK[TCPCLIENT_STK_SIZE-1],TCPCLIENT_PRIO); //创建TCP客户端线程
        res = OSTaskCreate(tcp_client_send_thread,(void*)0,(OS_STK*)&TCPCLIENT_SEND_TASK_STK[TCPCLIENT_SEND_STK_SIZE-1],TCPCLIENT_SEND_PRIO); //创建TCP客户端线程
//        Sem_Event = OSSemCreate(0);     //创建一个信号量用于任务间的同步
        Str_Box = OSMboxCreate((void*)0);    //创建消息邮箱
        OS_EXIT_CRITICAL();                //开中断
        
        return res;
}
[/mw_shl_code]
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
发表于 2016-11-21 11:10:45 | 显示全部楼层
本帖最后由 刺客mfl 于 2016-11-21 11:12 编辑

[mw_shl_code=applescript,true]#include "tcp_client_demo.h"
#include "lwip/opt.h"
#include "lwip_comm.h"
#include "lwip/lwip_sys.h"
#include "lwip/api.h"
#include "includes.h"
#include "key.h"
  


struct netconn *tcp_clientconn;                                        //TCP CLIENT网络连接结构体
u8 tcp_client_recvbuf[TCP_CLIENT_RX_BUFSIZE];        //TCP客户端接收数据缓冲区
u8 tcp_client_sendbuf[TCP_CLIENT_TX_BUFSIZE];        //TCP客户端接收数据缓冲区
//u8 *tcp_client_sendbuf="Explorer STM32F407 NETCONN TCP Client send data\r\n";        //TCP客户端发送数据缓冲区
u8 tcp_client_flag;                //TCP客户端数据发送标志位
static u16* recv_data;


OS_EVENT *Sem_Event;    //定义一个信号量
OS_EVENT *Str_Box;     //定义一个消息邮箱



//TCP客户端任务
#define TCPCLIENT_PRIO                6
//任务堆栈大小
#define TCPCLIENT_STK_SIZE        300
//任务堆栈
OS_STK TCPCLIENT_TASK_STK[TCPCLIENT_STK_SIZE];
//


//TCP客户端发送任务
#define TCPCLIENT_SEND_PRIO        7
//任务堆栈的大小
#define TCPCLIENT_SEND_STK_SIZE    300    //
//任务堆栈
OS_STK TCPCLIENT_SEND_TASK_STK[TCPCLIENT_SEND_STK_SIZE];


u8 Recv_Lwip_Flag;

//任务函数声明
static void tcp_client_send_thread()
{
            OS_CPU_SR  cpu_sr;
            err_t   err;
//            u8 Recv_Lwip_Flag;
            while(1)
                        {
          Recv_Lwip_Flag = *((u8*)OSMboxPend(Str_Box,5,&err));//请求消息邮箱
                                  if((Recv_Lwip_Flag & LWIP_SEND_DATA)==LWIP_SEND_DATA)
                                        {
                                                err = netconn_write(tcp_clientconn ,tcp_client_sendbuf,8192,NETCONN_COPY); //发送tcp_server_sentbuf中的数据
                                                if(err != ERR_OK)
                                                {
                                                        printf("发送失败\r\n");
                                                }
//                                                Recv_Lwip_Flag &= ~LWIP_SEND_DATA;
                                  }
                                        else OS_Sched();

                        }
}
//tcp客户端任务函数
static void tcp_client_thread(void *arg)
{
          OS_CPU_SR cpu_sr;
          u32 data_len = 0;

          err_t err,recv_err;
          static ip_addr_t server_ipaddr,loca_ipaddr;
          static u16_t                  server_port,loca_port;

          LWIP_UNUSED_ARG(arg);
           server_port = REMOTE_PORT;
          IP4_ADDR(&server_ipaddr, lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]);

                tcp_clientconn = netconn_new(NETCONN_TCP);  //创建一个TCP链接
                err = netconn_connect(tcp_clientconn,&server_ipaddr,server_port);//连接服务器
                if(err != ERR_OK)  netconn_delete(tcp_clientconn); //返回值不等于ERR_OK,删除tcp_clientconn连接
                else if (err == ERR_OK)    //处理新连接的数据
                {
                        struct netbuf *recvbuf;
                        netconn_getaddr(tcp_clientconn,&loca_ipaddr,&loca_port,1); //获取本地IP主机IP地址和端口号
                        printf("连接上服务器%d.%d.%d.%d,本机端口号为:%d\r\n",lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3],loca_port);
                        while(1)
                        {                               
                                if((recv_err = netconn_recv(tcp_clientconn,&recvbuf)) == ERR_OK)  //接收到数据
                                {       
                                        OS_ENTER_CRITICAL(); //关中断
                                        recv_data = (u16*)recvbuf->p->payload;        //得到上位机发送的数据
          data_len = recvbuf->p->len;                       
                               
                                        OS_EXIT_CRITICAL();  //开中断
                tcp_client_flag |= LWIP_SEND_DATA;               
          OSMboxPost(Str_Box,&tcp_client_flag); //发送消息tcp_client_flag                                       
                                        netbuf_delete(recvbuf);
                                }else if(recv_err == ERR_CLSD)  //关闭连接
                                {
                                        netconn_close(tcp_clientconn);
                                        netconn_delete(tcp_clientconn);
                                        printf("服务器%d.%d.%d.%d断开连接\r\n",lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]);
                                        break;
                                }else OS_Sched();
                       
                        }
                }
}

//创建TCP客户端线程
//返回值:0 TCP客户端创建成功
//                其他 TCP客户端创建失败
INT8U tcp_client_init(void)
{
        INT8U res;
        OS_CPU_SR cpu_sr;
        u16 i;
        for(i=0;i<9000;i++)
        {
           tcp_client_sendbuf = i;
        }
        OS_ENTER_CRITICAL();        //关中断
        res = OSTaskCreate(tcp_client_thread,(void*)0,(OS_STK*)&TCPCLIENT_TASK_STK[TCPCLIENT_STK_SIZE-1],TCPCLIENT_PRIO); //创建TCP客户端线程
        res = OSTaskCreate(tcp_client_send_thread,(void*)0,(OS_STK*)&TCPCLIENT_SEND_TASK_STK[TCPCLIENT_SEND_STK_SIZE-1],TCPCLIENT_SEND_PRIO); //创建TCP客户端线程
//        Sem_Event = OSSemCreate(0);     //创建一个信号量用于任务间的同步
        Str_Box = OSMboxCreate((void*)0);    //创建消息邮箱
        OS_EXIT_CRITICAL();                //开中断
       
        return res;
}
[/mw_shl_code]
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
发表于 2016-11-21 11:15:51 | 显示全部楼层
zky26 发表于 2016-11-18 18:04
你的调试问题在哪?  稍微阐述具体点,我好帮你回答!

麻烦您帮我看一下问题出在哪?谢谢。。。
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2017-7-9
在线时间
8 小时
发表于 2020-9-9 21:34:03 | 显示全部楼层
楼主您好,可以将您的DP83848的调试源码给我发一份看下吗?万分感谢
回复

使用道具 举报

4

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2020-8-25
在线时间
25 小时
发表于 2020-9-12 16:03:36 | 显示全部楼层
楼主您好,可以将您的DP83848的调试源码发一份给我吗?万分感谢
回复

使用道具 举报

4

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2020-8-25
在线时间
25 小时
发表于 2020-10-10 09:27:44 | 显示全部楼层
正点原子 发表于 2016-4-15 23:10
我们实测TCP传输,速度可以到5MB/S。

原子哥能分享一下代码吗-->1245520043@qq.com,我在raw stm32f4 的,没有思路提速了,先谢过了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2020-10-11 00:48:22 | 显示全部楼层
simple551 发表于 2020-10-10 09:27
原子哥能分享一下代码吗-->1245520043@qq.com,我在raw stm32f4 的,没有思路提速了,先谢过了

我们阿波罗的综合实验,网络摄像头部分代码,就可以到这个速度
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2020-8-25
在线时间
25 小时
发表于 2020-10-12 14:28:52 | 显示全部楼层
本帖最后由 simple551 于 2020-10-12 14:31 编辑
正点原子 发表于 2020-10-11 00:48
我们阿波罗的综合实验,网络摄像头部分代码,就可以到这个速度

阿波罗的代码里面没有综合实验,原子哥你说的是lwip扩展例程里面的网络摄像头实验吗,这个用了操作系统,使用的是net通信,不是tcp通信啊
图片1.png
图片2.png
回复

使用道具 举报

7

主题

20

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2022-5-17
在线时间
19 小时
发表于 2022-10-31 14:54:47 | 显示全部楼层
刺客mfl 发表于 2016-11-21 10:52
LWIPOPTS.h的配置如下:
[mw_shl_code=applescript,true]#ifndef __LWIPOPTS_H__
#define __LWIPOPTS_H__ ...

大佬,你好,关于LWIP速度优化这个项目的代码可以发给我一份吗?? 3181067055@qq.com   [/email] 。 大佬给一个联系方式,有偿。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 15:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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