본문 바로가기

RaspberryPi/W55RP20

[W55RP20 SSM] - UDP 전송율 테스트

 

HDMI 출력 테스트 - 실시간 화면캡쳐 후 이미지 전송 테스트에서 이미지 전송 속도를 높이기 위해 UDP로 테스트 해 볼 필요가 있을것 같아 UDP 전송율 테스트를 해 보았다.

 

UDP loopback 테스트 예제를 작성해서 W55RP20의 UDP 전송율을 확인해 보자

#define LED1_PIN            9
#define Led1Off()           gpio_put(LED1_PIN, 1);
#define Led1On()            gpio_put(LED1_PIN, 0);

#include "w5500_config_tcp.h"

#define ETHERNET_BUF_MAX_SIZE (1460)
#define DATA_BUF_SIZE		ETHERNET_BUF_MAX_SIZE
/* Socket */
#define SOCKET_LOOPBACK 0

/* Port */
#define PORT_LOOPBACK 5000

static uint8_t g_tcp_buf[ETHERNET_BUF_MAX_SIZE] = {
    0,
};

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)
            {
               ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport);

               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() {
    stdio_init_all();
	vreg_set_voltage(VREG_VSEL);
	sleep_ms(10);

	gpio_init(LED1_PIN);
	gpio_set_dir(LED1_PIN, GPIO_OUT);
	gpio_init(LED2_PIN);
	gpio_set_dir(LED2_PIN, GPIO_OUT);
	Led2On();

    while (true) {
        if(cnt++>3)break;
        gpio_put(LED1_PIN, 1);
        sleep_ms(1000);
        gpio_put(LED1_PIN, 0);
        sleep_ms(1000);
    }

	InitEthernet();

	printf("W55RP20 UDP test\n");

	while (1)
	{
		loopback_udps(0, g_tcp_buf, PORT_LOOPBACK);
    }

 

 

테스트 프로그램은 Wiznet의 AX1 프로그램을 사용 했고 기본 UDP 데이터 전송이 잘 동작하는 것을 확인 했다.

 

 

loopback 테스트로 대용량 파일을 송수신 하는 시간을 측정해 보면 5Mbps 로 측정된다.

너무 느린데...

iperf 를 이용한 W55RP20 TCP 전송률 테스트 결과와 비교해면 상당히 느린데... AX 프로그램이 이상한가?

iperf로 UDP 테스트 해 볼 필요가 있을것 같다.

반응형