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 전송율 테스트를 해 봐도 너무 느리게 측정이 된다.
코드를 좀더 수정해야 하나?
반응형