ZYBO Z7 기반 ZYNQ 시작(7) Linux 환경에서 UDP 통신(사용자 응용)

  • (1) Vivado, Xilink SDK 개발 환경 구축
  • (2) Hello World 프로그램의 동작을 통해 확인
  • (3) Ubuntu, PetaLinux 도구 환경 구축
  • (4) 금속 환경을 탑재하는 lwIP를 통해 UDP 통신
  • (5) Peta Linux 도구를 사용하여 Linux 이미지 만들기
  • (6) Linux 환경에서 UDP 통신(ipperf)
  • (7) Linux 환경에서 UDP 통신(사용자 응용)
  • (8)Audio Codec
  • (9) AXI DMA를 사용한 PL-PS 간 데이터 전송
  • 컨디션

  • PC: Windows 10 64bit
  • Xilink SDK 2019.1
  • Tera Term
  • PC (Linux): Ubuntu 18.04
  • Petalinux 도구 2019.1
  • 보드: ZYBO(Z7-10)
  • 마이크로USB 케이블
  • 이더넷 케이블
  • 마이크로SD 카드(Class10,4-32GB)
  • Linux 사용자 애플리케이션을 통한 UDP 통신


    그런 다음 UDP 통신을 위해 ZYBO의 Linux에 사용자 애플리케이션을 설치합니다.
  • Ubuntu PC (Server) : 192.168.1.12
  • ZYBO (Client) : 192.168.1.10
  • Xilinx SDK를 사용하여 Linux 사용자 애플리케이션 생성


    프로젝트 작성


    PetaLinux 도구도 사용자 앱을 개발할 수 있지만 구축 후 SD카드에 쓰기 디버깅으로 바뀌기 때문에 XilinkSDK로 사용자 앱을 개발할 것이다.
    SDK의 메뉴 표시줄 -> New -> Application Project에 새 소프트웨어 프로젝트를 만듭니다.
  • Project name: udpclient
  • OS Platform: linux
  • Processor: ps7_cortexa9_0
  • Language: C
  • Templates는 Linux Hello World를 사용합니다.

    192.168.1.12의 포트 5201에 1초에 UDP 데이터(Hello World)를 보내는 프로그램(컨트롤러도 Hello World를 출력)을 위해 src/hello World.c를 다음과 같이 변경합니다.
    helloworld.c
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    
    int main()
    {
     int sock;
     struct sockaddr_in addr;
    
     sock = socket(AF_INET, SOCK_DGRAM, 0);
    
     addr.sin_family = AF_INET;
     addr.sin_port = htons(5201);
     addr.sin_addr.s_addr = inet_addr("192.168.1.12");
    
     while(1) {
      printf("Hello World\n");
      sendto(sock, "Hello World", 11, 0, (struct sockaddr *)&addr, sizeof(addr));
      usleep(1000000);
     }
    
     close(sock);
    
     return 0;
    }
    

    실행/디버깅


    이더넷 케이블로 ZYBO와 XilinkSDK 동작을 연결하는 Windows PC는 SD카드부터 Linux에서 시작하는 ZYBO의 전원을 켭니다.
    메뉴 막대->Run->Run Configuration(또는 Debug Configuration)을 엽니다.XilinxC/C+applications(System Debugger)를 두 번 클릭하면 새 System Debugger를 만들 수 있으므로 Target SetUp 탭에서 Linux Application Debug를 선택하고 New를 클릭합니다.New Target Connection은 다음과 같이 설정됩니다.
  • Target Name = udpclient
  • Type = Linux TCF Agent
  • Host = 192.168.10(ZYBO의 IP 주소)
  • Port = 1534


  • 애플 탭의 프로젝트 Name 브라우저에서udpclient를 선택하면 Path가 자동으로 설정됩니다.

    애플이 나타나면 Run을 클릭하여 ZYBO에서 프로그램을 실행합니다.또한 Windows PC 환경에서는 UDP를 수신할 수 없으므로 Wireshark를 사용하여 디버깅을 수행했습니다.

    사용자 응용 프로그램의 루트 fs 가져오기


    Xilink SDK로 제작된udpclient입니다.Elf를 Ubuntu PC의 ~/에 복사합니다.Peta Linux 도구로'udpclient'라는 앱을 만들고'udpclient'라는 소프트웨어를 만들었다.elf 파일을 복사하여 구성합니다.
    $ source /opt/pkg/petalinux/settings.sh
    $ cd ~/petalinux/project_1/
    $ petalinux-create -t apps --template install --name udpclient --enable
    $ mv ~/udpclient.elf project-spec/meta-user/recipes-apps/udpclient/files/udpclient
    $ petalinux-build
    

    SD 카드에서 실행


    SD 카드에 이미지를 인쇄합니다.ub를 복사하여 ZYBO를 시작하면udpclient 명령을 실행할 수 있습니다.

    이더넷 케이블로 ZYBO와 Ubuntu PC를 연결해 Ubuntu PC에서 UDP를 받은 뒤 데이터를 받는 프로그램(udpserver.c)을 만들어 실행한다.
    udpserver.c
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    
    int main()
    {
     int sock;
     struct sockaddr_in addr;
    
     char buf[2048];
    
     sock = socket(AF_INET, SOCK_DGRAM, 0);
    
     addr.sin_family = AF_INET;
     addr.sin_port = htons(5201);
     addr.sin_addr.s_addr = INADDR_ANY;
    
     bind(sock, (struct sockaddr *)&addr, sizeof(addr));
    
     while(1){
      memset(buf, 0, sizeof(buf));
      recv(sock, buf, sizeof(buf), 0);
      printf("%s\n", buf);
     }
    
     close(sock);
    
     return 0;
    }
    
    $ gcc udpserver.c -o udpserver
    
    ZYBO에서udpclient를 실행한 후 Ubuntu PC는 1초마다 Hello World를 수신하여 표시합니다.

    Ubuntu PC의 Wireshark도 확인할 수 있습니다.

    좋은 웹페이지 즐겨찾기