안녕하세요. 이미 이전부터 임베디드 리눅스 시스템이 어떤 것이고 필요성과 함께 개발환경 구축에 대한 말씀을 올렸습니다만 지금껏 Microsoft사의 OS에서만 개발해 왔고, 최근에야 임베디드 리눅스 시스템을 알게 되었기 때문에 임베디드 리눅스 부분에 대해서는 초보라서, 제가 올리는 강좌는 초보입장을 충분히 반영해서 작성했다고 생각했습니다.

그러나 지금껏 다른 환경에서 개발해 왔다고 해도 저 나름대로 쌓은 경력과 실제로 겪은 경험 때문인지, 또한 전문 강사가 아니고 언변이나 글 재주가 없어서 쉽게 작성했다고 했습니다만, 역시 처음 시작하시는 분들께는 어려운 부분이 많았던 것으로 생각됩니다.

이런 이유로 임베디드 시스템에 대해 조금 더 자세히 말씀드리면서, 강좌 글에 따라 그대로 하시면 제가 현재 사용하고 있는 개발 작업 환경을 똑같이 구성하실 수 있도록 "따라하기" 글을 올리려고 합니다.

처음 글은 임베디드 시스템에 대한 얘기와 함께 어떻게 개발환경을 구축하는지부터 시작해서 리눅스를 설치하고 마지막 글에는 QT를 설치하고 프로그래밍해서 임베디드 보드에서 QT프로그램을 실행하는 방법을 올리도록 하겠습니다.

처음 입문하시는 분은 " 따라하기" 글을 먼저 참고하시고 다른 강좌 글을 참고하신다면 임베디드 리눅스 개발에 이해가 쉽지 않을까 감히 말씀을 드립니다. 앞으로 많은 관심을 부탁드리며, 혹 틀린 내용이 있어서 말씀 주시면 감사하겠습니다. ^^

내용이 조금 기네요. 해서 둘로 나누었습니다. 이번 동영상은 가상 PC 프로그램 사용에 대한 이야기입니다. ^^

임베디드 리눅스 시스템 개발환경

임베디드 리눅스 시스템을 개발한다는 것은 목적으로 하는 시스템의 일부 기능을 임베디드 보드로 구성하고, 그 하드웨어를 바탕으로 시스템이 움직이도록 소프트웨어를 개발하는 업무가 되겠습니다. 특히 임베디드 리눅스 시스템은 기존의 다른 마이컴과는 달리 임베디드 리눅스가 운영됩니다.

즉, 개발자의 프로그램만 탑재되고 실행되는 것이 아니라 O.S.가 설치되고 그 위해 실행되는 애플리케이션을 작성하게 됩니다. "임베디드 리눅스 시스템"은 말 그대로 리눅스가 설치되는 시스템으로 프로그램을 작성한다면 리눅스 프로그램을 작성한다는 얘기가 됩니다. 그러므로 리눅스에서 실행되는 프로그램을 만들 수 있도록 최소한 컴파일러를 실행할 수 있어야 하겠습니다.

그러므로 최소한 컴파일러를 실행시킬 리눅스가 필요합니다.

임베디드 리눅스 시스템의 장점

임베디드 리눅스 시스템에서 실행되는 프로그램을 작성한다고 해서 특별한 것은 없습니다. 우리가 알고 있는 리눅스에서 실행되는 프로그램을 작성하는 것과 다를 바가 없습니다. 특별하다면 보드를 운영하는 CPU가 다르다는 것일 뿐입니다.

예를 들어 최근에 강좌에 올린 사운드카드로 wav파일을 재생하거나 마이크 입력을 wav로 녹음하는 프로그램을 PC에서 작성했습니다. 디버깅에서 완성까지 모두 PC에 설치된 리눅스에서 작업했습니다.

제가 사용하는 보드가 Arm CPU를 사용하는 Arm Board인데, 이 보드에서 실행할 때에는 Arm 컴파일러로 컴파일 한번 해 준 것이 전부입니다.

이렇게 PC에서 작성한 프로그램을 CPU가 다르고 하드웨어 구성이 전혀 다른 Arm Board에서 실행할 수 있는 이유는 Arm Board가 Embedded Linux System이기 때문입니다. 그 Arm Board에 리눅스 O.S.가 올려져 있기 때문으로 이와 같은 개발이 가능하다는 점이 Embedded Linux System 최대의 장점이 되겠습니다.

Target Board

Embedded Board는 사용되는 CPU에 따라서 Arm Board 니, Mips Board니 하고 말씀을 합니다만 사용하는 CPU에 관계 없이 최종적으로 만들려고 하는 보드를 특히 Target Board라고 총칭해서 말을 합니다. 이렇게 말하는 것이 편한 이유는 지금은 Arm Board를 이용하여 프로그램을 작성하지만 그 프로그램이 Arm Board에서만 실행되는 프로그램이 아닙니다. 같은 프로그램 소스를 컴파일러만 바꾸어서 컴파일만 해 주면 Mips Board에서 실행되는 프로그램을 바로 만들 수 있습니다.

마이컴에서처럼 프로그램이 Target CPU에 따라서 종속되고 코딩이 달라지기 때문에 특정 CPU의 이름에 따라 보드를 불리겠습니다만 Embedded Linux Board는 이미 해당 보드에 최적화된 리눅스가 설치되고 실행되고 있기 때문에 CPU 구분에 영향을 받지 않습니다.

그러므로 Arm Board나 Mips Board로 말하는 경우는 CPU를 무엇으로 만들어졌는지 명확히 말하기 위해 사용되겠습니다만 CPU구분이 필요 없고, 프로젝트와 작업을 기준으로 한다면 Target Board라는 용어를 사용하게 됩니다.

Native Compiler/Cross Compiler

리눅스에서 프로그램을 작성하고 gcc로 컴파일하면, gcc 컴파일러를 실행하고 있는 시스템에서 실행되는 프로그램을 만들어 줍니다. 즉, i386 CPU 리눅스에서 gcc를 이용하여 컴파일하게 되면 i386용 프로그램을 만들어 준다는 얘기로 자기가 속한 환경에서 실행되는 프로그램을 만들어 주는 컴파일러를 Native Compiler이라고 합니다.

이에 대해 arm-linux-gcc 는 gcc와 같은 C 컴파일러이고 gcc 처럼 같은 i386 PC의 리눅스에서 실행되는 컴파일러이지만 컴파일해서 만들어지는 프로그램은 i386이 아닌 arm cpu 보드에서 실행되는 프로그램을 만들게 됩니다. 즉, 자기 집안 것이 아닌 다른 집안 것을 만들어 주는 컴파일러는 Cross Compiler이라고 합니다.

리눅스 시스템이 필요

그러므로 Embedded Linux System을 개발하기 위해서는 Cross Compiler를 사용할 수 있어야 하겠습니다. 당연한 말씀이겠습니다만 이 Cross Compiler를 실행하기 위해서는 리눅스 시스템이 필요합니다.

또한 타켓보드에 바로 실행되는 프로그램을 디버깅 작업할 때마다 upload해서 실행해 보기보다는 Native Compiler를 이용하여 리눅스에서 먼저 작업하고 확인한다면 개발이 더욱 용이할 것입니다. 이런 이유 때문이라도 리눅스 시스템이 필요합니다.

가장 좋은 임베디드 리눅스 개발 환경

저의 주관적인 생각입니다만 제일 좋은 개발환경은 리눅스가 설치된 PC에서 모든 작업을 그 안에서 처리하는 거입니다. 컴파일러가 실행되는 리눅스 시스템만 있으면 임베디드 리눅스 시스템을 개발할 수 있습니다. 당연한 말씀을 또 합니다만 리눅스에 빨리 친숙해지고 vi와 같은 리눅스의 개발툴을 현란하게 사용할 수 있도록 익숙해진다면 이미 훌륭한 개발환경을 갖춘 셈이 됩니다.

 

 

MS 윈도우

그러나 문제는 지금껏 MS 윈도즈에 익숙해 있고, 손에 익은 유틸리티가 대부분 MS 윈도즈 프로그램이라는 것이 문제입니다. 개발 작업이 어디 에디터와 컴파일러 가지고 다 됩니까? 때로는 메신저로 친구와 얘기도 나누고, 자주 사용하는 mp3로 음악도 즐겨야 합니다. 그리고 그렇게 강력하다는 vi 에디터는 아무리 노력해도 어렵고 불편만 하고, 자료를 정리하거나 윗 분이 요구하는 문서를 인쇄하기 위해서도 익숙한 워드도 간간히 사용해야 합니다.

이것이 바로 제가 겪는 문제입니다. 그나마 노력한 덕분에 이전과는 달리 조금 리눅스에 친숙해 졌지만 아직 MS 윈도우가 더 편합니다. 그리고 앞서 말씀드린대로 이미 내 손 같은 에디터와 유틸리티가 대부분 MS 윈도즈용 프로그램입니다.

그 다음으로 좋은 임베디드 리눅스 개발 환경

이와 같이 리눅스 환경에 어려움을 겪는 분은 리눅스에서 뿐이 할 수 없는 일은 리눅스에서 하고, 에디터를 이용하여 프로그램을 작성하거나 웹 검색, 워드 사용같이 손에 익은 프로그램은 윈도우에서 사용하는 것입니다.

이렇게 하기 위해서는 프로그램 소스가 리눅스에 있는 것이 편합니다. 리눅스에서 실행되는 컴파일러를 이용할 것이므로 리눅스에 프로그램 소스가 있으면 바로 컴파일할 수 있습니다.

타겟보드에서도 컴파일된 실행 파일이 있는 리눅스 시스템의 디렉토리로 들어갈 수 있으면 별다른 작업 없이 바로 그 자리에서 프로그램을 실행할 수 있을 것입니다.

자, 윈도우 시스템에서 리눅스 시스템으로 연결하는 문제와 타켓보드에서 역시 리눅스 시스템으로 연결하는 문제는 조금 있다가 얘기한다고 해도 일단은 PC가 두 대가 있어야 합니다. 리눅스용과 윈도우용으로 말이죠.

문제는 PC가 한 대

다시 말씀드리지만 경험상으로도 PC를 두 대를 놓고 하나는 리눅스, 또 하나는 윈도우를 설치하여 개발하시는 것이 매우 편합니다. 그러나 사정에 따라 PC가 한 대뿐이라면 리눅스만 설치해서 개발해야 될까요? 아닙니다. 몇가지 방법이 있는데 그 방법을 알아보겠습니다.

멀티 부팅

MS 윈도우를 먼저 설치하고 리눅스를 다른 하드디스크나 파티션에 따로 설치하는 것입니다. 요즘에는 간편하게 멀티 부팅해서 사용할 수 있는 우분투 리눅스가 있어서 설치도 편합니다. 그러나 리눅스에서 모든 작업을 하지 못하는 이상 필요할 때마다 윈도우로, 리눅스로 부팅해야 하기 때문에 매우 불편합니다.

이런 불편 때문에 리눅스에 더욱 친숙해 질 수 있겠습니다만 매우 불편한 것은 사실입니다.

가상 PC 프로그램 사용

멀티 부팅이 불편하다면 부팅하지 말고 2개의 OS를 사용하는 방법이 있겠습니다. 그 중 하나가 가상 PC 프로그램을 이용하는 방법입니다.

말 그대로 가상의 PC로 프로그램에 의해 만들어진 만들어진 PC이기 때문에 MS 윈도우 안에 또 다른 PC를 켤 수 있습니다. 그리고 그 PC에 리눅스나 기타 원하는 OS를 설치하여 같은 시간에 서로 다른 OS를 실행할 수 있습니다.

이런 가상 PC를 만들어 주는 프로그램으로는 아래와 같은 프로그램이 있습니다.

  • VmWare
  • Virtual PC
  • Virtual Box

이중에서 저는 VmWare를 권하고 싶습니다. 상용 프로그램이라 금전적인 부담이 되지만 완성도 면에서나 사용의 편리성, 가상 PC에서 하드웨어 지원 같은 면에서 다른 프로그램 보다 좋다고 생각됩니다. 그러나 이것은 어디까지나 지극히 저의 개인적인 생각입니다. ^^

CygWin

가상 PC는 하나의 PC로 여러 OS를 동시에 사용할 수 있도록 해주는 매우 유용하고 훌륭한 프로그램임에 틀림없지만 시스템의 자원을 나누어 써야 하기 때문에 사양이 낮은 노트북이나 PC에서는 사용하기 어렵습니다. 무엇보다도 매우 느리기 때문이죠. 이렇게 느린 PC를 이용해야 한다면 절대적으로 리눅스를 다른 PC에 설치하라고 조언하고 싶습니다만 안된다면 CygWin을 사용하는 방법이 있습니다.

CygWin은 MS 윈도우에서 리눅스 프로그램을 실행시킬 수 있는 에뮬레이터 프로그램입니다. 일단 컴파일러만이라도 실행할 수 있다면 리눅스 프로그램이든 임베디드용이든 프로그램을 만들 수 있습니다.

그러나 만들어진 프로그램을 CygWin에서 실행할 수 있다는 것은 장담하기 어렵습니다. CygWin은 완벽한 리눅스가 아니기 때문이죠. 저도 저의 PC가 느려 CygWn을 이용하려 했습니다만, fork()라 공유메모리를 사용해야되는 프로그램은 실행할 수 없다는 것을 알고 해결하는 방법을 찾는 대신에 그냥 포기했습니다.

일단 경험한 것이 그 두 문제이지만 해결한다고 해도 앞으로 어떤 문제가 생길지 모르기 때문이죠. 그 문제를 해결하기 위해 시간을 사용한다는 것은 왠지 그냥 소비하는 것이라 생각되서 CygWin 사용을 중지했습니다.

물론 리눅스에서는 오로지 컴파일만 하고 실행은 반드시 타켓 보드에서 한다면 CygWin을 사용햐셔도 좋겠습니다만 저 개인적으로는 권하고 싶지 않습니다. ^^

따라하기 첫 글이라 처음에는 짧게 하려고 했는데 작업하면서 냉용 많아 졌네요. 그러다 보니 맞춤법 확인도 못했습니다. 이점 양해를 부탁드립니다. 다음 시간에는 리눅스를 설치하기 위한 준비 작업부터 하겠습니다. 예로, 리눅스를 설치할 때 입력하는 IP는 어떻게 지정하고, 파티션은 어떻게 나누는지에 대한 얘기입니다.

다음 강좌를 기대해 주세요. ^^