본문 바로가기

[INTERFACE]/WIZNET_EVM

W5300 을 이용한 UDP loopback 전송률 테스트

W5300을 이용한 Wiznet ioLibrary Driver 포팅 및 TCP Loopback 전송률 테스트 결과 코드를 활용하여 UDP통신에서 전송률 테스트를 해 보았다.

 

Wiznet ioLibrary Driver 코드에서 제공하는 loopback_udps 함수를 이용하여 UDP 테스트 코드를 작성 했다.

int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t port)
{
   int32_t  ret;
   uint16_t size, sentsize;
   uint8_t  destip[4];
   uint16_t destport;

   switch(getSn_SR(sn))
   {
      case SOCK_UDP :
         if((size = getSn_RX_RSR(sn)) > 0)
         {
            if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
            ret = recvfrom(sn, buf, size, destip, (uint16_t*)&destport);
            if(ret <= 0)
            {
#ifdef _LOOPBACK_DEBUG_
               printf("%d: recvfrom error. %ld\r\n",sn,ret);
#endif
               return ret;
            }
            size = (uint16_t) ret;
            sentsize = 0;
            while(sentsize != size)
            {
            	//sbi(GPIOD, BIT12);
               ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport);
               //cbi(GPIOD, BIT12);
               if(ret < 0)
               {
#ifdef _LOOPBACK_DEBUG_
                  printf("%d: sendto error. %ld\r\n",sn,ret);
#endif
                  return ret;
               }
               sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
            }
         }
         break;
      case SOCK_CLOSED:
#ifdef _LOOPBACK_DEBUG_
         //printf("%d:UDP loopback start\r\n",sn);
#endif
         if((ret = socket(sn, Sn_MR_UDP, port, 0x00)) != sn)
            return ret;
#ifdef _LOOPBACK_DEBUG_
         printf("%d:Opened, UDP loopback, port [%d]\r\n", sn, port);
#endif
         break;
      default :
         break;
   }
   return 1;
}

 

 

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
  HAL_Init();


  /* Configure the system clock */
  SystemClock_Config();


  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_FSMC_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */


	_InitW5300();
  /* USER CODE END 2 */
  

	while(1)
	{
		//loopback_tcps(0, ethBuf0, 3000);
		loopback_udps(0, ethBuf0, 3000);
	}
}

 

W5300  UDP loopback 테스트 결과 10Mbps 정도 측정된다.

[1] iInChip Send: 10.2516 Mbps(12470418 bytes, 9.2807 sec)

iInChip Recv: 10.2560 Mbps(12470418 bytes, 9.2767 sec)

------------------------------------------------------------

 

 

최적화 코드를 적용하여 테스트 해 보면 14Mbps가 측정된다.  하지만 UDP일때 TCP보다 많이 느린것은 확인이 필요 할것 같다.

STM32F7 보드 내장 이더넷 컨트롤러를 이용한 UDP loopback전송 속도 테스트 결과 (33Mbps)와 비교해 봐도 많이 느리다. (STM32 내장 이더넷 컨트롤러의 경우 TCP, UDP 전송 속도는 동일 하다.)