Zynq SoC Training – Embedded Operating Systems

Acknowledgement (Korean)
아래의 글은 Ali Aljaani가 운영하는 블로그인 embedded centric의 “Zynq SoC Training”을 번역한 문서입니다. 한글 번역 및 공개를 허용한 Ali Aljaani에게 감사의 말을 전합니다.

Acknowledgement (English)
This post is a translated version of “Zynq SoC training” in embedded centric. Thank you Ali Aljaani for allowing me to translate nice posts. I’m Taekyung Heo, and I translated this post into Korean.

Contact information (Author)
Ali Aljaani’s blog: http://embeddedcentric.com/
Ali Aljaani’s mail: alialjaani@embeddedcentric.com
Ali Aljaani’s LinkedIn: https://www.linkedin.com/in/ali-aljaani-a7130099
Ali Aljaani’s github: https://github.com/ama142


이번 실습에서는 임베디드 운영체제 시스템을 사용하는 것의 장점에 대해 학습할 것이다. PetaLinux를 중심으로 기본적인 리눅스 커널 아키텍쳐 및 컴포넌트에 대한 내용을 다룰 것이다. 리눅스 시스템을 설정하고, 빌드해, ARM Cortex-A9을 사용하는 ZedBoard에서 부팅할 것이다. 그 다음에는 일반적인 리눅스 명령어와 어플리케이션을 실행해 테스트해 볼 것이다. 툴체인(설정 도구, BSP, 컴파일러, 어셈블러, 링커, 디버거, 에뮬레이터) 또한 이번 실습에서 다룰 것이다.
lab10-design-flow3


Lab10 Design Flow

lab10-block-diagram


Lab10 Block Diagram

zedboard-board-interface1


Lab10 Board Interface

리눅스 커널을 크로스 컴파일하는 과정(컴파일러를 타겟 시스템이 아닌 호스트에서 실행하는 것)은 어려운 작업이다. 필요한 라이브러리가 없거나, 환경 변수를 잘못 설정하는 경우에 컴파일에 실패하기 때문이다. 따라서 호스트 머신에서는 크로스 컴파일에 필요한 것들을 잘 준비해야 한다. 필자는 64bit Ubuntu-14.04 워크스테이션을 호스트 시스템으로 사용한다. 이 호스트 머신을 사용해 크로스 컴파일하고, PetaLinux 리눅스 이미지를 빌드해 타겟 시스템인 ZedBoard에 다운로드한다.

Zynq 칩에 사용할 수 있는 리눅스 커널에는 다양한 종류가 있다. Open Source Linux(OSL), Yocto, Arch Linux, 그리고 PetaLinux를 사용할 수 있다. 이번 실습에서는 PetaLinux를 사용할 것이다. 왜 PetaLinux를 사용하는가? PetaLinux는 문서화가 잘 되어있고, 테스팅이 잘 되었으며, 게다가 Xilinx에서 충분한 도구를 제공한다. 이러한 도구들은 추가 비용 없이 즉시 사용할 수 있다. 마지막으로 커뮤니티 활성화가 잘 되어 있다는 장점이 있다.

이번 실습에 필요한 하드웨어 설정은 Avnet의 ZedBoard의 레퍼런스 BSP를 사용한다(이에 대해서는 다음 섹션에서 더 자세히 설명할 것이다). PS에서 사용할 수 있는 하드웨어 컴포넌트의 일부는 선택적으로 비활성화 할 수 있다(USB와 같은 것). Zynq 시스템에 PetaLinux를 실행하기 위한 최소한의 하드웨어 컴포넌트 요구사항은 다음과 같다:

  • External memory (>32MB).
  • Interrupt controller.
  • Triple timer count(TTC).
  • Shell access(UART or Ethernet).

배경 지식
A. 운영체제
일반적으로, 운영체제는 여러 개의 어플리케이션을 동시에 안전하고 효율적으로 실행하고자 사용된다. 멀티태스킹과 추상화를 지원한다. 운영체제가 제공하는 추상화에는 다음과 같은 것이 있다: 파일 시스템, 가상 메모리, 네트워킹, 하드웨어 장치, 인터럽트 핸들링. 운영체제는 저수준 하드웨어의 복잡성을 추상화해주어, 설계자들이 시간을 절약할 수 있도록 해준다.

operating-systems-abstraction


Operating Systems Abstraction

운영체제는 하드웨어의 복잡성을 숨겨주고, 어플리케이션이 하드웨어를 알지 않고도(X86, ARM, PowerPC, MicroBlaze 등) 하드웨어와 상호작용할 수 있는 표준 인터페이스(API)를 제공한다. 이러한 기능 덕분에 어플리케이션은 다른 플랫폼에 쉽게 이식 가능하다. 예를 들어, 리눅스 데스크탑에서 실행되도록 만들어진 어플리케이션이 임베디드 리눅스 시스템에서도 약간의 수정만으로 실행 가능하다. 잘 알려진 운영체제에는 리눅스, 안드로이드, 윈도우, 맥 OS X 등이 있다.

B. 임베디드 운영체제
임베디드 운영체제는 제한된 하드웨어 자원을 가진 플랫폼에서 실행되도록 설계된 운영체제이다 (적은 메모리, 저전력, 제약된 연산 능력 등). 임베디드 운영체제도 역시 기본적인 서비스를 제공한다는 점, 이식성과 추상화 수준이 높다는 점에서 일반적인 운영체제와 크게 다르지 않다.

언제 임베디드 운영체제가 필요한가? 이 질문은 임베디드 시스템의 요구사항과 밀접하게 연관되어 있다. 일반적으로, 임베디드 운영체제는 임베디드 시스템이 고수준의 복잡성을 필요로 하거나, 멀티태스킹, 네트워킹, 이식성 또는 확장성이 중요할 때 사용된다. 다음 예제들은 임베디드 운영체제 시스템이 적합한 사례이다.

1. 여러 개의 어플리케이션이 임베디드 시스템에서 동시에 실행되어야 할 때.
2. 임베디드 시스템이 반드시 네트워크와 파일 시스템을 가져야 할 때.
3. 임베디드 시스템 개발에 필요한 표준 도구들이 반드시 사용되어야 할 때.
4. 어플리케이션이 일반적인 데스크탑 시스템에서 쉽게 에뮬레이션되고, 임베디드 시스템으로 쉽게 포팅 가능할 때.
5. 임베디드 시스템의 확장성이 중요할 때(미래에 복잡성이 높아질 것으로 기대될 때).

위에 나열한 예제들이 임베디드 운영체제가 도움이 되는 경우이다. 하지만 그렇다고 해서, 위 예제들이 단일 시스템(운영체제가 없는 bare-metal 시스템)으로 구현될 수 없다는 것을 의미하는 것은 아니다. 단일 시스템으로 구현될 수도 있지만, 그런 경우에는 복잡도가 매우 높아지고, 개발 시간 또한 실현 불가능할 수준으로 길어질 것이다. 임베디드 운영체제에는 다양한 종류가 있고, 그 중에 하나인 PetaLinux를 이번 실습에서 사용한다.

C. PetaLinux
PetaLinux는 리눅스 커널,커널 설정, Xilinx 장치 지원 도구를 함께 제공한다(Zynq SoC, MicroBlaze 소프트 프로세서 등). Xilinx 장치에서 지원하는 다른 리눅스 임베디드 운영체제(Open Source Linux(OSL), Yocto 등)에 비교하면 훨씬 안정적이고, 테스팅이 잘 되어있으며, 문서화도 잘 되어있다. 이러한 이유 때문에 Xilinx에서 PetaLinux를 자사를 위한 임베디드 운영체제로 추천한다. PetaLinux 패키지(SDK: Software Development Kit)에서는 다음과 같은 것을 제공한다.


1. Linux kernel.
2. Demo Applications.
3. Configuration tools.
4. Board support package.

각각의 컴포넌트는 다음 문단에서 설명한다.

anotomy-of-a-linux-system


PetaLinux System Anatomy

1. Kernel: 리눅스 운영체제에서 가장 중요한 핵심 컴포넌트이다. 운영체제의 핵심 기능이 구현되어 있다. 리눅스 커널은 monolithic modular 커널이다. Monolithic: 전체 운영체제가 특권 권한을 가지며, 하드웨어에 대한 모든 권한을 가짐을 의미한다. 반면에 사용자 어플리케이션은 유저 스페이스(사용자 모드, 제한된 모드)에 있으며, 하드웨어를 시스템 콜 인터페이스 (SCI)를 사용해서만 제어할 수 있다. 이러한 분리된 공간(유저 스페이스와 커널 스페이스)은 실제로는 메인 메모리의 영역에 해당한다. 운영체제의 코드를 사용자에로부터 분리하는 것은 시스템을 더욱 안정적으로 만든다. Modular: 리눅스 커널에서 각 작업들은 해당 작업을 맡은 객체(컴포넌트)에 의해 다뤄진다. 이들 컴포넌트는 다음과 같이 구성되며, 각각은 다음 문단에서 더 자세히 설명한다.

petalinux-kernel-components


PetaLinux Kernel Components

I.System Call Interface : 유저 스페이스와 커널 스페이스 사이에 있는 인터페이스 API (Application Programming Interface)이다. 표준 C 라이브러리와 사용자 어플리케이션 모두 시스템 콜을 사용해 운영체제와 통신한다. 시스템 콜은 운영체제에 의해 제공되는 서비스이다. 이는 어플리케이션이 하드웨어와 통신할 수 있는 유일한 통로이다. Monolithic 리눅스 시스템에서 어플리케이션이 하드웨어에 접근할 수 있는 다른 방법은 없다.

II.Process Management : 멀티태스킹 기능을 제공하는 것은 운영체제의 역할이다. 리눅스 시스템에서 사용자 어플리케이션은 프로세스라고 불린다. 이 컴포넌트는 각각의 프로세스가 자신에게 할당된 만큼의 CPU를 사용하는 것을 강제하며, 시스템이 멈추지 않고 잘 돌아가도록 제어한다. 이는 계속해서 프로세스를 swap in/out하며 동시에 여러 어플리케이션이 실행되는 것처럼 보이도록 한다.

III.Memory Management : 물리 주소와 가상 주소 모두를 관리하며, 물리적인 메모리를 공평하게 할당하며 보호 기법을 제공한다. 가상 메모리는 실제 메모리가 가진 메모리보다 더 큰 메모리를 가진 것처럼 보이게 한다.

IV.Virtual File System : 저수준의 API와 디스크 입출력을 다루며, 유연하고 사용자 친화적인 파일 시스템을 제공한다.

V.Network Stack : 어플리케이션이 네트워크와 인터넷을 접근할 수 있도록 한다. 시스템 콜 인터페이스를 사용해 어플리케이션이 네트워크 통신을 요청하면, 네트워크 스택이 이 요청을 받아 장치 드라이버와 통신하도록 한다 (이더넷 컨트롤러, 와이파이 등). 일반적으로 사용되는 통신 프로토콜은 TCP/IP와 UDP이다.

VI.Device Drivers : Xilinx IP 코어에서 사용되는 장치 드라이버, 그리고 키보드, 마우스, USB 저장 장치 등을 위한 장치 드라이버

VII.Architecture-dependent code : 운영체제와 하드웨어의 상호작용,. 그리고 어셈블리어 변환이 여기서 이뤄진다. 커널에서 이 부분은 하드웨어 종속적이다 (다른 플랫폼과 Zynq 플랫폼에서의 구현이 다르다). 이 부분이 하드웨어 종속적인 이유는, 임베디드 시스템마다 하드웨어 레이아웃이 다르고, 프로세서의 명령 집합이 다르기 때문이다. 예를 들어, C code를 어셈블리어로 변환한다고 할 때 ARM 명령어를 사용해 변환했을 때와 MicroBlaze 명령어를 사용해 변환했을 때가 다르다.

2. Demo Applications: PetaLinux 패키지는 다섯 개의 데모 어플리케이션을 포함하고 있으며, 이는 시스템과 쉽게 통합될 수 있고 테스트벤치 또는 템플릿으로 사용될 수도 있다. 다섯 개의 어플리케이션은 fwupgrade, gpio-demo, latencystat, peekpoke, 그리고 uWeb이다.

demo-applications-petalinux


Demo Applications in PetaLinux Package(menuconfig rootfs)

이번 실습에서는 gpio-demo 어플리케이션을 사용해 ZedBoard에 달린 스위치, LED, 푸쉬 버튼을 PetaLinux 쉘로 제어한다. 다른 데모 어플리케이션과 사용자 어플리케이션 개발 환경은 다음 실습에서 충분히 깊이있게 다룰 것이다.

3. Configuration tools: 사용자 친화적인 명령 도구를 사용해 다음과 같은 것을 커스터마이즈하고 설정할 수 있다: 부트 로드(커널을 메모리에 올리고, 전원을 켜는 역할), 리눅스 커널, 파일 시스템, 라이브러리, 어플리케이션과 그 외 시스템 변수 등. 이들 설정 도구들은 Xilinx 개발 도구(Vivado, SDK,….)와 하드웨어 종속적인 데이터 파일을 인지하고 있다. 예를 들어, Xilinx 임베디드 IP 코어를 위한 디바이스 드라이버는 자동으로 빌드될 것이다. 이러한 도구들은 PetaLinux 패키지를 다운로드하고 설치한 이후 명령창에서 실행될 수 있다. 사용 가능한 도구의 목록은 다음과 같다.

petalinux-configuration-tools1


PetaLinux Configuration Tools

QEMU 시스템 에뮬레이션 환경 또한 설정 도구의 일부이다. 이를 사용해 ARM Cortex-A9 MPcore 시스템을 호스트에서 에뮬레이션할 수 있다. QEMU(Quick Emulator의 약자)는 PetaLinux 설정 도구에 통합된 오픈 소스 머신 에뮬레이터이다. 생성된 PetaLinux 이미지는 호스트 시스템의 QEMU(petalinux-boot-qemu)를 사용해 테스팅하고 디버깅할 수 있다. QEMU는 크로스 플랫폼 개발에서 걸리는 컴파일, 테스팅, 디버깅 시간을 크게 줄일 수 있다. 설정 도구를 사용하는 더 자세한 방법에 대한 내용은 실습 단계 섹션에서 실제 예제와 함께 살펴볼 수 있다.

4. Board Support Packages : PetaLinux BSP는 레퍼런스 디자인이며, 이로부터 시작해 목표하는 개발 도구에 맞게 빠르게 개발할 수 있다 (2015년 9월 현재 Xilinx에서 공식적으로 지원하는 보드는 ZedBoard, AC701, KC705, ZC702, ZC706이다). 레퍼런스 디자인은 새롭게 프로젝트를 만들 때 좋은 시작 지점이 된다. PetaLinux BSP는 설치 가능한 BSP 파일의 형태로 제공되며, 필요한 디자인과 설정 파일을 모두 포함하고 있다. 하드웨어 디자인(Vivado 프로젝트)와 소프트웨어 디자인(SDK 프로젝트)는 BSP 패키지에 포함되어 있으며, 디자인 요구사항에 맞추어 수정할 수 있다. BSP를 사용하면 리눅스 시스템과 더 빠르게 통합할 수 있다. 이는 엔지니어들로 하여금 저수준의 설정 작업이 아닌 실제 문제 해결을 위한 어플리케이션에 집중할 수 있도록 해준다. Xilinx와 개발 보드 생산자들이 BSP를 제공한다. 이는 Xilinx 웹사이트의 다운로드 페이지에서 확인할 수 있다. 이번 실습에서는 ZedBoard의 BSP를 사용한다.

목표
1. 임베디드 운영체제가 필요한 상황을 안다.
2. 임베디드 운영체제가 제공하는 서비스, 추상 계층, 그리고 이식성에 대해 이해한다.
3. 리눅스 커널 아키텍쳐 및 그 내부 컴포넌트와 역할에 대해 이해한다.
4. ZedBoard를 타겟으로 해 크로스 커널 컴파일을 할 수 있는 호스트 개발 워크스테이션을 준비한다.
5. PetaLinux 설정 도구를 이해한다. PetaLinux 설정 도구를 사용해 시스템, 리눅스 커널, 루트 파일 시스템, 디바이스 드라이버 그리고 시스템 설정을 할 수 있다.
6. ZedBoard를 위한 Board Support Package(BSP) 템플릿을 중심으로 기능을 추가한다.
7. PetaLinux를 컴파일, 빌드한 뒤, ZedBoard에 다운로드하고 부팅한다.
8. ZedBoard에서 기본적인 리눅스 명령어와 데모 리눅스 어플리케이션을 실행한다.

실습 단계 (호스트 워크스테이션: 64-bit Ubuntu 14.04를 실행)
A. PetaLInux Installer와 ZedBoard BSP를 다운로드
1. PetaLinux installer와 ZedBoard PetaLinux BSP를 Xilinx 웹사이트에서 다운로드한다(링크). 이 파일들을 다운받기 위해서는 Xilinx 회원으로 가입되어 있어야 한다.

download-petalinux-installer


Download PetaLinux Installer and Zedboard BSP

다운로드에 걸리는 시간은 인터넷 속도에 따라 달라질 수 있다. 다운로드가 완료된 이후에 Downloads 폴더에 있는 두 개의 파일을 확인할 수 있을 것이다.

petalinux-and-bsp-download-complete


PetaLinux and BSP download complete

2. /opt 디렉토리 아래에 폴더를 생성한다. /opt 디렉토리는 추가적인 어플리케이션 또는 패키지가 저장되는 일반적인 위치이다(opt는 opttional의 약자이다). 생성한 디렉토리의 이름을 embeddedcentric으로 지정한다. PetaLinux 설정 도구, BSP, 커널 소스 그리고 ZedBoard용 PetaLinux 이미지를 이 폴더에 저장할 것이다. 폴더를 생성할 때 데스크탑 환경을 사용해도 되고, 명령어를 사용해도 된다. /opt 디렉토리에 폴더를 생성하기 위해서는 루트 권한(관리자 권한)을 가져야 한다. root(관리자)로 로그인하지 않았다면, shell은 비밀번호를 확인할 것이다. 또는 필요하다면 브라우저에서 Ctrl+C, Ctrl+V로 다음의 명령어를 복사해 붙여넣어도 된다.

sudo mkdir /opt/embeddedcentric
mkdir_embeddedcentric


Create folder embeddedcentric in /opt directory

3. petalinux-v2015.2.1-final-installer.runAvnet-Digilent-ZedBoard-v2015.2.1-final.bsp를 복사해서 /opt/embeddedcentric으로 붙여넣는다. 복사할 때에는 그래픽 인터페이스 또는 명령창 중에 편한 것으로 하면 된다. 필요하다면 아래에 있는 명령어를 사용하면 된다. 마찬가지로, 루트로 로그인하지 않았다면 shell은 비밀번호를 물어볼 것이다.

sudo cp /home/$USER/Downloads/{Avnet-Digilent-ZedBoard-v2015.2.1-final.bsp,petalinux-v2015.2.1-final-installer.run} /opt/embeddedcentric/
copy-two-files


Copy files to opt/embeddedcentric

복사하는데 약간의 시간이 걸릴 것이다.

B. PetaLinux의 크로스 컴파일을 위한 호스트 워크스테이션 준비하기
1. ubuntu.com에서 현재 사용 중인 패키지의 최신 버전을 다운받아 설치한다. 다음 명령어로 이를 수행할 수 있다.

sudo apt-get update
apt-get-update


Install the newest versions of all packages currently installed on workstation

다운로드하고 설치하는 것에 약간의 시간이 걸릴 것이다. 중단하지 않고 기다리길 바란다.

2. 모든 필요한 라이브러리를 다운받아 설치한다. PetaLinux는 많은 수의 표준 개발 도구와 라이브러리를 필요로 한다. PetaLinux 설치 과정에서 이러한 도구와 라이브러리가 모두 준비되었는지 확인하며, 설치되지 않은 것이 있으면 오류를 출력한다. 하지만 이 과정에서 설치를 시도하지 않으므로, 반드시 수동으로 설치해야 한다. 64-bit 리눅스 호스트라면, 32-bit 호환 가능한 라이브러리를 설치해야 한다. 다음과 같은 라이브러리가 필요하다: tofrodos iproute tftpd-hpa gawk gcc git-core make net-tools libncurses5-dev zlib1g-dev libssl-dev flex bison lib32z1 lib32ncurses5 lib32bz2-1.0 lib32stdc++6 libselinux1. 다음 명령어를 사용해 필요한 패키지들을 설치할 수 있다. 이미 설치된 것이 있더라도, 자동으로 건너뛸 것이므로 문제되지 않는다.

sudo apt-get install tofrodos iproute tftpd-hpa gawk gcc git-core make net-tools libncurses5-dev zlib1g-dev libssl-dev flex bison lib32z1 lib32ncurses5 lib32bz2-1.0 lib32stdc++6 libselinux1
install-libraries


Install prerequisite libraries and tools on host workstation

도구와 라이브러리 설치를 진행할 것인지 확인하는 메시지가 뜰 것이며, y를 누르고 엔터를 치면 된다.

confirm-installation1


Confirm Installation of libraries

다운로드와 설치에 약간의 시간이 걸릴 것이다. 다운로드와 설치가 모두 완료되면, 다음과 같은 메시지를 볼 수 있을 것이다.

successful-installation-of-libraries


Successful installation of libraries on the host workstation

이로써 호스트 워크스테이션에서 PetaLinux 크로스 컴파일하기 위한 모든 라이브러리와 도구 (패키지)를 설치했다.

3. 호스트 워크스테이션의 기본 shell을 bash로 변경한다. Ubuntu의 기본 shell은 dash이다. 하지만 PetaLinux 도구들은 대부분 bash에 맞추어 설정되어 있다. 따라서 shell을 bash로 변경하는 것이 불필요한 오류를 방지하는데 좋다. 기본 shell의 변경에는 다음 명령어를 사용하면 된다.

sudo dpkg-reconfigure dash
change-default-shell


Change default shell to bash

다음 창에서 NO를 선택하고, 엔터를 친다.

change-shell_select_no


Select No in the configure dash window

이제 기본 shell이 bash로 변경되었다. 이제 호스트 워크스테이션이 PetaLinux의 크로스 컴파일을 위한 준비를 마쳤다.

4. GtkTerm 직렬 포트 터미널을 다운로드하고 설정한다. GtkTerm 어플리케이션은 호스트 워크스테이션이 ZedBoard에 접속하기 위해 필요하다. 이 터미널을 사용해 ARM Cortex-A9에서 실행 중인 PetaLinux shell에 접속하고, 명령어와 어플리케이션을 실행할 수 있다. GtkTerm을 사용해 ZedBoard에서 실행 중인 PetaLinux 커널을 제어할 수 있다.

다음 명령어를 입력하고, 루트 비밀번호를 입력해 GtkTerm을 다운로드하고 설치한다:

sudo apt-get install gtkterm

성공적으로 설치되면 다음과 같은 메시지를 볼 수 있을 것이다.

successful-gtkterm-install


Successful GtkTerm Serial Port Terminal installation

GtkTermgtkterm을 명령창에 입력함으로써 실행할 수 있다. 이는 어플리케이션을 위한 설정 파일을 생성하기 위해 필요하다. 설정 파일은 GtkTerm의 첫 번째 실행에서 자동으로 생성된다.

gtkterm

두 개의 메시지가 발생할 것이다. 첫 번째 메시지는 .gtktermrc 설정 파일이 생성되었다는 것이고, 두 번째 메시지는 /dev/ttyS0를 열지 못한다는 메시지이다. 두 개 메시지 모두 무시하고 GtkTerm을 닫는다.

다음 단계는 GtkTerm 직렬 포트를 ZedBoard에 맞게 설정하는 것이다. 리눅스 시스템에서 설정 파일(커널, 하드웨어, 라이브러리, 어플리케이션 등)은 모두 텍스트 파일에 저장되어 있다. 설정을 변경하기 위해서는 단순히 설정 파일의 내용을 변경하면 된다. 마이크로소프트 윈도우 환경 사용자에게는 익숙하지 않겠지만, 리눅스에서는 이와 같이 설정을 변경할 수 있다.

Ubuntu의 기본 텍스트 에디터인 gedit을 사용해 GtkTerm 어플리케이션의 설정 파일 .gtktermrc을 수정한다. 다음 명령어를 입력한다.

gedit .gtktermrc

gedit.gtktermrc을 열어 보여줄 것이다.

configure-gtkterm


Open configuration file for GtkTerm

위 캡쳐 화면을 보면 알 수 있듯이, .gtktermrc 파일은 GtkTerm 어플리케이션이 접근하는 직렬 포트에 대한 설정을 담고 있다. portspeed를 제외한 모든 설정은 그대로 둔다. speed 값을 115200으로, port 값을 /dev/ttyACM0으로 변경하여 ZedBoard에 접속 가능하도록 한다. 변경한 값을 저장하고 종료한다. GtkTerm은 이제 ZedBoard과 통신할 수 있다.

configure-gtkterm1


Configure GtkTerm

C. PetaLinux Installer 실행
PetaLinux installer를 실행해 PetaLinux 커널의 소스 코드와 툴체인(설정 도구, 디버거, 에뮬레이터 등)을 추출한다. Shell에서 디렉토리를 /opt/embeddedcentric으로 변경한다.

 cd /opt/embeddedcentric/

그리고 다음과 같이 입력한다:

 sudo chmod 777 petalinux-v2015.2.1-final-installer.run

위의 명령은 petalinux-v2015.2.1-final-installer.run 파일에 실행 권한을 부여한다. 그 이후, 다음과 같이 입력해 installer를 실행한다:

sudo ./petalinux-v2015.2.1-final-installer.run

Installer는 무결성 검증을 한 뒤에, 설치를 진행할지 확인할 것이다. y를 입력하고 엔터를 치면 현재 디렉토리에 압축 해제를 진행한다.

lunch-installer


Launch PetaLinux Installer

Installer는 서비스와 라이선스에 대한 메시지를 출력한다. “Press Enter to display the license agreements” 메시지가 발생하면 엔터를 친다. 이 라이선스 파일을 원하면 열어서 읽을 수 있으며, ‘q’를 입력해 문서에서 나간 뒤 설치를 진행할 수 있다. 이후 “Do you accept Xilinx End User License Agreement? [y/N] >” 메시지가 뜬다. ‘y’를 입력하고 엔터를 친다. Webtalk 이용 조건에 대한 문서가 뜰 것이다. ‘q’를 입력해 문서에서 나온 뒤, ‘y’를 눌러 “Do you accept Webtalk Terms and Conditions? [y/N] >” 메시지에 응답한다. 같은 방식으로 “Do you accept Third Party End User License Agreement? [y/N] >” 메시지에 응답한다. 설치 과정에는 약간의 시간이 걸린다. 성공적으로 설치되면 다음과 같은 화면을 볼 수 있을 것이다.

successful-installation


Successful PetaLinux Package Installation

D. PetaLinux 작업 환경 설치
이번 단계에서는 환경 변수를 설정하고 PetaLinux 도구에 대한 경로를 설정할 것이다. Bash 스크립트인 settings.sh이 이 작업을 해 줄 것이다.

디렉토리 위치를 installer가 파일 압축을 해제한 곳으로 변경한다.

cd /opt/embeddedcentric/petalinux-v2015.2.1-final

다음 명령어를 입력해 루트로 로그인한다.

sudo su

chmod 명령어를 사용해 settings.sh 파일을 실행 가능하도록 권한 변경한다.

chmod 777 ./settings.sh

source 명령어를 사용하여 settings.sh bash script를 실행한다 (중요: 이 단계는 반드시 매 개발 세션마다 반복되어야 한다.)

source ./settings.sh

성공적으로 실행되면 다음과 같은 메시지를 볼 수 있을 것이다.

successful-scriptpng


Successful execution of script settings.sh


이로써 PetaLinux 설정 도구를 사용할 수 있게 되었다.

E. PetaLinux 프로젝트 생성
이번 실습에서 petalinux-create 도구를 사용해 PetaLinux 프로젝트를 생성한다. 이 도구는 PetaLinux 프로젝트를 생성하는 것에 사용될 수도 있고 (-t project), 주어진 PetaLinux 프로젝트의 다양한 사용자 컴포넌트(어플리케이션, 라이브러리, 커널 모듈 등)를 생성하는데 사용될 수도 있다 (-t COMPONENT). 다음 표는 petalinux-create 도구에 사용할 수 있는 파라미터를 보여준다.

petalinux-create_options


petalinux-create options

루트로 로그인되어 있어야 하며(커서 좌측에 #이 보여야 한다), 그렇지 않다면 sudo su 명령어를 사용해 루트로 로그인한다.

1. PetaLinux 프로젝트에 사용할 새로운 폴더 zedboard를 생성한다.

mkdir /opt/embeddedcentric/zedboard

2. 새롭게 생성한 폴더로 이동한다.

cd /opt/embeddedcentric/zedboard/

3. 앞서 Xilinx.com에서 다운로드한 ZedBoard Board Support Package(BSP)에 기반하여 새로운 PetaLinux 프로젝트를 생성한다.

petalinux-create -t project -s /opt/embeddedcentric/Avnet-Digilent-ZedBoard-v2015.2.1-final.bsp

성공적으로 실행되면, 다음과 같은 화면을 확인할 수 있을 것이다.

petalinux-project


PetaLinux project based on Zedboard BSP

이로써 ZedBoard를 위한 PetaLinux 프로젝트가 /opt/embeddedcentric/zedboard에 생성되었다.

이제 Ubuntu Unity (마이크로소프트 윈도우 사용자에게는 탐색기와 같은 것)를 사용하여, 앞서 생성한 PetaLinux 프로젝트와 ZedBoard BSP를 열어본다.

petalinuxprojectdirectory


PetaLinux Project Directory

폴더에 있는 파일과 그 역할은 다음 표와 같다.

petalinux-project-directory-structure-using-bsp


PetaLinux Project Directory Structure -(Using BSP)

BSP를 사용하지 않으면, PetaLinux 프로젝트를 생성한 다음에 할 것은 커널을 설정하는 것이다 (petalinux-confic -c kernel). 하지만 이번 실습에서는 BSP를 사용하고 있으므로, 커널 설정은 이미 되어있다.

F. 루트 파일시스템 설정
이번 단계에서는 루트 파일시스템의 설정 메뉴(menuconfig)를 사용한다. 루트 파일시스템의 menuconfig는 파일시스템의 컴포넌트를 설정하는 것에 사용된다 (shell, 네트워크 스택, openssh, 유틸리티 도구, 로딩 가능한 모듈, 라이브러리 그리고 어플리케이션 등). 우리는 gpio-demo 어플리케이션을 포함시키기 위해 사용할 것이다. gpio-demo 어플리케이션은 스위치, LED, 푸쉬 버튼을 통신하게 해 준다.

1. 루트로 로그인한 상태이어야 한다 (커서 좌측에 #이 보여야 한다. 그렇지 않다면 sudo su 명령어를 사용하여 루트로 로그인한다). PetaLinux 도구들은 현재 세션에서 source되어 있어야 한다(echo $PETALINUX 명령어를 사용하여 제대로 설정되어 있는지 확인할 수 있다. 제대로 설정되어 있다면 다음과 같은 화면을 볼 수 있어야 한다. 그렇지 않다면 실습 과정 D를 다시 하면 된다).

rootandsourced1


Verify you have root access and PetaLinux tools are sourced in the session

2. PetaLinux 디렉토리로 이동한다.

cd /opt/embeddedcentric/zedboard/Avnet-Digilent-ZedBoard-2015.2/

3. 루트 파일시스템의 menuconfig를 다음 명령어를 사용해 실행한다.

petalinux-config -c rootfs
petalinuxrootfs


Launch menuconfig of root filesystem

4. 아래 방향 화살표 키를 사용하여 Apps로 이동한 다음에 엔터를 친다. ‘y’ 키를 사용하여 gpio-demo 어플리케이션을 루트 파일시스템에 추가한다. 우측 화살표 키를 사용하여 Save를 선택한 뒤 엔터를 세 번 입력해 현재 설정을 저장한다. 마지막으로 Exit을 선택한 다음에 menuconfig을 종료해 명령창으로 돌아온다.

rootfs-menuconfig1


rootfs menuconfig – Navigate to Apps

enable-gpio-demo


rootfs menuconfig – Enable gpio-demo application

confirm-save-configuration


rootfs menuconfig -Confirm new configuration

G. PetaLinux 이미지 빌드
리눅스 커널 설정은 BSP에 의해 이미 설정되었으므로, PetaLinux 이미지 빌드를 즉시 진행할 수 있다.

1. PetaLinux 프로젝트 디렉토리로 이동한다.

cd /opt/embeddedcentric/zedboard/Avnet-Digilent-ZedBoard-2015.2/

2. petalinux-build 명령어를 입력하여 크로스 컴파일 과정을 진행한다.

petalinux-build
petalinux-build


Generate PetaLinux images using petalinux-build

크로스 컴파일 과정에는 시간이 걸릴 것이다. 성공적으로 크로스 컴파일이 완료되면 다음과 같은 화면을 볼 수 있다.

successful-cross-compilation


Successful PetaLinux Cross-Compilation

생성된 파일은 /opt/embeddedcentric/zedboard/Avnet-Digilent-ZedBoard-2015.2/images/linux/에 저장되어 있다.

generated-images


Generated PetaLinux files

파일들은 다음과 같다:

generated-petalinux-files-description


Generated PetaLinux files descriptions

이 파일들은 PetaLinux를 ZedBoard에서 다른 방식으로 부팅할 때 사용된다 (JTAG, Ethernet, QSPI Flash, 그리고 SD Card). 다음 과정에서는 PetaLinux를 SD card로 부팅하는 방법에 대해 설명한다.

H. 바이너리 패키지 생성 (BOOT.BIN)

이번 실습에서 우리는 PetaLinux를 SD card에 담아 부팅할 것이다. 부팅 가능한 파일을 SD card에 직접 복사해 넣을 것이고, 해당 파일을 이 단계에서 생성할 것이다. 설정 도구인 petalinux-package를 사용하면 세 개의 파일 (download.bit, zynq_fsbl.elf, u-boot.elf)을 한 개의 파일 BOOT.BIN으로 합칠 수 있다(바이너리 패키지 파일). (중요: petalinux-package은 Xilinx SDK에서 제공되는 bootgen 도구의 wrapper이다. 따라서 Xilinx SDK가 반드시 설치되어 있어야 petalinux-package를 사용할 수 있다.)

download.bit은 칩의 PL-side에 필요한 비트스트림 파일이다.

zynq_fsbl.elf는 PS-side에 필요한 first stage boot loader(FSBL)이다. 이는 PS에 있는 컴포넌트들을 설정하고, u-boot를 로딩하는 것에도 필요하다.

u-boot.elf는 리눅스 커널 이미지(image.ud)를 로딩하는 것에 사용되는 유니버셜 부트 로더이다. PetaLinux 프로젝트 디렉토리에서 다음 명령어를 사용해 바이너리 패키지인 BOOT.BIN을 생성할 수 있다.

petalinux-package --boot --format BIN --force --fsbl /opt/embeddedcentric/zedboard/Avnet-Digilent-ZedBoard-2015.2/images/linux/zynq_fsbl.elf --fpga /opt/embeddedcentric/zedboard/Avnet-Digilent-ZedBoard-2015.2/images/linux/download.bit --uboot
pettalinux-package


Generate BOOT.BIN (Deployment Binary Package)

성공적으로 실행되면, BOOT.BIN이 PetaLinux 프로젝트 디렉토리에 생성될 것이다.

bootbin


BOOT.BIN deployment package

I. BOOT.BIN과 리눅스 커널 이미지(image.ud)를 SD card에 복사
이 단계에서는 SD card 리더기가 필요하다 (워크스테이션에 built-in되어 있지 않다면).

sd-card-reader


SD card reader

1. u-boot 포맷으로 되어있는 리눅스 커널 이미지(image.ud)를 /opt/embeddedcentric/zedboard/Avnet-Digilent-ZedBoard-2015.2/images/linux/에서 SD card로 복사한다.

copy-imageub


Copy image.ub

2. 바이너리 패키지 (BOOT.BIN)를 /opt/embeddedcentric/zedboard/Avnet-Digilent-ZedBoard-2015.2/에서 SD card로 복사한다.

copy-bootbin


Copy BOOT.BIN

3. SD card를 제거한다.

ejectsdcard


Eject SD card

이제 SD card를 사용해 ZedBoard에서 PetaLinux를 부팅할 수 있다.

J. ZedBoard를 설정하고 SD card를 사용해 부팅
1. SD card를 사용해 부팅할 수 있도록 ZedBoard의 부팅 설정을 변경한다. 아래 사진과 같이 JP9(MIO[4])와 JP10(MIO[5]) 점퍼를 logic high(3.3V)로 변경함으로써 부팅 설정을 변경할 수 있다.

bootup-jumpers-jp9-mio4-and-jp10-mio5-are-set-to-high1


Boot-up from SD card- Jumpers JP9 (MIO[4]) and JP10 (MIO[5]) are set to High.

zedboard-configuration-modes


ZedBoard Configuration Modes

2. 바이너리 패키지와 리눅스 커널 이미지를 담고 있는 SD card를 ZedBoard에 삽입한다.

insert-sd-card


Insert SD Card

3. 워크스테이션의 USB 포트와 ZedBoard의 UART-USB를 USB 케이블로 연결한다.

connect-serial-cable


Connect Serial Cable

4. ZedBoard의 전원을 켠다.

K. GtkTerm 직렬 포트 터미널 열기
1. 다음 명령어를 사용해 ttyACM0 포트를 읽기와 쓰기 가능하도록 권한을 변경한다.

sudo chmod 666 /dev/ttyACM0
make-device-file-readable_writable


Make device file ttyACM0 readable/writable

2. gtkterm을 입력해 GtkTerm을 실행한다.

launch-gtkterm


Launch GtkTerm

위 캡쳐에 있는 좌측 아래에 보이는 설정과 같아야 한다. 그렇지 않다면 GtkTerm이 ZedBoard 포트 설정과 맞도록 재설정해야 한다 (실습 단계 B4를 보라).

이제 우리는 PetaLinux shell에 접근할 수 있다. 하지만 까만 화면밖에 보이지 않는데, 이는 부팅 과정을 진행하지 않았기 때문이다.

3. PS-RST 버튼을 눌러 PetaLinux 재부팅을 진행할 수 있다. 버튼을 누르면 부팅 과정이 진행되는 것을 확인할 수 있다.

ps-rst-button-e1442212280618


PS-RST Button

이제 PetaLinux의 부팅 과정이 GtkTerm에 보일 것이다.

petalinux_reboot


PetaLinux Reboot

U-boot가 리눅스 커널을 부팅하고 리눅스 시스템의 컴포넌트를 로딩하는 동안 아무 키도 입력하지 않아야 한다. 로그인 창이 뜨면 다음과 같이 기본 암호를 입력한다.

Avnet-Digilent-ZedBoard-2015_2 login: root
Password: root
enterusernameandpassword


Enter root as username and password

이로써 PetaLinux의 shell에 로그인했다. 이제부터 이 shell을 사용할 것이다. ZedBoard의 shell은 항상 상단 타이틀 바에 GtkTerm이라고 보인다.

L. PetaLinux를 사용해 작업하기
Shell은 PetaLinux와 그 서비스를 사용할 수 있는 강력한 텍스트 기반의 인터페이스를 제공한다. PetaLinux에서 사용하는 shell은 표준 Bourn shell(sh)이다. Bourne shell에서 사용하는 정규 리눅스 명령어와 스크립트를 PetaLinux에서도 사용할 수 있다.

예를 들어, top 명령어를 사용해 현재 동작 중인 프로세서의 작업을 확인할 수 있다. 이는 가장 CPU 작업이 활발한 작업을 보여주며, 프로세스를 제어하는 인터페이스를 제공한다 (어플리케이션, 로딩 가능한 모듈, 서비스 등). CPU 사용량, 메모리 사용량, 그리고 실행 시간을 기준으로 정렬할 수 있다.

top-command


top command running on PetaLinux

‘q’를 입력하여 top 명령어를 종료할 수 있다.

정규 리눅스 명령어인 mkdir, cd, cat, grep, touch, ls, rm과 같은 명령어 또한 필요하다면 사용할 수 있다.

예를 들어, mkdir test_directory 명령어를 사용해 루트 폴더에 새로운 디렉토리를 생성할 수 있다. 그리고 ls 명령어를 사용해 현재 디렉토리에 있는 파일들을 확인할 수 있다.

ls_on_zedboard


Trying basic Linux commands on Zedboard(mkdir,ls)

그 외에 다른 기본적인 명령어를 사용해보자. 현재 작업 디렉토리를 cd 명령어를 사용해 변경할 수 있다. 그리고 touch 명령어를 사용해 두 개의 파일(test1, test2)을 test_directory안에 생성한다. 마지막으로 ls 명령어를 사용해 폴더 내의 파일을 확인한다.

trying-basic-linux-commands-on-zedboard


Trying basic Linux commands on Zedboard(cd,touch)


유틸리티 어플리케이션, 라이브러리, 네트워크 스택들 또한 shell을 사용해 즉시 접근할 수 있다.

M. gpio-demo 어플리케이션
gpio-demo 어플리케이션은스위치, LED, 푸쉬 버튼을 통신하게 하는 리눅스 어플리케이션이다. 여덟개의 스위치, 다섯 개의 푸쉬 버튼, 여덟 개의 LED의 ID는 다음과 같다:

gpio_ids


GPIO Devices IDs

GPIO에 쓰기를 수행하기 위한 명령 문법은 다음과 같다:

gpio-demo-write

값은 10진수로 전달할 수 있다. 예를 들어, gpio-demo -g 893 -o 3 명령어를 사용해 LED0와 LED1을 켤 수 있다. 10진수 3은 8-bit 바이너리로 00000011이기 때문이다.

gpio-demo -g 893 -o 3
gpio-demo_ledson


Turn LED0 and LED1 ON (Using gpio-demo)

gpio-demo_ledson-e1442218337385


Turn LED0 and LED1 ON (Board View)

한편 GPIO에서 읽기를 수행하려면 다음과 같이 명령어를 사용하면 된다:
gpio-demo-read

반환값은 16진수 형식이다.

예를 들어, 여덟 개의 스위치가 다음과 같이 설정되어 있다고 하자.

gpio_demo_read-e1442218753988


SW0 and SW2 are set to High


gpio-demo -i -g 885은 5를 16진수 0x00000005로 반환할 것이다.

gpio-demo -i -g  885
readgpio1


Read switches status using gpio-demo


이로써 열 번째 실습인 Embedded Operating Systems를 마친다.


Advertisements
Tagged with: , , , , , , , , , , , , , , , , , , , , , , ,
Posted in FPGA

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

누적 방문자 수
  • 88,610 hits
%d bloggers like this: