* 크로스 개발환경 및 툴체인 


임베디드 시스템의 개발을 위해서는 호스트 컴퓨터에 타깃시스템 용의 프로그램 작성을 위한 각종 프로그램 개발 관련 도구가 설치되어야 한다. 이와 같은 타깃시스템 프로그램 개발을 위해 호스트에 설치되는 각종 패키지를 크로스개발환경이라고 한다.



크로스 개발환경에서 호스트와 임베디드 시스템의 기본 연결이다.


시리얼 연결은 호스트와 타깃 시스템 사이에서 가장 기본적인 저속 통신 기능을 제공한다. 개발 과정에서 호스트 측에서 임베디드 시스템에 대한 부팅 명령이나 리눅스 명령을 주거나 임베디드 시스템에서 발생한 출력 메시지를 호스트 측에서 보는데 주로 사용된다. 임베디드 시스템은 개발 단계에서 기본 통신을 위해 보통 시리얼 포트를 갖추고 있다. 이를 호스트의 시리얼 포트와 서로 연결한다.


호스트가 pc인 경우 뒷면에 시리얼 포트가 하나 또는 두개 있다.


이후 minicom과 같은 시리얼 통신프로그램을 이용해 타깃시스템과 서로 통신한다.


개발자가 임베디드 시스템에 주는 각종 명령 및 임베디드 시스템에서 출력하는 각종 실행 결과 및 커널 메시지들은 모두 시리얼 포트를 통해서 이루어짐.


이더넷 연결은 100/1000mbps의 고속 전송이 가능하므로 개발단계에서는 주로 호스트와 임베디드 시스템사이의 파일 전송에 사용


jtag(joint test action group)은 하드웨어 수준의 디버깅 및 호스트에서 작성된 부트로더를 임베디드 시스템의 플래시메모리에 쓰는 역할을 한다. 



* 툴체인


호스트의 프로세서와 개발 대상인 임베디드 시스템의 프로세서는 대부분 다른 경우가 많다. 호스트의 프로세서는 대부분 인텔 80 * 86 계열인데 이 프로세서가 임베디드 시스템에 사용되는 경우는 거의 없다. 


임베디드 시스템용 프로세서로는 스마트폰이나 고성능 제어 기기에 많이 사용되는 32/64비트 ARM 계열과 저전력 센서 네트워크 등에 많이 사용되는 마이크로컨트롤러인 AVR 시리즈 등이 있다. 이들을 위한 크로스 어셈블러 및 크로스 컴파일러는 모두 공개되어 있어 쉽게 구할 수 있다. 


rpm 패키지를 구해 설치하는 경우는 간단히 rpm -ivh 패키지 파일명 식으로 rpm 명령을 사용하면 된다. rpm 패키지 설치 시는 패키지 파일에 따라 실제로 설치되는 디렉터리가 달라진다. 예로 /opt/cdt/xscale/bin 디렉터리에 설치되었다면 이 디렉터리에 다음 파일들이 생성된다.


arm-linux-as : ARM 프로세서용 크로스어셈블러

arm-linux-gcc : 크로스컴파일러

arm-linux-ld : 링커

arm-linux-strip : 실행파일에서 심벌 등을 제거하여 실행파일 크기를 줄이는 프로그램


툴체인 설치를 모두 마치면 실행파일이 들어 있는 디렉터리의 위치를 리눅스 셸에 알려주어야 한다. 리눅스 기본 셸은 bash이므로 bash의 환경변수 PATH에 "/opt/cdt/xscale/bin"을 추가하면 된다. 이렇게 하기 위해서 자신의 홈디렉터리에서 .bash_profile 파일을 편집기로 열어 PATH 라인 뒤에 ";/opt/cdt/xscale/bin" 라고 추가하면 된다. 


* 부트로더 


부트로더는 파워 온 시 임베디드 시스템의 각종 하드웨어를 초기화하고 기본적인 통신 기능을 제공하며 플래시메모리나 ROM에 들어 있는 운영체제 커널 부분을 주 메모리(RAM)로 이동시켜 운영체제의 부팅을 시작하는 기능을 한다. 


부트로더 주요기능


타겟 하드웨어 초기화, 운영체제 부팅, 파일이동, 통신기능, 플래시메모리관리


* JTAG


임베디드 시스템 개발 초기에는 부트로더 자체가 없으므로 이를 임베디드 시스템 플래시메모리에 넣어주기 위한 방법이 필요한데, 보통 JTAG 인터페이스를 주로 사용한다. 


호스트 PC에서 개발한 부트로더를 임베디드 시스템으로 전송하기 위해서는 먼저 임베디드 시스템의 JTAG 커넥터와 호스트 PC의 프린터 포트를 JTAG 시리얼 케이블로 연결한다. 다음 호스트 PC에서 부트로더 전송 기능을 하는 명령어에 전송할 부트로더 파일명을 입력하면 된다. 



*부트로더에서의 TFTP 사용


부트로더는 네트워크 인터페이스를 통해 호스트에서 커널 이미지나 파일을 가져오는 기능을 제공한다. 이때 FTP기능을 축소한 간단한 파일 전송프로그램인 TFTP를 사용한다. TFTP는 FTP에 비해 사용자 인증과정이 없고 접속된 서버 내에서 디렉터리를 이동할 수 없고 서버에서 미리 설정한 디렉터리에만 연결된다. 또 서버 디렉터리 내의 파일명을 볼 수도 없다. TFTP는 실행 코드가 작아 부트로더에 넣기 쉽고 실행을 위한 명령어는 보통 'tftp'이다.



* NFS 


NFS 는 네트워크에 연결된 다른 컴퓨터의 하드디스크 일부(파일 및 디렉터리)를 자신의 로컬 하드디스크처럼 사용할 수 있게 한다. NFS는 유닉스/리눅스에서 기본적으로 지원하는 기능이다.  



* 부트로더에 의한 부팅 과정 


1. 임베디드 시스템의 부트로더는 리눅스 커널을 호스트에 요청한다. 이때 호스트는 압축된 리눅스 커널 이미지를 TFTP를 사용해 임베디드 시스템에 전송하고 수신된 리눅스 커널 이미지는 임베디드 시스템의 RAM 영역에 저장된다.

2. 부트로더는 RAM에 로드된 커널로 실행권을 넘겨 커널의 압축이 해제되고 리눅스 부팅과정이 시작된다.

3. 부팅 과정 중 NFS 기능을 사용하여 루트파일시스템을 마운트하여 부팅이 계속된다.

4. 부팅 완료후 호스트에서 시리얼 통신 프로그램(minicom)을 통해 임베디드 시스템에 로그인한다(로그인 이후 자기 것으로 보이는 루트 파일시스템은 실제는 호스트에서 NFS를 통하여 제공하는 것이다)



* 루트 파일시스템 


루트 파일시스템은 리눅스에서 최상위 파일시스템이며 리눅스 자체의 동작을 위해서는 반드시 필요하다. 임베디드 시스템 개발 과정에서 루트 파일시스템을 만드는 과정은 반드시 필요하다. 루트 파일시스템은 개발과정에서는 편의상 앞에서 설명한 호스트의 NFS 디렉터리에 두는 경우가 많지만 개발이 완료되면 반드시 임베디드 시스템 내부의 플래시 메모리로 옮겨야 한다.


우선 호스트 컴퓨터의 /test/nfs 디렉터리에 임베디드 시스템의 루트 파일시스템을 생성하고 이 디렉터리를 NFS를 사용하여 임베디드 시스템에 마운트시켜 동작하는 것으로 가정하였다. 머저 루트 파일시스템을 구축할 /test/nfs 디렉터리로 가서 리눅스에서 사용되는 필수 디렉터리를 생성한다.


이상의 과정에서 루트 파일시스템의 필수 디렉터리가 생성되었으면 다음 단계로 시스템 초기화를 수행하는 init 프로그램을 설치한다.


* busybox 


 루트 파일시스템 구축의 마지막 단계로 BusyBox를 사용하여 임베디드 시스템에 필요한 각종 리눅스 유틸리티 및 응용프로그램들을 설치하는 과정을 설명한다. 



* 램디스크 


 램 디스크(Ramdisk)란 메모리에 일반 하드디스크에서와 같은 파일시스템을 구축한 것이다. 

램 디스크를 이용하면 메모리에 파일들을 둘 수 있으므로 메모리를 하드디스크처럼 사용 할 수 있다. 물론 RAM상에 존재하므로 전원 OFF 시에는 내용이 소멸되나 속도가 매우 빠르며 임베디드 시스템에서는 플래시 메모리와 함께 사용되어 서로 보완하는 효과가 있다.


램디스크는 하드디스크가 없는 임베디드 시스템에서 루트파일시스템을 구축하는 데 필요하며 루트 파일시스템만이 아니라 일반 파일시스템도 여기에 둘 수 있다.


* JFFS


 JFFS는 전원이 갑자기 OFF될 경우에도 데이터를 안정적으로 보호할 수 있는 기능을 가진 플래시 메모리에 구축된 파일시스템이다. 임베디드 시스템에서의 파일시스템은 대부분 JFFS(JFFS2)를 사용한다. 저널링 파일시스템은 동작 시 파일시스템의 변화 내용을 별도의 로그 파일에 기록하며 따라서 갑작스런 전원 OFF등의 이상 발생 시 복구가 가능하도록 하는 기능을 제공한다.











블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요