s3c2440内核主频最高可达533M,目前我们使用时设置的主频是400M,那么s3c2440每秒能否处理7000个udp数据包?
1:数据包的处理很简单,就是recvfrom接收,然后数据处理,调用sendto发送;
2:接收数据不超过50个字节,发送数据不超过60字节;
3:我用系统函数gettimeofday测试了一下“数据处理和发送部分”的时间,执行时间约500~600us;
4:用系统函数gettimeofday只测试“数据处理部分”时间,执行时间约200us;也就是说光sendto函数执行时间就300us;
如果我的测试结论成立的话,那无论如何s3c2440每秒也不可能处理7000个udp数据包,最多也就2000个udp数据包!而且数据处理部分就是些数据拷贝和判断语句,并没有很复杂的操作。请大家帮忙分析下,问题出在哪里?
测试程序:
gettimeofday(&tpstart,NULL);
if((DelayReq_BUF[0]&0x0F) != 0x01)
continue;
//printf("D_R IN\n");
/*获得并更新client table,gcwang add 100410*/
/**********************************************************************************************/
if(ModeType==1) /*unicast*/
{
ip_1_E = inet_ntoa(client_sockaddr.sin_addr);
ip_2_E = inet_addr(ip_1_E);
//printf("Client_unicast ip_2_E:%x\n",ip_2_E);
for(k=0;k<MAX_CLIENT;k++)
{
if(Client_unicast[k].empty==1) /*有效*/
{
if(ip_2_E==Client_unicast[k].client_ip) /*本次收到包的ip地址和client table中的client ip地址一致*/
{
Client_unicast[k].client_counter=0; /*用于判断收到client的时刻*/
break;
}
}
else
{
Client_unicast[k].client_ip=ip_2_E;
Client_unicast[k].client_addr=client_sockaddr;
Client_unicast[k].client_counter=0;
Client_unicast[k].empty=1;
break;
}
}
}
/*************************************************************************************************/
/*printf("MASTER RECV DelayReq_BUF =");
for(xx=0;xx<124;xx++)
printf(" 0x%x ",DelayReq_BUF[xx]);
printf("\n");*/
/*部分变量修改*/
/*DelayResp_Header.transportSpecific_messageType = 0x19;
DelayResp_Header.messageLength[0] = 0x00;
DelayResp_Header.messageLength[1] = 0x36;
DelayResp_Header.controlField = 0x00;
DelayResp_Header.logMessageInterval = 0x02;*/
if(NET_speed == 1) /*10M*/
DelayResp_Header.correctionField[0] = 95;
else if(NET_speed == 0) /*100M*/
DelayResp_Header.correctionField[0] = 0;
DelayResp_header_DEF[0] = 0x19;
DelayResp_header_DEF[1] = 0x02;
DelayResp_header_DEF[3] = 54;
//DelayResp_header_DEF[33] = intervalfromatlog(DELAY_REQ_BCD);
DelayResp_header_DEF[33] =0;
#if 0
if(NET_speed == 1) /*10M,95ns=5F0000*/
{
DelayResp_header_DEF[8] = 0x00;
DelayResp_header_DEF[9] = 0x00;
DelayResp_header_DEF[10] = 0x00;
DelayResp_header_DEF[11]= 0x00;
DelayResp_header_DEF[12] = 0x00;
DelayResp_header_DEF[13] = 0x5F;
DelayResp_header_DEF[14] = 0x00;
DelayResp_header_DEF[15] = 0x00;
}
else if(NET_speed == 0) /*100M*/
{
DelayResp_header_DEF[8] = 0x00;
DelayResp_header_DEF[9] = 0x00;
DelayResp_header_DEF[10] = 0x00;
DelayResp_header_DEF[11]= 0x00;
DelayResp_header_DEF[12] = 0x00;
DelayResp_header_DEF[13] = 0x00;
DelayResp_header_DEF[14] = 0x00;
DelayResp_header_DEF[15] = 0x00;
}
#endif
/*读取收到Delay_req的时间戳*/
GET_PTP_TIMESTAMP(&PTP_MSG_TIME);
/*Delay_resp数据准备*/
//CharNCopy(DelayResp_BUF, DelayResp_header_DEF, 34); /*帧头*/
/*将Delay_req的sequenceId复制到Delay_resp的对应位置*/
DelayResp_BUF[30] = DelayReq_BUF[30];
DelayResp_BUF[31] = DelayReq_BUF[31];
//printf("seq_Id :%d %d\n",DelayResp_BUF[30],DelayResp_BUF[31]);
DelayResp_BUF[32] = 0x03;
/*将Delay_req的sourcePortIdentify复制到Delay_resp的requestingPortIdentity位置*/
DelayResp_BUF[44] = DelayReq_BUF[20];
DelayResp_BUF[45] = DelayReq_BUF[21];
DelayResp_BUF[46] = DelayReq_BUF[22];
DelayResp_BUF[47] = DelayReq_BUF[23];
DelayResp_BUF[48] = DelayReq_BUF[24];
DelayResp_BUF[49] = DelayReq_BUF[25];
DelayResp_BUF[50] = DelayReq_BUF[26];
DelayResp_BUF[51] = DelayReq_BUF[27];
DelayResp_BUF[52] = DelayReq_BUF[28];
DelayResp_BUF[53] = DelayReq_BUF[29];
/*将Delay_req的domainNumber复制到Delay_resp的对应位置*/
DelayResp_BUF[4] = DelayReq_BUF[4];
/*将Delay_req的correctionField复制到Delay_resp的对应位置*/
DelayResp_BUF[8] = DelayReq_BUF[8];
DelayResp_BUF[9] = DelayReq_BUF[9];
DelayResp_BUF[10] = DelayReq_BUF[10];
DelayResp_BUF[11] = DelayReq_BUF[11];
DelayResp_BUF[12] = DelayReq_BUF[12];
DelayResp_BUF[13] = DelayReq_BUF[13];
DelayResp_BUF[14] = DelayReq_BUF[14];
DelayResp_BUF[15] = DelayReq_BUF[15];
/*加入收到Delay_req的时间戳*/
//CharNCopy(&DelayResp_BUF[DelayReq_BUF_END_PTR][34], (Uint8 *)&PTP_MSG_TIME.secondsField, 4);
DelayResp_BUF[34] = 0;
DelayResp_BUF[35] = 0;
for(xx=0;xx<=3;xx++)
{
DelayResp_BUF[36+xx] = ((PTP_MSG_TIME.secondsField>>((3-xx)*8))&0xff);
DelayResp_BUF[40+xx] = DelayReq_BUF[16+xx];
}
DelayResp_BUF[0]= 0x09; //四方测试后transportSpecific=x09
//CharNCopy(&DelayResp_BUF[DelayReq_BUF_END_PTR][40], (Uint8 *)&PTP_MSG_TIME.nanosecondsField, 4);
gettimeofday(&tpend,NULL);
if(ModeType==1) /*unicast*/
{
//GENERAL_sockaddr_s.sin_addr.s_addr = inet_addr("192.168.2.84");
//GENERAL_sockaddr_s=client_sockaddr;
GENERAL_sockaddr_s.sin_addr.s_addr =client_sockaddr.sin_addr.s_addr;
//printf("client_sockaddr.sin_addr.s_addr:%x\n",client_sockaddr.sin_addr.s_addr);
//GENERAL_sockaddr.sin_port = htons (320);
//if(sendto(PTP_GENERAL_sockid, DelayResp_BUF, 54, 0, (struct sockaddr *)&client_sockaddr, sizeof(struct sockaddr)) < 0)
if(sendto(PTP_GENERAL_sockid, DelayResp_BUF, 54, 0, (struct sockaddr *)&GENERAL_sockaddr_s, sizeof(struct sockaddr)) < 0)
{
printf("Delay_Resp MSG send ERROR!\n");
}
//printf("Delay_Resp send !\n");
}
else
{
if(sendto(PTP_GENERAL_sockid, DelayResp_BUF, 54, 0, (struct sockaddr *)&GENERAL_sockaddr, sizeof(struct sockaddr)) < 0)
{
printf("Delay_Resp MSG send ERROR!\n");
}
}
//printf("D_R F\n");
//gettimeofday(&tpend,NULL);
timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+ tpend.tv_usec-tpstart.tv_usec;
timeuse/=1000000;
printf("Used Time:%f \n",timeuse);