Chap 2 임베디드시스템 개발환경구성
1. 임베디드시스템개발환경구축 1.1. 네트워크기반의개발관련툴 tftp는 2가지형태로구동된다. 아래의세부절은예전부터사용되고있는 xinetd 수퍼데몬기반의 tftp와기능이향상된 tftpd-hpa를설명한다. 시스템의환경에따라서설치이후에동작하지않는문제가있어두가지방법모두를기술하였다. 가상머신인 VMware를이용하는경우라면 xinetd기반의 tftp를설치하기바란다. 1.1.1. TFTP 설치 (Xinet 기반 ) TFTP(Trivial File Transfer Protocol / UDP) 는 FTP보다간단하지만기능이조금덜한네트워크애플리케이션이다. 이것은사용자인증이불필요하고디렉터리를보여주지않아도되는곳에사용된다. 임베디드시스템개발장치의 bootloader에서 u-boot, kernel, root filesystem 이미지를 Host 개발시스템으로부터 Target 임베디드장치로이더넷포트를통하여다운로드하기위해사용한다. 1 수퍼데몬 xinetd 를이용한 tftp 설치 VMware 를이용하는경우우분투설치후, tftp-hpa 를설치하고 bootloader 에서 tftp 연결을하지못하는경우에는이전버전의 tftp 를설치하여사용하도록한다. 설치 apt-get install 명령을이용하여다운로드한다. root@ubuntu:/# apt-get install tftp tftpd xinetd tftpd 환경설정 tftp가 xinetd에의해서구동되므로, xinetd가서비스하는환경디렉터리인 /etc/xinetd 디렉터리안에 tftp파일을작성한다. root@ubuntu:/# vi /etc/xinetd.d/tftp 2
service tftp { protocol = udp socket_type = dgram wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /tftpboot disable = no per_source = 11 cps = 100 2 flags = IPv4 } 서비스시작 root@ubuntu:/# service xinetd restart or root@ubuntu:/# /etc/init.d/xinetd restart tftpd 테스트 tftpboot 디렉터리를만들고해당디렉터리에 test.txt 파일을생성한다. 먼저아래와같이 /tftpboot 디렉터리를생성한다 ( 기존에생성하지않았다면생성한다.) root@ubuntu:/# mkdir /tftpboot 그리고 cat 명령을이용하여파일생성 root@ubuntu:/# cat > /tftpboot/test.txt HELLO (Ctrl + D를눌러저장및종료 ) 디렉터리이동후로컬호스트로 tftp 접속 /root 홈디렉터리로이동한다음, tftp 클라이언트로컬아이피또는 tftp 3
localhost 명령으로접속한다. 이제 get 명령으로앞서만든 test.txt 파일을가져오면 /root 디렉터리에 test.txt 파일이전송된다. cat 명령으로 test.txt의내용을콘솔로출력했을때, 앞서작성한 HELLO라는내용이출력되면정상적으로구동된다고판단할수있다. root@ubuntu:/# cd /root root@ubuntu:/# tftp 192.168.1.x tftp> get test.txt tftp> quit root@ubuntu:/# cat < test.txt 1.1.2. NFS 설치 (Network File System) 네트워크에있는파일시스템을연결하거나제어할때사용할수있으며, 원격지에있는호스트파일시스템연결에이용된다. 임베디드시스템처럼내장메모리가작은경우이기능을이용하여호스트파일시스템과연결한다. 소프트웨어개발시에는중간테스트처럼번잡하게테스트를많이하는경우주로이용된다. NFS 다운로드 root@ubuntu:/# apt-get install nfs-kernel-server 4
nfs-kernel-server 설정 root@ubuntu:/# vim /etc/exports 수정할내용은다음과같다. 처음환경설정파일인 /etc/exports 파일을열면, 일반적으로아무런내용이없다. 아래의내용을추가하고저장한다. vi 에디터를이용할경우내용을추가하기위해서 'i' 키를누른다. 내용를입력한다. 저장을위해서 ESC키를누르고, :wq 를입력한다음, 엔터를치면파일내용이저장되고에디터가종료된다. /nfsroot *(rw,sync,no_root_squash,no_subtree_check) nfs-kernel-server 서비스디렉터리생성 nfs-kernel-server 를이용하여외부에서연결될디렉터리를생성한다. 5
root@ubuntu:/# mkdir /nfsroot nfs-kernel-server 서비스재시작 root@ubuntu:/# service nfs-kernel-server start 1.2. USB를이용한개발툴설치 Achro-i.MX6Q는 USB를통해서 bootloader와커널등시스템에필요한요소들을다운로드할수있다. 그러므로 USB를통해서다운로드할수있도록도와주는개발툴을먼저설치한다. root@ubuntu:/# apt-get install libusb-dev 1.3. 커널빌드및빌드옵션관련툴설치 6
커널이나파일시스템등을빌드할경우 ncurses 라이브러리를이용하게된다. ncurses 라이브러리는텍스트기반에서좌표등을이용한형태로도형이나글자를출력할수있도록하는라이브러리다. 이라이브러리를이용하여텍스트기반에서그래픽을표시하고, 키버튼등의이벤트를처리하며, 메뉴를표시또는선택하는등의작업을할수있다. 리눅스커널이나파일시스템툴을사용하는경우, 화면에서텍스트기반의그래픽을이용하여모든옵션을선택한다. 때문에커널등의옵션등을변경해줄필요가있다면 ncurse 라이브러리를다운로드받아설치해야한다. root@ubuntu:/# apt-get install libncurses5-dev 1.4. 임베디드장치와호스트간의통신을하기위한툴임베디드시스템은출력을위한별도의터미널 ( 모니터 ) 을가지고있지않기때문에대부분의메시지를 Serial port를통해서확인한다. 그러려면장치와시리얼통신이가능한터미널프로그램이필요하다. Linux에서는일반적으로 minicom을이용하고, Windows 에서는 Hyper-Terminal 등을이용한다. 1.4.1. minicom 프로그램에대해서 minicom은호스트와 Achro-i.MX6Q 개발보드를연결해주는가상터미널이다. 윈도우즈에있는하이퍼터미널과같은기능을하는프로그램이다. 임베디드보드의경우시리얼장치를통해서장치의상태나명령을송수신하기때문에미니컴을통해타겟에서전송되는데이터를호스트에서볼수있다. minicom 프로그램은시리얼포트를통해통신하므로시리얼포트관련설정을해야한다. 미니컴은 bootloader의명령프롬프트를위한콘솔과부팅후리눅스의쉘프롬프트를위한콘솔로사용된다. 리눅스용터미널프로그램 (minicom) 설치 Live 설치의경우에는디폴트패키지가아니므로다운로드를하여설치해야, 시스템에서사용을할수있다. root@ubuntu:/# apt-get install minicom 7
연결된시리얼디바이스를검색하려면아래의명령어를입력한다. root@ubuntu:/# dmesg 명령어를입력하면화면에현재연결한컨트롤러가어떤디바이스의이름으로연 결되어있는지알수있다. 새로운 USB device 가인식된후에 ttyusb0 로인식되 는것을볼수있고 /dev 디렉토리아래 /dev/ttyusb0 의형태로생성이된다. - 설정모드진입 8
minicom 환경설정모드로진입하기위해서 -s 옵션을이용한다. root@ubuntu:/# minicom -s - 통신포트선택 Serial port setup 항목을선택한다. A 키를입력한다음, Serial Device를직렬케이블이연결된직렬포트로설정한다. 앞서검색했던포트 ( 필자의경우에는 /dev/ttyusb0) 를입력한다. - 통신속도설정 E 를눌러 bps/par/bits 를설정할수있는화면에서통신속도를 115200, Data 9
b i t 를 8, Stop bit를 1, parity를 NO로설정한다. E를눌러통신속도를맞추고 L, V, W 를차례로눌러속도를맞추거나 Q를눌러서한번에설정할수있다. - Flow Control 설정 F를눌러 Hardware Flow Control을 NO로설정, G를눌러 Software Flow C o n t r o l 을 NO로설정한다. - 설정값저장 Save setup as dfl 를선택한후 Enter 를눌러설정된값을저장한다. 저장후 E x i t 10
표 를눌러설정밖으로나간다. ( 그후타켓보드를켜면부팅화면이 minicom 에 된다.) 시 - 미니컴구동확인미니컴이실행된상태에서 PC와 Achro-i.MX6Q 의시리얼이연결되어있으면미니컴화면을통해보드의부트메시지를확인할수있고 bootloader 상태로진입할수있다. 11
1.4.2. 크로스컴파일러설치제공된 CD의 toolchain 디렉터리의 arm-2014.05-29-arm-none-linux-gnueabi-i686 -pc-linux-gnu.tar.bz을 /root/temp 디렉터리로복사한다음, 특정디렉터리에압축을풀고, 어떤디렉터리에서도사용할수있도록패스를설정함으로써크로스컴파일러설치가완료된다. 1 toolchain 설치 CD에포함된툴체인을 /opt/toolchains 디렉터리에복사해둔다. root@ubuntu:~/temp# cp -a /mnt/hgfs/achro-i.mx6q-1/dvd-1_src/toolchain/ar m-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 /root/temp/ root@ubuntu:/#sync root@ubuntu:/#cd /root/temp root@ubuntu:/root/temp#mkdir /opt/toolchains root@ubuntu:/root/temp#tar jxvf arm-2014.05-29-arm-none-linux-gnueabi-i686- pc-linux-gnu.tar.bz -C /opt/toolchains/ 2 크로스컴파일러패스설정어느위치에서도크로스컴파일러를사용할수있게툴체인경로를시스템패스 (PATH) 에추가해야한다. 사용자의홈디렉터리에있는.bashrc에패스를추가하도록한다. 이후 bootloader등시스템관련일부소스를빌드할때, 크로스컴파일러설정에대한환경변수를확인하고컴파일이진행된다. 그러므로 CROSS_COMPILE 환경변수도아래와같이등록해주자. root@ubuntu:/# vim /root/.bashrc 12
# ~/.bash_aliases, instead of adding them here directly. # See /usr/share/doc/bash-doc/examples in the bash-doc package. if [ -f ~/.bash_aliases ]; then fi. ~/.bash_aliases # Cross Compiler - achroimx6q Android export CROSS_COMPILE=arm-none-linux-gnueabiexport PATH=/opt/toolchains/arm-2014.05/bin:$PATH export ARCH=arm 3 크로스컴파일러적용테스트크로스컴파일러의패스를갱신하려면리눅스를재부팅하거나아래의명령을통해서가능하다. 아래명령은현재사용하고있는터미널에서만환경이갱신되므로가급적리부팅을해줄것을권한다. 하지만, 패스를잘못설정해서시스템명령어까지사용하지못하는경우가발생할수있기때문에아래명령을이용해서크로스컴파일러와일반적인리눅스명령이잘동작하는지확인한다음리부팅해주자. 만약, 일반적인리눅스명령이동작되지않는다면리눅스를재부팅하지말고, 별도의터미널을하나더실행하여.bashrc를다시확인하고수정한다. 이어서 source 명령으로.bashrc 파일을갱신하고테스트를진행하여정상동작이확인되면리부팅한다. -.bashrc 스크립트갱신 root@ubuntu:/# source /root/.bashrc - 크로스컴파일러버전출력아래명령을입력했을때, gcc 버전이출력되면툴체인의경로가정상적으로설정된것이다. root@ubuntu:/# arm-none-linux-gnueabi-gcc --version 13
X root@ubuntu File Edit View Terminal Help root@ubuntu:/# arm-none-linux-gnueabi-gcc -version arm-none-linux-gnueabi-gcc (Sourcery CodeBench Lite 2014.05-29) 4.8.3 20140320 (prerelease) Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 4 컴파일테스트 vim 에디터를이용하여 helloworld.c 파일을작성하여크로스컴파일을한결과 를확인한다. helloworld.c 소스작성 root@ubuntu:/# vim helloworld.c 'i' 키를이용하여작성하고작성이완료되면, ESC키와 ":wq!" 를입력하여저장하고 vim 을종료한다. 수정할내용은다음과같다. #include <stdio.h> int main(int argc, char** argv) { printf("hello World!\n"); return 0; } 컴파일 root@ubuntu:/# arm-none-linux-gnueabi-gcc o helloworld helloworld.c 14
컴파일된바이너리확인 root@ubuntu:/# file./helloworld 15