Notice
Recent Posts
Recent Comments
Today
Total
04-30 00:02
Archives
관리 메뉴

Jeongchul Kim

2. 임베디드 시스템 개발 환경의 특징 본문

Embedded Linux

2. 임베디드 시스템 개발 환경의 특징

김 정출 2015. 12. 22. 12:27

2. 임베디드 시스템 개발 환경의 특징


임베디드 시스템 개발환경의 특징

1. 임베디드 소프트웨어 개발환경의 특징

> 소프트웨어를 개발하는 시스템과 실행시키는 시스템이 다르다.

실행되는 시스템에 적합한 바이너리 코드를 생성해야 한다. PC는 개발 환경과 실행 환경이 동일하기 때문에 이러한 문제를 고려하지 않아도 된다.


> 개발 툴 사용 방법을 정확히 숙지하고, 컴파일러에게 시스템 구성에 대해서 상세히 알려줘야 한다.

임베디드 시스템의 하드웨어 구성은 모두 다르다. 프로세서의 종류나 메모리의 크기와 종류, 연결된 주변기기들의 종류 등 구성이 동일하지 않으므로 컴파일러에서 자동으로 처리해줄 수 있는 부분이 많지 않다. 그래서 이러한 정보들을 컴파일러에 하나하나 설정해 주어야 한다.


> 하드디스크가 없다.

임베디드 시스템의 메모리는 ROM, RAM, Flash 로 구성되어 있고 하드디스크(HDD)가 없다.

PC에서는 실행파일을 하드디스크에 저장하고, 실행시에 RAM으로 로드되지만, 임베디드 시스템은 실행파일은 ROM에 다운로드해주어야 하고 이때 ROM Writing이 가능한 장비가 필요하다. 프로그램의 실행은 ROM 실행도 가능하고, RAM 실행도 가능하다.



2. 임베디드 소프트웨어 개발 방법

> 임베디드 시스템의 구현

임베디드 시스템은 하드웨어로만 구현할 수도 있고 하드웨어와 소프트웨어를 병행하여 구현할 수도 있다. 하드웨어로만 시스템을 구성한다면 속도는 빠르겠지만, 비용이 많이 들고 나중에 유지보수가 어려워진다. 그래서 대부분 하드웨어와 소프트웨어를 함께 개발하며, 이미 개발되어 있는 하드웨어에 소프트웨어를 개발하여 탑재하는 방식도 많이 사용된다.


> 교차 개발

임베디드 시스템은 특정 목적을 지닌 시스템이기 때문에 해당 기능과 상관없는 장치는 갖추지 않는다.

휴대용 게임기에는 게임화면을 볼 수 있는 LCD화면과 방향키와 엔터키 정도로 구성되어 있다. PC에서 사용하는 키보드는 존재하지 않는다. 이렇게 임베디드 시스템은 소프트웨어 개발에 적합치 않아, 교차개발 방법을 사용한다.

** 교차 개발 이란 프로그램을 개발하는 환경과 실행하는 환경이 다른 개발 방법을 말한다.



> 호스트 시스템과 타겟 시스템

교차 개발 환경에서 소프트웨어를 개발하는 시스템, 즉 PC 환경을 호스트 시스템이라 하고,

소프트웨어가 작동될 환경, 핸드폰이나, PDA 시스템을 타겟 시스템이라고 한다. 이처럼 소프트웨어를 개발하는 환경과 소프트웨어가 작동되는 환경이 다르므로 일반적으로 PC에서 사용되던 개발 툴은 사용될 수 없다. 크로스(cross) 컴파일러와 같은 교차 개발 툴을 사용해야 한다.


3. 임베디드 소프트웨어 개발 환경

> 네이티브(Native) 컴파일러

PC용 소프트웨어는 프로그램을 개발하는 환경도 PC이고, 실행되는 환경도 PC이다.

이는 소프트웨어가 개발되는 환경과 실행되는 환경이 동일하며, 프로세서도 동일함을 의미한다.

이렇게 개발 환경과 동일한 환경에서 작동되는 실행 파일을 생성해주는 컴파일러를 네이티브(Native) 컴파일러라고 한다.


> 크로스(Cross) 컴파일러

임베디드 소프트웨어는 개발되는 환경과 실행되는 환경이 다르다.

그래서 개발환경의 프로세서와 실행환경의 프로세서가 다르므로 실행파일 생성시 현재 프로세서용으로 만들어서는 안된다. 이렇게 현재 컴파일되는 환경의 프로세서용이 아닌 실행환경의 프로세서용으로 실행파일을 만들어 주는 컴파일러를 크로스(Cross) 컴파일러라고 한다.


> ARM 교차 개발 툴

교차 툴은 단순히 크로스 컴파일러 만을 말하는 것은 아니다.

오브젝트들을 묶어주는 링커나 로케이터, 디버거 들이 필요한데, 대부분 이들을 하나의 통합 환경으로 만들어 사용한다. 이를 통합개발환경(IDE : Integrate Development Environment)라고 한다.

예로 ARM 교차 개발 툴을 살펴보자. ARM은 임베디드 시스템에서 가장 많이 사용되는 프로세서로 임베디드 시장의 80%를 차지한다. ARM 프로세서용 교차개발 툴은 ADS, 코드워리어, GNU 툴 등이 있다.


• ADS(ARM Developer Suit) : ARM사에서 제공하는 상용 통합 개발 환경

• 코드 워리어 : 매트로 웍스 사에서 제공하는 상용 통합 개발 환경

• GNU 툴 : arm-linux-gcc(ARM용 C컴파일러), arm-linux-ld(링커) 등



> 크로스 컴파일 과정

컴파일 과정은 PC와 큰 차이는 없지만, 컴파일러나 어셈블러는 교차 개발용이다.

링커에 의해 여러 개의 오브젝트 파일들이 합쳐진다. 합쳐지는 방식은 오브젝트의 동일한 이름의 섹션들을 하나로 으로 통합한다.

** 섹션이란 오브젝트 파일의 구성 요소로 코드를 종류 별로 분리한 부분.

** 로케이터가 실행 가능한 바이너리(binary)파일로 만들어준다.

로케이터가 프로그램이 실행되기 위한 실제 메모리 주소를 할당해 주어 프로그램이 실행될 수 있도록 한다.













임베디드 시스템 개발 절차

임베디드 소프트웨어 개발 절차

1. 호스트 시스템 구성 요소

 - 툴 체인(Tool-Chain)

 - 다운로드 유틸리티

 - 터미널 유틸리티

 - 디버깅 유틸리티

2. Tool-Chain 설치

툴체인(Tool Chain)이란 크로스 컴파일러, 크로스 어셈블러, 크로스 링커, 로케이터 등으로 구성된 소프트웨어 개발도구 이다. ARM용 통합개발환경인 ADS도 툴체인의 한 종류이다. 이러한 상용 소프트웨어는 윈도우즈 환경에서 간단히 설치할 수 있다. 이에 비해 arm-linux-gcc나 arm-linux-ld 등과 같은 GNU 툴은 리눅스 환경에 도구 모음을 직접 구성해야 한다.


3. 디버거 설치

디버깅 툴을 설치한다. 대부분의 상용 통합 개발 환경에는 디버거를 함께 제공하므로 따로 설치할 필요는 없으나 GNU 툴은 arm-linux-gdb를 설치해야 한다.


4. 다운로드 유틸리티 설치

호스트 시스템에서 개발한 소프트웨어는 타겟 시스템으로 다운해야 하는데 이때 필요한 프로그램을 호스트 시스템에 설치해야 한다. 이 또한 보통 통합개발 환경에서는 포함되어 있고, 리눅스 환경에서는 nfs 서버를 사용한다. nfs 서버는 네트워크에 연결된 다른 컴퓨터의 파일 시스템에 접근하여 실행할 수 있도록 해준다. 그래서 호스트 시스템에 있는 실행파일을 타겟 시스템에서 원격으로 가져다가 실행할 수 있다.


5. 터미널 유틸리티 설치

타겟 시스템에는 모니터가 없다. 프로그램이 타겟 시스템에서 정상적으로 작동하는지 확인하기 위해서는 시리얼 통신으로 데이터를 주고 받아서 호스트 시스템의 모니터로 확인해야 한다. 이러한 과정을 수행하기 위해서 터미널 유틸리티가 필요한데, Windows 에서는 하이퍼터미널을, Linux 에서는 미니컴 을 활용하면 된다.


6. 케이블 연결

개발한 소프트웨어를 타겟 시스템으로 다운하거나, 모니터링하기 위해서는 호스트 시스템과 연결되어야 한다.


>시리얼 케이블 : UART통신을 위한 케이블로, UART란 직렬 장치를 이용한 통신을 말한다.

  타겟 시스템의 프로그램이 정상적으로 작동하는지 모니터링 하기 위해서 사용한다.

> JTAG 케이블 : 타겟 시스템으로 프로그램을 다운로드(라이팅)할 때 사용한다.

** JTAG(Joint Test Action Group)으로 임베디드 시스템 개발시 프로그램 다운, 실행, 디버깅 하는 장비

> 이더넷/USB 케이블 : 이 또한 타겟 시스템으로 프로그램을 다운로드할 때 사용한다.

7. 프로그램 개발

임베디드 소프트웨어 개발환경이 모두 구축되었으니 이제, 개발이 가능하다. 호스트 시스템에서 소프트웨어를 개발하고 툴체인을 이용하여 타겟 시스템용 실행파일을 생성한다. 물론 현 시스템에서 프로그램을 테스트할 수는 없다. 실행 파일은 호스트 시스템의 프로세서에 적합하지 않기 때문이다.


8. 프로그램 다운로드

다운로드 유틸리티를 이용하여 실행 파일을 타겟 시스템으로 다운로드 한다.


9. 프로그램 실행

터미널 프로그램에서 실행 파일을 실행한다.




임베디드 소프트웨어 개발의 예

1. 호스트 시스템 Tool-Chain 구성

리눅스 환경으로 구축하기 위해서는 PC에 리눅스를 먼저 설치한다.

ARM 프로세서용 크로스컴파일러를 설치한다. 툴체인 프로그램을 /usr/local 디렉토리에 복사 한뒤 압축을 풀면 프로그램이 설치된다. 명령은 “tar –xvjf 파일명” 이다.


[root@localhost arm]# tar -xvjf arm-linux-tools.tar


2. 설치 프로그램 패스(path) 설정

• 패스 설정하기 전에 설치한 arm-linux-gcc의 버전을 확인해본다.

• $ arm-linux-gcc –version 명령을 실행하면 그림과 같이 알 수 없는 명령이라는 메시지가 뜬다. 패스를 설정하지 않으면 이렇게 프로그램이 정상적으로 설치되었더라도, 실행 파일이 있는 위치 이외의 다른 디렉토리에서는 실행이 안된다.


• $ vi .bash_profile 명령으로 패스 정보를 입력할 파일을 연다.


• export PATH=/usr/local/arm/2.95.3/bin:$PATH 파일 안에 위와 같이 경로를 입력하고, 저장한다.

• 환경설정이 적용되기 위해서는 다음과 같이 source 명령을 사용한다.

$ arm-linux-gcc –version 입력하면 버전 메시지가 뜬다. 툴 체인이 정상적으로 설치되었다.


[root@localhost arm]# arm-linux-gcc --version

bash: arm-linux-gcc: command not found

[root@localhost arm]# vi .bash_profile

[root@localhost arm]# source .bash_profile

[root@localhost arm]# arm-linux-gcc --version

x.xx.x


3. 소프트웨어 개발

vi 와 같은 에디터를 통해 소프트웨어를 개발하고 arm-linux-gcc명령을 통해 컴파일한다. 아래 실행결과와 같이 hello.c를 컴파일해서 hello라는 실행파일을 생성하였다. 실행파일을 실행해보자 $ ./hello 실행할 수 없는 이진파일이라는 오류 메시지가 뜰것이다. 크로스 컴파일러에 의해서 인텔 프로세서가 아닌 arm 프로세서용 실행파일을 생성했기 때문이다. 실행파일은 타겟 시스템에 다운로드하여 타겟 시스템에서 실행하다.


[root@localhost arm]# vi hello.c

[root@localhost arm]# arm-linux-gcc -o hello hello.c

[root@localhost arm]# ./hello

bash: ./hello: cannot execute binary file


4. 미니컴(minicom) 설정

• 직렬 통신을 위한 프로그램으로, 모니터 프로그램을 통해 프로그램을 타겟 시스템으로 다운로드하거나 실행할 수 있다.

• 미니컴 환경설정 $ minicom –s 다음과 같이 메뉴가 뜨면 Serial port setup 메뉴를 선택하여 통신 속도나 장치 등을 타겟 시스템에 맞게 설정한다.



5. 미니컴(minicom) 실행

미니컴 실행 $ minicom 미니컴을 실행하고 타겟 시스템의 파워를 키면 다음과 같이 모니터 프로그램의 메뉴가 뜬다. 메뉴에 따라서 프로그램을 다운로드 하고 실행한다.

프로그램을 다운로드하여 실행하려면 [0] Download & Run 을 실행하면 된다.

** 모니터 프로그램: 고가의 장비 없이 USB나 Ethernet(이더넷)을 통해 개발한 프로그램을 타겟 시스템에 다운로드하고 실행하기 위해 사용하는 프로그램으로 롬(ROM)에 미리 다운로드 되어 있어야 한다.




임베디드 시스템 실행 과정

1. 임베디드 시스템 실행 과정

리셋-> 하드웨어 초기화 -> C 프로그램 실행 기반 구축 -> main으로 분기



2. 리셋 Reset

리셋은 파워나 리셋 버튼을 눌렀을 때 발생하는 예외(Exception)이다.

예외라는 것은 시스템의 오류 만을 말하는 것은 아니다. 예외는 프로세서에게 특정 이벤트가 발생했음을 알려주는 것이고, 프로세서가 이에 대해 대처한다. 이러한 예외들은 프로세서마다 정의되어 있고, 예외를 처리하는 코드를 예외처리루틴(핸들러)이라고 한다. 리셋은 시스템의 시작을 의미하는 이벤트이므로 시스템을 초기화하는 예외처리루틴이 필요하다. 그래서 리셋 예외가 발생하면 대부분 부트 코드로 분기한다.


** 부트 코드(boot code)

하드웨어 초기화 코드이다. 하드웨어 초기화 과정은 다음과 같다.

• 인터럽트 불가(disable)

• 시스템에서 필요한 클럭을 생성

• 메모리 하드웨어 설정

• 주변 기기 하드웨어 설정


3. startup 코드

파워를 켜자마자 C프로그램을 작동시킬 수는 없다. C프로그램이 작동되기 위한 기반을 만들어주어야 하는데, 이러한 작업을 Startup코드가 처리한다. 이 코드가 작동되기 이전에는 C코드는 실행할 수 없으므로 부트코드와 Startup코드는 어셈블리로 만들어야 한다.

• 초기화한 전역변수와 static변수를 RAM으로 복사

• 초기화하지 않은 전역 변수와 static 변수 0으로 초기화

• 모드별 스택을 생성하고, 스택 포인터 초기화

• 힙 메모리 생성

• 인터럽트 허용

• C 프로그램의 main() 호출


4. C 프로그램 실행

Startup코드의 마지막은 main()의 호출이다. C프로그램이 실행될 준비가 되었으니, 이제 프로그램을 실행하라는 의미이다. main()으로 분기해서 개발한 임베디드 소프트웨어가 실행된다. 임베디드 소프트웨어는 대부분 무한루프이다. 예를 들어 핸드폰이 통화 한번 할 때마다 프로그램이 종료한다면 얼마나 불편하겠는가? 대부분 통화가 끝나면 대기화면으로 이동하여 다음 입력을 무한 기다린다. 이처럼 임베디드 시스템은 대부분 종료메뉴를 선택하기 이전에는 종료되지 않고 계속해서 다음 입력을 대기하도록 만든다.


Comments