主题 : 请教:关于s3c2440处理能力 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 3507
精华: 0
发帖: 27
金钱: 170 两
威望: 57 点
综合积分: 54 分
注册时间: 2009-01-14
最后登录: 2017-09-13
楼主  发表于: 2010-08-31 11:17

 请教:关于s3c2440处理能力

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);  
级别: 新手上路
UID: 3507
精华: 0
发帖: 27
金钱: 170 两
威望: 57 点
综合积分: 54 分
注册时间: 2009-01-14
最后登录: 2017-09-13
1楼  发表于: 2010-08-31 13:13
怎么没人回答啊?
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
2楼  发表于: 2010-08-31 13:46
抱歉,我想没有很多人对你的测试会有很大兴趣。也许对大多数人来说,测试以太网连接的实际带宽会更有实用意义。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 3507
精华: 0
发帖: 27
金钱: 170 两
威望: 57 点
综合积分: 54 分
注册时间: 2009-01-14
最后登录: 2017-09-13
3楼  发表于: 2010-08-31 14:56
怎么会没有兴趣呢?CPU的数据包处理能力是个很重要的指标!是操作系统还是什么影响了它的处理速度,sendto函数怎么会有300us的时间?这会严重影响CPU的数据包吞吐量。
级别: 新手上路
UID: 3507
精华: 0
发帖: 27
金钱: 170 两
威望: 57 点
综合积分: 54 分
注册时间: 2009-01-14
最后登录: 2017-09-13
4楼  发表于: 2010-08-31 14:58
我只是想知道影响S3C2440吞吐量的瓶颈在哪里?
级别: 新手上路
UID: 3507
精华: 0
发帖: 27
金钱: 170 两
威望: 57 点
综合积分: 54 分
注册时间: 2009-01-14
最后登录: 2017-09-13
5楼  发表于: 2010-09-01 09:12
看来大家都这个问题真的不感兴趣!!