Computing EMBEDDED NEOS 시작하기 : 기본이해 설치 첫번째실행 이번글에서는프로젝트옵션에서 hex 또는 binary 형식으로실행코드를생성하는방법과 command line의명령어들을빌드시사용하는방법등에대해알아보고 Static Analysis와 Runtime Checking 기능도함께살펴보도록하겠습니다. 글 : 장재형책임연구원 / NT 개발실 / MDS 테크놀로지자료제공 : MDS 테크놀로지 <www.mdstec.com> 46 Embedded World
들어가며지난글에서는국내실시간운영체제 (RTOS) 기술자립을이끌어가고있는 NEOS의적용사례와기본특징에대해살펴보았다. NEOS는다양한무기체계개발사업의여러부분품에적용되어개발중이고, 체계개발에상당한비중을차지하는 SW 개발에있어국산 RTOS의중요성을계속입증하고있다. [ 그림 1] NEOS 적용분야 방위사업청의 SW 개발지침에따라코딩규칙 ( 방위사업청코딩표준 ) 에기반한개발구현및통합활동을수행하였고, 정적분석도구를이용하여코드분석을완료하였다. 또한개발보드및실제무기체계에적용된보드를통해서다양한조건의시험을완수하였다. NEOS를경험하지못한개발자들을위해서이번기고에서는 NEOS의기본적인운영체제 / 개발환경기능을설명하고개발환경설치과정과첫번째예제프로그램을실행하는과정을설명하고자한다. 이를통해 NEOS를사용하고자하는개발자들이대략적인기능과환경을이해하는데도움이되었으면한다. NEOS 개발환경의이해 NEOS가지원하는 CPU 목록 NEOS는지금까지다양한국방 / 항공분야고객을위해 BSP 지원범위를확대해왔다. 다음은 NEOS가지원하는주요 CPU와보드를보여준다. www.embeddedworld.co.kr 47
Computing EMBEDDED [ 그림 2] NEOS 지원 BSP NEOS 구성요소 NEOS는하드웨어비의존적인부분과하드웨어의존적인부분으로나뉘어각기능이모듈화되어있다. 이중하드웨어비의존적인모듈로는 NEOS의핵심인실시간커널과다양한서브시스템라이브러리가있다. 반면하드웨어의존적인모듈에는 CPU 코어에의존적인 ASP(Architecture Support Package) 와보드장치에의존적인 BSP(Board Support Package) 가있다. [ 그림 3] NEOS 아키텍처 48 Embedded World
NEOSPACE 통합개발환경의기능과구성 NEOS 개발자용통합개발환경인 NEOSPACE는오픈플랫폼인 Eclipse를기반이고임베디드타겟을위한크로스컴파일러 (Cross Compiler) 로 GNU GCC 4.3.3을비롯한툴체인을포함하고있다. 아울러실행이미지를네트워크로다운로드하기위한 NEOS TFTP 서버등유틸리티를함께제공한다. 호스트컴퓨터와타겟기본구성 NEOSPACE는크로스툴체인을이용하여응용프로그램을빌드하고빌드된이미지를이더넷인터페이스를통해다운로드하여실행하는기본구조로되어있다. 빌드된응용프로그램이실행하면서출력되는메시지는표준입출력장치로사용되는시리얼장치 (UART) 로전달되어시리얼터미널에서출력된다. [ 그림 4] NEOS 개발환경 NDK (NEOS Development Kit) 설치 NEOS Development Kit은 DVD의형태로제공되는데 NEOS RTOS와 NEOSPACE 통합개발환경, 기타유틸리티등이포함되어있다. 다음그림과같이간단한설치과정을거쳐호스트컴퓨터에 NDK를설치할수있다. www.embeddedworld.co.kr 49
Computing EMBEDDED [ 그림 5] NEOS 설치절차 NDK가설치된디렉토리구성 NDK를설치하면아래와그림과같은파일들이설치된다. [ 그림 6] NDK 설치파일구조 50 Embedded World
Docs 디렉토리 - NEOS 사용자매뉴얼, NEOS API 문서, IDE 사용자매뉴얼등이있다. ExtraTools 디렉토리 - 임베디드시스템개발에필요한 TFTP 서버, Tera Term, 라이센스관리프로그램등이있다. License 디렉토리 - NDK 라이센스관리프로그램이사용하는라이센스파일이있다. Neos 디렉토리 - NEOS 헤더, BSP, NEOS 라이브러리, 장치드라이버소스등이있다. NEOSPACE - Eclipse IDE 패키지 Tools - 빌드를위한크로스툴체인 NEOS 프로젝트타입 NEOSPACE는다음 3가지프로젝트타입을지원한다. NEOS 커널이미지프로젝트 - 커널이포함된응용프로그램을개발하기위해사용하는프로젝트타입으로하나의실행이미지로 xxx.bin과 xxx.elf 파일생성 NEOS 응용프로젝트 - 커널이포함되지않고응용 SW만의실행이미지를개발하기위해사용하는프로젝트타입으로 xxx.app 파일을생성하며 NEOS가이미동작중인타겟보드에동적로더로로딩하여실행함 NEOS 정적라이브러리 - 라이브러리생성시사용하는프로젝트타입으로 xxx.a로정적링크가능한라이브러리이미지파일생성 첫번째프로젝트생성하기 : HelloWorld 이제본격적으로 NEOSPACE를실행하여첫번째 HelloWorld 프로젝트를만들어본다. 1 File -> New -> NEOS Project 선택 2 Project Name을입력하고 NEOS Kernel Image를선택한후 Next 클릭 3 Configurations을선택하고 Next 클릭 [ 그림 7] Hello World 프로젝트생성하기 (1) www.embeddedworld.co.kr 51
Computing EMBEDDED 4 BSP(Board Support Package, 사용하는타겟보드명 ) 를선택하고 Finish 버튼클릭. [ 그림 8] HelloWorld 프로젝트생성하기 (2) HelloWorld 프로젝트빌드하기생성된 HelloWorld 프로젝트를아래와같이빌드한다. 1 생성된프로젝트트리최상위에마우스오른쪽버튼을누르고빌드모드선택 2 빌드모드설정을완료하고 Build Project를눌러프로젝트빌드 3 하단의 Console View에서빌드과정확인 [ 그림 9] HelloWorld 프로젝트빌드하기 52 Embedded World
HelloWorld 프로젝트실행 HelloWorld 프로젝트를다음과같은절차로실행한다 1 ExtraTools 디렉토리의 teraterm-4.77.exe 프로그램설치 2 Tera Term 프로그램을시작하여설정 -> 시리얼포트메뉴선택 3 COM 포트를타겟보드환경에적합하게설정 4 타겟보드전원을켜고 Tera term을통해부트로더메시지출력확인. [ 그림 10] HelloWorld 프로젝트실행 (1) 5 ExtraTools 디렉토리에있는 TFTP Server 실행 6 실행된 TFTP 서버의 Menu->Setting 메뉴선택 7 TFTP 서버 IP 및 TFTP 디렉토리경로지정 [ 그림 11] HelloWorld 프로젝트실행 (2) www.embeddedworld.co.kr 53
Computing EMBEDDED 8 부트로더가실행중인타깃에서 HelloWorld.bin 이미지를다운로드및실행하는명령실행 9 시리얼콘솔에 NEOS 로고출력을확인한다. [ 그림 12] HelloWorld 프로젝트실행 (3) NEOSPACE를이용한디버깅 NEOSPACE는응용프로그램디버깅을위해 SW 디버거를제공한다. SW 디버거는내부적으로는 GNU GDB를사용하며원격타겟보드의디버그에이전트와연동하여타겟의메모리및 CPU 레지스터정보를읽거나쓸수있게한다. 단 SW 디버거의한계상 NEOS Application 프로젝트로빌드된응용타입의이미지만디버깅이가능하고커널전체를포함한이미지를전체적으로디버깅하는것은불가능하다. 이를위해서는 JTAG/BDM 등의하드웨어디버거를사용하여야한다. 아울러하드웨어의존성이있는인터럽트를사용하는장치드라이버등의디버깅은정확한결과를보장하기어려운측면이있다. NEOSPACE를이용한 SW 디버깅을아래와같이실행할수있다. [ 그림 13] NEOS 디버깅화면 54 Embedded World
1 먼저기반이될 NEOS Kernel Image 프로젝트를생성하고타겟보드에로딩하여실행한다. 2 디버깅할응용프로그램을 NEOS Application 프로젝트로생성하여빌드한다. 3 디버거설정화면에서타겟보드의 IP 주소를지정한다. 4 디버깅실행버튼을눌러디버깅을시작한다. - 응용프로그램은자동적으로타겟에다운로드된다. - 로드된응용프로그램은 NEOS 동적로더에의해실행된다. 5 최초디버깅시기본적으로응용프로그램의 main() 함수에서멈추고대기한다. NEOS 커널기능소개앞장에서는 NEOS 개발환경을간략히살펴보고, 프로젝트생성과빌드, 디버깅방법에대해살펴보았다. 이장에서는그러한개발환경을이용하여응용할수있는 NEOS 커널의각기능에대해개략적으로소개한다. NEOS 커널개요임베디드시스템을위한실시간운영체제는멀티태스킹환경과태스크간의통신및동기화기능을기본적으로제공한다. 이를이용하여시스템개발자는전체응용 SW를여러개의분리된작업단위 ( 태스크 ) 로분할하여작성한후, 운영체제가제공하는스케줄러를통해다중실행하도록구성할수있다. 또한태스크간통신기능을이용하면생성한태스크간에서로동기화하여통신하도록구성할수있다. NEOS 커널은스레드 (Thread) 라는기본작업단위를제공하고, 다수의스레드를단일한메모리주소공간을공유하여수행시키는구조로설계되어있다. 이를통해하드리얼타임성능을보장한다. 아울러실시간운영체제에서중요한요소하나는하드웨어에서발생하는인터럽트요청을예측가능한방식으로얼마나정확하고신속하게처리하는가의여부이다. 이는임베디드시스템은주로인터럽트를통해외부로부터이벤트를전달받고, 이를가장높은우선순위로신속하게처리해야하기때문이다. 인터럽트를처리하기위해 NEOS를비롯한대부분의실시간운영체제커널은인터럽트만을위한수행문맥 (Context) 를별도로정의하여가장높은우선순위로처리한다. 스레드실시간시스템 SW는대개여러개의작업 ( 태스크 ) 을동시다발적으로실행하는형태로구성된다. 이때각스레드는실시간스케줄링에필요한우선순위 (Priority) 값이나시간제약 (Timing constraints) 값등을속성으로가진다. 효과적인멀티스레드실행환경을보장하기위해실시간시스템은실시간스케줄러를사용해우선순위와시간제약조건을만족시키도록스레드를스케줄링한다. 또한스레드들은서로메시지를주고받으며통신을하고동기화를통해공유자원을사용한다. NEOS의스레드는 API 호출과스케줄링에따라다음그림의 6가지상태간을천이하며, READY 상태를갖는가장높은우선순위의스레드가실행을선점하여실행 (RUNNING) 하는방식으로스케줄링한다. www.embeddedworld.co.kr 55
Computing EMBEDDED [ 그림 14] NEOS 상태천이도 동기화와통신멀티스레드환경을위해서는스레드간의동기화와통신을위한방법이요구되며 NEOS 커널은이를위해다음의방법을제공한다. - 상호배제와동기화를위한세마포어 - 스레드간통신을위한메시지큐 - 특정스레드에이벤트를전달하기위한이벤트플래그 세마포어는여러개의스레드가동시에공유자원에접근하는것을동기화하기위해사용되는커널객체이다. 전역변수, 임계영역 (Critical Section) 이라불리는코드의일부분, 또는스레드간에공유될수있는모든자원들이공유자원 [ 그림 15] 바이너리세마포어상태천이도 56 Embedded World
이될수있다. NEOS 커널은사용되는목적과동작방식에따라세가지종류의세마포어를제공하는데, 그중뮤텍스세마포어에는잘알려진우선순위역전현상을방지하는메커니즘이적용되어있다. - 바이너리세마포어 (Binary Semaphore) - 카운팅세마포어 (Counting Semaphore) - 뮤텍스세마포어 (Mutex Semaphore) 아울러 NEOS에서지원하는메시지큐 API를이용하면, 스레드에비동기적인통신프로토콜을사용할수있다. 비동기적인통신프로토콜의의미는메시지의송 / 수신스레드가동시에상호작용할필요가없다는것이다. 송신된메시지는큐에전송되고메시지를받을수신스레드에의해수신되기전까지큐에서관리되는데수신시점은비동기적으로설계된다. 응용 SW 개발자의의도에따라메시지큐내에관리되는메시지길이와개수, 큐의속성은가변적으로설정될수있다. [ 그림 16] 메시지큐내부구조 www.embeddedworld.co.kr 57
Computing EMBEDDED 이벤트플래그는여러스레드를동기화시키는가장간단한방법으로스레드간비트단위의통신을한다. 메시지큐와는달리이벤트플래그는특정이벤트발생여부만을스레드에알리며이이벤트에해당하는정보나데이터는함께제공하지않는다. 이벤트플래그는매우단순하여스레드연결기능을구현하는데주로사용되고, 스레드연결기능은한스레드가다른스레드의종료를기다려종료된후수행되는것이다. 다음은이벤트플래그의특징을보여준다. [ 그림 17] 이벤트플래그동작원리 - 스레드는하나이상의이벤트를동시에기다릴수있음 - 이벤트는서로독립적임 - 이벤트는데이터를전달하지않음 - 대상스레드가이벤트를읽어처리를수행하기전에다시이벤트가한번이상보내질경우마지막으로보내진이벤트만이유효함 SW 타이머 SW 타이머는시스템시간값을계산하여사용자에게타이머서비스를제공한다. 즉, 사용자가특정시간후에실행되기를원하는함수를등록하면 SW 타이머의내부에저장된시간카운트값은시스템클락인터럽트가발생할때마다감소하여정확한시간후에등록된함수를호출한다. 실행중인 SW 타이머를정지시키면, 해당 SW 타이머는즉시정지하고그카운트값은삭제된다. 인터럽트처리인터럽트란프로그램실행중에하드웨어로부터발생한이벤트를말하고인터럽트가발생하면 CPU는실행중인작업을중단하고발생된이벤트를우선처리한뒤기존에수행중이던작업으로복귀한다. NEOS 는사용자가장치 IRQ 번호만알면쉽게 ISR을등록하고인터럽트관련기능을사용하도록다양한인터럽트 API들을제공한다. 58 Embedded World
[ 그림 18] 인터럽트소프트웨어처리 예외처리예외란프로그램이실행되는도중에프로세서의정상적인실행흐름을방해하는모든이벤트를말하고프로세서로하여금특정상태에서정해진명령을수행하도록한다. 예외는동기 (Synchronous) 와비동기 (Asynchronous) 두가지로구분된다. 동기식예외는프로세서명령어실행중에발생한내부이벤트를말하고 0으로나누는산술연산또는필요로하는데이터가접근불가능한경우발생하는예외가대표적인예이다. 반면에비동기예외는일반적으로하드웨어장치에서발생한신호들로인한외부이벤트를말하는데, 인터럽트가대표적인예이다. NEOS는이러한예외상황이발생할경우디버깅을효율적으로하기위해 CPU 내부레지스터및함수 Call-BackTrace를출력하는기본핸들러가등록되어있고사용자는이러한기본핸들러를변경할수있다. 또한기본핸들러가호출되고나서사용자가원하는디버깅코드를추가할수있는구조도제공한다. 나가며이번글에서는 NEOS 개발환경에대한기본적인소개와사용방법, NEOS 커널의기본적인기능에대해살펴보았다. 이어지는다음글에서는 NEOS 커널의각기능에대해한단계더깊이들어가세부적인 API와복합적인예제코드를주제로두고좀더자세하게설명하는시간을갖고자한다. www.embeddedworld.co.kr 59