본문 바로가기

WCH/CH32V307

CH32V307 SM - UDP 전송속도 테스트(Iperf UDP Throughput 측정 테스트)

 

 

Ethernet PHY가 포함되어 있는  CH32V307의 UDP 이더넷 성능 테스트를 진행해 보자

 

UDP서버 예제를 이용해서 UDP 루프백 속도를 측정 해 볼 수 있다.

https://github.com/openwch/ch32v307/tree/main/EVT/EXAM/ETH/UdpServer

 

int cnt = 0;
void WCHNET_UdpServerRecv(struct _SOCK_INF *socinf, u32 ipaddr, u16 port, u8 *buf, u32 len)
{
    //u8 ip_addr[4], i;
/*
    int i;
//    printf("Remote IP:");
    for (i = 0; i < 4; i++) {
        ip_addr[i] = ipaddr & 0xff;
        printf("%d ", ip_addr[i]);
        ipaddr = ipaddr >> 8;
    }*/
    u8 ip_addr[4];
    for (int i = 0; i < 4; i++) {
        ip_addr[i] = ipaddr & 0xff;
        ipaddr = ipaddr >> 8;
    }
    //printf("UDP rcv %d\r\n", cnt++);
    //printf("srcport = %d len = %d socketid = %d\r\n", port, len,  socinf->SockIndex);
    //WCHNET_SocketUdpSendTo(socinf->SockIndex, buf, &len, ip_addr, port);
    //WCHNET_SocketUdpSendTo(socinf->SockIndex, buf, &len, ipaddr, srcport);
}
/*********************************************************************
 * @fn      WCHNET_CreateUdpSocket
 *
 * @brief   Create UDP Socket
 *
 * @return  none
 */
void WCHNET_CreateUdpSocket(void)
{
    u8 i;
    SOCK_INF TmpSocketInf;
    memset((void *) &TmpSocketInf, 0, sizeof(SOCK_INF));
    TmpSocketInf.SourPort = srcport;
    TmpSocketInf.ProtoType = PROTO_TYPE_UDP;
    TmpSocketInf.RecvStartPoint = (u32) SocketRecvBuf;
    TmpSocketInf.RecvBufLen = UDP_RECE_BUF_LEN;
    TmpSocketInf.AppCallBack = WCHNET_UdpServerRecv;
    i = WCHNET_SocketCreat(&SocketId, &TmpSocketInf);
    printf("SocketId %d\r\n", SocketId);
    mStopIfError(i);
}
/*********************************************************************
 * @fn      WCHNET_HandleSockInt
 *
 * @brief   Socket Interrupt Handle
 *
 * @param   socketid - socket id.
 *          intstat - interrupt status
 *
 * @return  none
 */
void WCHNET_HandleSockInt(u8 socketid, u8 intstat)
{
    u8 i;
    u32 len;
    u32 endAddr;
    if (intstat & SINT_STAT_RECV)                               //receive data
    {
        /*
        endAddr = SocketInf[id].RecvStartPoint + SocketInf[id].RecvBufLen;       //Receive buffer end address
        if ((SocketInf[id].RecvReadPoint + SocketInf[id].RecvRemLen) > endAddr) {    //Calculate the length of the received data
            len = endAddr - SocketInf[id].RecvReadPoint;
        }
        else {
            len = SocketInf[id].RecvRemLen;
        }
        WCHNET_SocketRecv(id, NULL, &len);*/
        printf("UDP rcv %d\r\n", cnt++);
    }
    if (intstat & SINT_STAT_CONNECT)                            //connect successfully
    {
        printf("TCP Connect Success\r\n");
    }
    if (intstat & SINT_STAT_DISCONNECT)                         //disconnect
    {
        printf("TCP Disconnect\r\n");
    }
    if (intstat & SINT_STAT_TIM_OUT)                            //timeout disconnect
    {
        printf("TCP Timeout\r\n");
    }
}
/*********************************************************************
 * @fn      WCHNET_HandleGlobalInt
 *
 * @brief   Global Interrupt Handle
 *
 * @return  none
 */
void WCHNET_HandleGlobalInt(void)
{
    u8 intstat;
    u16 i;
    u8 socketint;
    intstat = WCHNET_GetGlobalInt();                              //get global interrupt flag
    if (intstat & GINT_STAT_UNREACH)                              //Unreachable interrupt
    {
        printf("GINT_STAT_UNREACH\r\n");
    }
    if (intstat & GINT_STAT_IP_CONFLI)                            //IP conflict
    {
        printf("GINT_STAT_IP_CONFLI\r\n");
    }
    if (intstat & GINT_STAT_PHY_CHANGE)                           //PHY status change
    {
        i = WCHNET_GetPHYStatus();
        if (i & PHY_Linked_Status)
            printf("PHY Link Success\r\n");
    }
    if (intstat & GINT_STAT_SOCKET) {                             //socket related interrupt
        for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++) {
            socketint = WCHNET_GetSocketInt(i);
            if (socketint)
                WCHNET_HandleSockInt(i, socketint);
        }
    }
}

 

 

CH32V307 에서 UDP 루프백 테스트 결과 3.3Mpbs 정도로 측정이 된다. 너무 느린데...

CH32V307 TCP 루프백 속도와 비교해도 너무 느리다.

 

 

iperf를 이용해서 UDP 전송율 테스트를 해 봐도 너무 느리게 측정이 된다.

코드를 좀더 수정해야 하나?

반응형