请教 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返回也变慢了。请各位指点迷津。 给大家汇报一下,我换成3.3版本后运行一直很稳定,没再出现变慢的现象。 楼主 你之前用的啥版本啊 了解~~~~ 呵呵,解决了就好 感觉群里有个别群友有点不厚道啊,不明白的东西就发帖出来,解决后就走人,相互学习吧,把个人的成果也共享一下,大家进步都快吧!
谢谢大家! 操砖砸LZ{:3_54:} zhwbiao 发表于 2012-11-15 16:26 static/image/common/back.gif
感觉群里有个别群友有点不厚道啊,不明白的东西就发帖出来,解决后就走人,相互学习吧,把个人的成果也共享 ...
估计lz也是更换版本,解决了问题,没有找到问题的所在。
页:
[1]