sledd 发表于 2011-12-1 16:00:56

请教 STM32+ENC28J60 做UDP SEVER 长时间运行后发送速度变慢

STM32103+ENC28J60+RTT 做UDP SEVER,接收数据并在规定时间内发送数据到客户端,开始运行时发送速度很正常,200MS一次,但在运行了一段时间后(我单位的局域网中40个小时,合作方那边只运行几个小时),就出现发送时间间隔变长,为了测试,只保留了 init()和udpserver()2个线程,测试结果还是这样。自己怀疑是数据缓冲没有释放,内存会不会被耗尽呢,请各位前辈帮忙 看一下,以下是application的代码,其他没动。

#include <board.h>
#include <rtthread.h>
#include <stm32f10x.h>

#include <lwip/netdb.h>
#include <lwip/sockets.h>
#include "tcp_senddata.h"
#include "handledata.h"
#include "tcpserver.h"
//#include "mbsed.h"
#include "udpserver.h"
//#include "udpserverinit.h"
#include "byteword16.h"
#include "word32byte.h"
//#include "tc_comm.h"

//#include <rtthread.h>
//#include <lwip/sockets.h> /* 浣跨敤BSD Socket鎺ュ彛蹇呴』鍖呭惈sockets.h杩欎釜澶存枃浠?*/
#include <iostate.h>
#include <speed.h>
#include <crc.h>
//#include <board.h>
//#include <rtthread.h>
//#include <stm32f10x.h>


#ifdef RT_USING_LWIP
#include <lwip/sys.h>
#include <lwip/api.h>
#include <netif/ethernetif.h>
#endif



static struct rt_mailbox mb;
staticcharmb_pool;          
//staticchar mb_str[]="i am";

   



//rt_uint32_t *buffer1_ptr;
rt_uint32_tdataorder=0;//数据通知报文中的32位通知序号
//rt_uint16_tnuber1=5,nuber2=5,nuber=5;

void rt_init_thread_entry(void* parameter)
{
/* LwIP Initialization */
#ifdef RT_USING_LWIP
        {
                extern void lwip_sys_init(void);
               
                /* register ethernetif device */
                eth_system_device_init();

#ifdef STM32F10X_CL
                rt_hw_stm32_eth_init();
#else
        /* STM32F103 */
        #if STM32_ETH_IF == 0
                        rt_hw_enc28j60_init();
        #elif STM32_ETH_IF == 1
                        rt_hw_dm9000_init();
        #endif
#endif

                /* re-init device driver */
                rt_device_init_all();

                /* init lwip system */
                lwip_sys_init();
                rt_kprintf("TCP/IP initialized!\n");
       
        }
#endif
}

void rt_udpserver_thread_entry(void* parameter)
{
   int sock/*,i,j*/;
   int bytes_read=0,sign,signn,timeout=100;
    char *recv_data,*aa;
   rt_uint32_t addr_len, crcrx,crcjs;       
   struct sockaddr_in server_addr, client_addr;
    char        send_data;       

   rt_thread_delay(100);
   rt_kprintf("\nEnter rt_udpserver_thread_entry\n");
   /* 分配接收用的数据缓冲 */
   recv_data = rt_malloc(1024);
   if (recv_data == RT_NULL)
   {
       /* 分配内存失败,返回 */
       rt_kprintf("No memory\n");
       return;
   }

   /* 创建一个socket,类型是SOCK_DGRAM,UDP类型 */
   if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
   {
       rt_kprintf("Socket error\n");

       /* 释放接收用的数据缓冲 */
       rt_free(recv_data);
           recv_data=RT_NULL;
       return;
   }
    /*设置超时返回       */
if( lwip_setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout))==-1)
   {
       rt_kprintf("Socket1 error\n");

       /* 释放接收用的数据缓冲 */
       rt_free(recv_data);
           recv_data=RT_NULL;
       return;
   }

   /* 初始化服务端地址 */
   server_addr.sin_family = AF_INET;
   server_addr.sin_port = htons(5020);
   server_addr.sin_addr.s_addr = INADDR_ANY;
   rt_memset(&(server_addr.sin_zero),0, sizeof(server_addr.sin_zero));

   /* 绑定socket到服务端地址 */
   if (bind(sock,(struct sockaddr *)&server_addr,
            sizeof(struct sockaddr)) == -1)
   {
       /* 绑定地址失败 */
       rt_kprintf("Bind error\n");

       /* 释放接收用的数据缓冲 */
       rt_free(recv_data);
       return;
   }

   addr_len = sizeof(struct sockaddr);
   //rt_kprintf("UDPServer Waiting for client on port 5000...\n");

        while(bytes_read==0)       
        {
       rt_kprintf("before recvfrom Time:%d\n",rt_tick_get());
       bytes_read = recvfrom(sock, recv_data, 1024, 0,
                           (struct sockaddr *)&client_addr, &addr_len);
       rt_kprintf("after recvfrom Time:%d\n", rt_tick_get());
        }

   rt_kprintf("(%s , %d) said : \n",
   inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));

   while (1)
   {

      rt_kprintf("Test Send Notify Data, time:%d\n",rt_tick_get());
                sendto(sock, send_data, 12, 0,
                  (struct sockaddr *)&client_addr, sizeof(struct sockaddr));
                rt_kprintf("Test Send Notify Data time:%d\n",rt_tick_get());
                       
                rt_kprintf("Test Send Notify Data before delay time:%d\n",rt_tick_get());
                rt_thread_delay(20);
                rt_kprintf("Test Send Notify Data after delay time:%d\n",rt_tick_get());
          }
          
//lwip_close(sock);

   /* 释放接收用的数据缓冲 */
// rt_free(recv_data);

   //return;

}




int rt_application_init()
{                       
        rt_thread_t udpserver_thread;
        rt_thread_t init_thread;
#if (RT_THREAD_PRIORITY_MAX == 32)
        init_thread = rt_thread_create("init",
                                                                rt_init_thread_entry, RT_NULL,
                                                                2048, 8, 20);
#else
        init_thread = rt_thread_create("init",
                                                                rt_init_thread_entry, RT_NULL,
                                                                2048, 80, 20);
#endif

        if (init_thread != RT_NULL)
                rt_thread_startup(init_thread);
        //rt_init_thread_entry(NULL);
       
   udpserver_thread=rt_thread_create("udpserver",
                                                                rt_udpserver_thread_entry, RT_NULL,
                                                                2048, 12, 20);

        if (udpserver_thread != RT_NULL)
                rt_thread_startup(udpserver_thread);

        return 0;
}

/*@}*/

用抓包工具看了一下,刚开始是200MS一次,后来会达到1s左右,PING返回也变慢了。请各位指点迷津。

sledd 发表于 2011-12-27 14:33:57

给大家汇报一下,我换成3.3版本后运行一直很稳定,没再出现变慢的现象。

3050311118 发表于 2011-12-27 23:28:52

楼主 你之前用的啥版本啊

Jimmyxu 发表于 2012-4-2 09:41:49

了解~~~~

honami520 发表于 2012-4-2 10:11:46

呵呵,解决了就好

zhwbiao 发表于 2012-11-15 16:26:54

感觉群里有个别群友有点不厚道啊,不明白的东西就发帖出来,解决后就走人,相互学习吧,把个人的成果也共享一下,大家进步都快吧!
谢谢大家!

ZL_electric 发表于 2012-11-15 16:35:21

操砖砸LZ{:3_54:}

utopiaprince 发表于 2012-11-21 18:45:54

zhwbiao 发表于 2012-11-15 16:26 static/image/common/back.gif
感觉群里有个别群友有点不厚道啊,不明白的东西就发帖出来,解决后就走人,相互学习吧,把个人的成果也共享 ...

估计lz也是更换版本,解决了问题,没有找到问题的所在。
页: [1]
查看完整版本: 请教 STM32+ENC28J60 做UDP SEVER 长时间运行后发送速度变慢