'임베디드'에 해당되는 글 5건
- 2009.06.19 Ubuntu에서 NFS setting
- 2007.10.18 [WindowsCE 6.0 특집 ③] 윈도우 임베디드 CE 애플리케이션 디버깅
- 2007.10.18 [WindowsCE 6.0 특집 ②] 윈도우 임베디드 CE 6.0의 Cellcore 및 RIL 기능
- 2007.10.18 [WindowsCE 6.0 특집 ①] 연결된 장치 개발을 위한 윈도우 임베디드 CE 6 플랫폼
- 2007.10.17 Windows CE 개발자를 위한 커뮤니티들..
2009. 6. 19. 14:30
Ubuntu에서 NFS setting
2009. 6. 19. 14:30 in 혼자서 놀기...
NFS는 컴퓨터 사용자가 원격 컴퓨터에 있는 파일을 마치 자신의 컴퓨터에 있는 것처럼 검색하고, 마음대로 저장하거나 수정하도록 해주는 클라이언트/서버형 응용 프로그램이다.
임베디드 시스템 작업을 하기위해선 NFS가 필히 있어야 한다. 없을 시 원활한 개발을 하기가 힘든 상태가 된다는..
뭐.. 여튼 그렇단다.. ^^;
일단, NFS와 관련된 패키지를 설치한다.
$ sudo apt-get install nfs-kernel-server nfs-common portmap
NFS server 설정
$sudo vi /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync) hostname2(ro,sync)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt)
# /srv/nfs4/homes gss/krb5i(rw,sync)
#
/rootfs 192.168.0.100(rw,no_root_squash,no_all_squash,async)
NFS로 사용할 디렉토리명, 마운팅 가능한 디바이스의 아이피, 그 밖의 세팅의 형식으로 세팅을 하면 된다.# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync) hostname2(ro,sync)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt)
# /srv/nfs4/homes gss/krb5i(rw,sync)
#
/rootfs 192.168.0.100(rw,no_root_squash,no_all_squash,async)
/etc/exports 파일 작성 시 디렉토리명과 디바이스 아이피 사이의 공백은 tab 키로 띄운다.
NFS를 재시작한다.
$ sudo /etc/init.d/nfs-kernel-server restart
$ sudo exportfs -r
이렇게 해서 /etc/exports에 설정된 데이터가 적용된다. server는 한 번만 실행해 놓고 새로운 디렉토리가 추가되면 exportfs -r 만 해주면 된다.
'혼자서 놀기...' 카테고리의 다른 글
메모리 단위 (0) | 2009.09.01 |
---|---|
VMware http://vmware.com/info?id=97. 오류 해결 방법 (0) | 2009.08.05 |
Ubuntu 에서 리눅스 개발환경 설정 (0) | 2009.06.22 |
Ubuntu에서 tftp setting (0) | 2009.06.19 |
Ubuntu에서 Samba setting (0) | 2009.06.19 |
2007. 10. 18. 14:11
[WindowsCE 6.0 특집 ③] 윈도우 임베디드 CE 애플리케이션 디버깅
2007. 10. 18. 14:11 in Windows Embedded/Windows Embedded CE 6.0
다음은 'zdnet'에 올라와 있는 라영호님의 글을 스크랩한 것이다.
라영호님은 Windows Embedded 분야 Microsoft MVP로 현제 인벤텍 상하이 연구소에서 Windows Embedded CE 기반의 단말기 및 스마트폰을 개발하고 있으며, Windows Embedded 운영체제에 대한 블로그를 운영하고 있다.
윈도우 임베디드 CE(Windows Embedded CE) 개발 과정을 크게 4가지로 구분해 본다면, 하드웨어에 관련된 부트 로더 개발 부분, 디바이스 드라이버 관련 개발 부분, OS를 포팅하고 최적화 하는 부분, 개발한 장비에서 동작할 애플리케이션을 개발하는 것으로 분류해 볼 수 있다. 각 개발 단계 중 본 칼럼에서는 윈도우 임베디드 CE 상의 애플리케이션 개발이라는 주제, 그 중에서도 애플리케이션 개발 과정 중의 디버깅 방법에 대한 내용에 대해 알아보고자 한다.
윈도우 임베디드 CE용 애플리케이션 개발은 <그림 1>과 같이 윈도우 임베디드 CE 운영체제의 포팅, SDK 생성과 같이 PC 애플리케이션에서는 고려하지 않았던 단계들이 추가되고 개발하는 하드웨어의 LCD나 장치를 고려하고 개발해야 한다는 제한 사항이 있다.
다른 어려움은 PC와 같이 어느 정도 안정화된 운영체제 환경에서 개발을 하는 것이 아니라, 개발 중인 운영체제에서 애플리케이션을 개발해야 한다는 것이다. 문제점이 애플리케이션에서 발생하는 것인지 포팅이 완전히 안 끝난 시스템의 문제인지 확인하기가 난해하다는 것이다.
일례로 필자가 이전 개발 프로젝트 개발 중에 생겼던 문제를 꼽을 수 있다. 필자는 LCD 디바이스 드라이버 개발을 담당하고 있었고, 카메라 프로그램을 위한 API를 제공하여 애플리케이션을 개발하도록 돕고 있었다. 카메라 애플리케이션에서 일정 작업을 하다 보면 Memory Leak가 생기는 경우가 있었다.
LCD 디바이스 드라이버나 카메라 드라이버 역시 충분히 테스트를 했기 때문에 그럴 일이 없다고 장담을 하고 있는 상황이었고, CETK나 테스트 절차를 통해 대부분의 테스트가 Pass를 했기 때문에 안정화가 되었다고 생각하고 애플리케이션만의 문제라고 손 놓고 있었다.
하지만 애플리케이션 개발자의 집요한 분석 리포트와 테스트 방법론을 보고 할 수 없이 드라이버를 디버깅해야 했다. 결국 필자의 잘못으로 결론이 나왔고 많은 사람들의 원망(?)속에서 수정을 해야 했다. 이렇듯 윈도우 임베디드 CE 상의 애플리케이션 개발은 단순히 애플리케이션 개발뿐 아니라 시스템의 문제까지도 고려해야 하는 어려운 개발 작업이다.
따라서 개발을 하다 보면 비주얼 스튜디오 2005의 막강한 디버깅 기능만 가지고 디버깅을 하여 문제점을 찾아내기 어려울 때가 있다. 이러한 문제를 디버깅하기 위해 마이크로소프트는 다양한 디버깅 툴을 제공하고, 필자는 이 툴을 사용하여 어떻게 디버깅을 해 나가야 하는지 알려드리고자 한다.
윈도우 임베디드 CE용 애플리케이션 개발에 있어 버그가 없고 안정적인 프로그램을 만들기 위한 좋은 방법은 무엇일까? 이 질문에 대한 필자의 대답은 ‘개발 경험’+’좋은 설계’+’좋은 툴’+’테스트’+’@’ 이 5가지를 꼽을 수 있겠다. 개발 경험이야 개발하면서 얻어져야 하는 것이고, 좋은 설계 방법이나 방법론적인 방법은 S/W Engineering 책에 수없이 다루어졌기 때문에 본 칼럼에서 다루지는 않겠다.
플랫폼 빌더(Platform Builder), 비주얼 스튜디오라는 개발 환경은 사실상 널리 확인이 된 좋은 개발 환경이다. 여기에 반복적인 테스트를 통해 생겨날 수 있는 모든 문제점을 확인하는 것이야말로 윈도우 임베디드 CE용 애플리케이션 개발의 최적의 조건이라고 할 수 있겠다.
@는 어떤 요소일까? 윈도우 임베디드 CE용 애플리케이션은 임베디드 시스템이라는 것과 윈도우 임베디드 CE라는 운영체제라는 것을 염두에 두어야 한다는 것이다. 임베디드 시스템의 제한 사항을 머리에 항상 염두에 두고 적은 메모리를 차지하고 빠르게 동작할 수 있는 애플리케이션을 만들 수 있도록 노력을 해야 한다.
그러기 위해서는 윈도우 임베디드 CE라는 운영체제가 어떻게 동작하는지에 대한 지식을 가지고 있어야 한다. 6.0으로 오면서 메모리, 슬롯(Slot) 개념, 스레드(Thread)에 대한 제한이 많이 없어 졌지만 윈도우 CE 5.0 버전의 경우 이러한 시스템 제한 요소 때문에 애플리케이션 개발 시에도 문제가 되는 경우가 많았다.
슬롯의 한계 때문에 개별 프로그램으로써 개발 할 때는 잘 되다가도 정작 운영체제에 포함시키고 동작시킬 때는 갑자기 프로세스가 종료 되거나 시스템과 충돌하는 문제가 생기기도 했었다.
이러한 이유로 애플리케이션 개발을 할지라도 시스템에 대한 깊은 이해는 좋은 프로그램을 만들기 위한 밑받침이 되는 것이다. 따라서 윈도우 임베디드 CE에 대한 시스템적인 지식이 좋은 프로그램을 만들기 위한 @가 되는 것이다.
개발한 애플리케이션의 알고리즘적인 버그를 디버깅 하기 위해서는 구현한 세부 코드를 잘 살피고 변수의 변경을 추적하면서 어떠한 부분이 잘못되었는지 추적해 나가야 한다.
하지만 윈도우 임베디드 CE용 애플리케이션은 시스템과의 관계 및 구조를 잘 이해하면서 문제에 대해 집중하여 디버깅을 해야 한다. 이때 도움을 줄 수 있는 것들이 비주얼 스튜디오와 플랫폼 빌더, 그리고 각종 Remote Tool들이다.
이제부터 윈도우 임베디드 CE에서의 애플리케이션 디버깅에 관한 내용에 대해 살펴보도록 하겠다.
비주얼 스튜디오 2005 디버깅
일반적으로 윈도우 임베디드 CE 6.0용 애플리케이션의 개발과 디버깅은 비주얼 스튜디오 2005에서 이루어진다. 이전에 임베디드 비주얼 C++이 있어 플랫폼과 응용프로그램 개발도구 각각 존재하였지만 이제는 비주얼 스튜디오 2005라는 통합 환경으로 운영체제, 애플리케이션의 개발 및 디버깅을 같이 할 수 있게 되었다.
<그림 2>는 비주얼 스튜디오 2005에서 윈도우 임베디드 CE용 애플리케이션을 디버깅 하는 화면이다. 코드상의 문제점을 추적하기 위한 중단점(Breakpoint)의 설정을 통해 프로그램 진행을 잠시 중단하도록 한 후에 ‘한 단계씩 코드 실행’, ‘프로시저 단위 실행’ 명령을 통해 애플리케이션의 진행을 Step By Step 진행시키면서 디버깅 할 수 있다.
비주얼 스튜디오에서 애플리케이션 디버깅의 중요 요소들
이제 비주얼 스튜디오 환경은 윈도우 임베디드 CE 운영체제 개발 환경일 뿐 아니라 애플리케이션 개발 환경이다. 비주얼 스튜디오를 이용한 디버깅 방법은 이제 모두 다 아는 사실이다. 그래도 디버깅에 관련된 중요 키워드를 확인해 본다면 다음과 같다.
(1)중단점(BreakPoint) – 중단점은 윈도우 임베디드 CE용 애플리케이션 디버깅을 하기 위한 기본 요소이다. 프로그램 소스 내에 디버깅을 원하는 중요한 위치에 중단점을 설치하고 거기서부터 디버깅이 이루어진다.
(2)지역, 자동 – 지역 및 자동 창에는 현재 실행중인 코드 영역에 해당하는 지역 변수가 표시되고, 자동 창에는 현재 줄과 코드의 이전 줄에 사용된 변수가 나타나게 된다.
(3)호출 스택 – 애플리케이션 디버깅 시 눈 여겨 별 중요한 부분은 호출 스택 창이다. 호출 스택 창은 디버그 메뉴/창/호출 스택에서 확인할 수 있다. 실시간 디버깅작업에서는 호출된 순서를 보여주는 기능으로 사용할 수 있다. 즉, 현재 프로그램 라인까지 어떠한 함수가 호출되었는지 과정을 보여준다.
복잡한 애플리케이션의 디버깅 시 호출된 함수를 순서대로 역추적하면서 문제점을 확인할 수 있기 때문에 중요한 기능이라고 하겠다. <그림 3>은 비주얼 스튜디오 2005에 호출 스택 화면이다.
(4)메모리, 레지스터 – 애플리케이션 동작 중 레지스터의 값 및 메모리의 내용을 확인하기 위해 사용한다. 레지스터나 실제 메모리를 직접 바꾸면서 디버깅 용도로도 사용할 수 있다. <그림 2> 화면 참조.
윈도우 임베디드 CE 애플리케이션 개발의 첫걸음, 디버그 메시지
DEBUGZONE, DEBUGMSG, RETAILMSG 등의 디버깅 메시지 출력 매크로는 윈도우 임베디드 CE 개발을 하게 되면서 알게 된 중요한 매크로들이다. 시리얼 포트를 통하여 하이퍼 터미널이나 플랫폼 빌더의 디버그메시지 창에 출력된 메시지 정보 디버깅을 위한 중요한 실마리다.
문제에 따라 디버그 존을 설정해 어떠한 메시지를 중점적으로 볼 것인가 선택을 하고 출력된 메시지를 추적해 나가면서 문제점을 추적하는 방법은 고전적이지만 매우 유용한 디버깅 방법이다. 비주얼 스튜디오에서의 디버깅 메시지 출력뿐 아니라 OS 이미지 내에 포함되어서도 유용한 디버깅 정보를 제공하기 때문에 DEBUGMSG의 사용은 디버깅을 위한 기본 준비라고 하겠다.
DEBUGMSG 등록 및 사용 아래와 같다. DEBUGZONE을 등록하고, 등록한 DEBUGZONE에 따라 디버그 메시지를 출력할 수 있도록 DEBUGMSG를 사용하는 예이다. DEBUGMSG의 DEBUGZONE 설정은 실시간 디버깅 환경에서 디버깅 메시지 출력을 선택적으로 조절하면서 좀 더 쉽게 디버깅하고자 하기 위해서 사용한다.
플랫폼 빌더에서 모듈에 대한 DEBUGZONE의 표시와 DEBUGZONE의 선택은 <그림 4>과 같다.
Kernel Debugger를 이용한 애플리케이션 디버깅 방법
비주얼 스튜디오 2005를 이용한 임베디드 CE OS용 애플리케이션의 디버깅 방법은 PC용 애플리케이션을 디버깅하는 것과 별반 차이가 없다. 하지만 윈도우 임베디드 CE에서는 설치 가능한 독립적인 윈도우 임베디드 CE용 애플리케이션을 개발한다기 보다 NAND나 NOR같은 Flash 메모리상에 OS와 함께 탑재되어 동작되는 상황을 고려해야 한다.
UI(User Interface)와 프로그램의 기본 동작에 관련된 사항은 비주얼 스튜디오를 이용하여 디버깅을 마무리하고 OS에 탑재될 환경을 고려하여 OS이미지에 애플리케이션이 포함되어 빌드 되도록 하거나 플랫폼 빌더에서 애플리케이션을 실행시켜 OS 상에서의 애플리케이션의 동작 검증 및 디버깅을 할 수 있도록 한다.
<그림 5>는 윈도우 임베디드 CE 상에서 플랫폼 빌더를 이용해 OS 이미지에 포함된 “WavPlay.exe”라는 윈도우 임베디드 CE용 애플리케이션을 디버깅하는 그림이다. 비주얼 스튜디오에서 애플리케이션 디버깅 방법과 같이 소스 코드에 중단점을 설정한 후 디버깅을 진행하면 된다. 애플리케이션이 OS 이미지 내에 포함되어 있다는 것뿐 디버깅 방법은 차이가 없다.
Remote Tools을 사용한 애플리케이션 디버깅
플랫폼 빌더에서 애플리케이션을 디버깅하는 것은 간단하게는 윈도우 임베디드 CE 운영체제가 동작하는 환경에서 애플리케이션이 제대로 동작하는지 검증하는 것도 있지만 운영체제 사이와의 동작 관계를 확인하는 목적도 있다.
이때 사용하는 것이 플랫폼 빌더의 Remote tool이다. 애플리케이션과 운영체제 간의 미묘한 동작 검증을 하기 위해 사용한다. CeLog는 <표 1>과 같이 윈도우 임베디드 CE 운영체제에 대한 Heap 생성, 인터럽트 처리등과 같은 시스템 이벤트가 발생할 때 관련 이벤트를 기록하여 분석할 수 있게 하는 기능이다.
플랫폼 빌더 Remote Tool 사용을 위한 준비
윈도우 임베디드 CE 운영체제에서의 애플리케이션 디버깅은 위와 같이 플랫폼 빌더 상에서 실행 이미지를 직접 로드하거나 OS 이미지 내에 포함시켜 디버깅을 하면 된다. 하지만 Remote Tool을 이용하면 운영체제와의 관계를 파악하거나 Profiler를 통해 좀더 OS와의 관계를 통한 내부적인 동작내용을 확인할 수 있다.
그러기 위해서는 몇 가지 운영체제의 옵션을 추가해야 한다.
<그림 6>와 같이 프로젝트/속성 명령에서 설정하거나 환경 변수에 다음과 같이 추가 하면 된다. 환경 변수를 설정한 후 OS를 다시 빌드해야 Remote Tool을 이용해 애플리케이션의 문제점을 분석할 수 있는 환경이 준비되는 것이다.
Profiler나 CeLog Enable의 경우 Ethernet이나 USB 통한 KITL뿐만 아니라 ActiveSync를 통해서도 이용할 수 있기 때문에 개발 시 Profiler, CeLog가 Enable된 이미지를 별도로 릴리스한 후 ActiveSync 연결만으로 Application 디버깅을 위한 OS 이미지로 사용할 수 있다.
set IMGCELOGENABLE=1
set IMGPROFILER=1
set IMGAUTOFLUSH=1
Kernel Tracker를 이용한 Memory Leak 디버깅
윈도우 임베디드 CE용 애플리케이션 개발 중 가장 많이 겪는 문제는 애플리케이션의 성능 문제, 잘못된 동작 혹은 시스템 호출을 통한 “Data Abort” 발생 후 시스템의 중단, Memory Leak 문제이다. Data Abort의 발생은 동작 중 잘못된 코드를 호출한 후 생기는 문제이기 때문에 Data Abort가 발생한 시점의 모듈과 관계를 추적하다 보면 쉽게 찾아낼 수 있다.
누적해서 발생하는 문제가 아니라면 Data Abort 발생 지점을 추적하여 Data Abort를 일으키는 모듈의 위치 및 코드까지 추적할 수 있다.(자세한 사항은 Sue Loh’s Blog, http://blogs.msdn.com/sloh/를 참조하기 바란다).
Memory Leak는 애플리케이션에서 메모리 할당과 해지를 제대로 안 할 경우에 발생한다. Memory Leak을 방지하기 위해서는 사용 메모리의 할당과 해지에 대해서 주의해서 프로그램을 해야 한다.
Memory Leak은 Kernel Tracker를 이용하여 보다 손쉽게 디버깅 할 수 있다. 메모리의 할당과 해지를 이벤트 형태로 실시간 볼 수 있기 때문에 어떠한 부분에서 메모리 해지가 일어나지 않아 문제가 생기는지 확인할 수 있는 것이다. Kernel Tracker를 이용한 Memory Leak을 디버깅하기 위한 방법은 다음과 같다.
● Kernel Tracker의 Edit 메뉴에서 Event Filter를 선택한다. Synchronization, Miscellaneous, User Defined, Extensions에 설정된 이벤트 명을 모두 클리어 시키고 Memory 탭 부분만 설정한 채로 남겨둔다. <그림 7> 참고.
● Find Event를 선택하여 메모리 할당에 관련된 Allocate Heap 이벤트와 Free Heap 이벤트, Allocate Virtual Memory와 Free Virtual Memory 이벤트간의 관계 중에 빠진 것이 있는지 확인을 하면서 보다 자세하게 Memory Leak에 대해 디버깅 할 수 있는 것이다. <그림 7>은 Kernel Tracker를 이용한 Memory Leak 디버깅 화면이다. 그림과 같이 Allocate Virtual Memory에 해당하는 Free Virtual Memory가 없기 때문에 Memory Leak이 발생한다는 것을 손쉽게 디버깅할 수 있게 한다. <그림 8>은 Kernel Tracker를 이용해 Memory Leak을 찾아내는 화면이다.
Call Profiler를 이용한 수행시간 최적화
Call Profiler는 프로그램내의 함수나 코드의 동작시간을 수치와 그래픽적으로 표시해주어 어떠한 루틴에서 지연 요소가 생겼는지 분석할 수 있게 해주는 Remote Tool이다.
윈도우 임베디드 애플리케이션 개발이 어느 정도 마무리가 되었다면 Call Profiler로 프로그램의 수행시간을 측정하여 동작 지연 요소가 생기는 부분을 찾아내어 개선하는 방법도 애플리케이션의 성능 개선을 위한 좋은 방법이라고 하겠다. <그림 9>은 Call Profiler를 이용하여 프로그램의 수행 시간을 분석하는 화면이다.
ActiveSync 없이 Visual Studio 2005로 디버깅 하기
비주얼 스튜디오 2005로 윈도우 임베디드 CE용 애플리케이션을 개발하다 보면 귀찮은 부분 중의 하나가 ActiveSync를 통하여 단말기를 연결하고 디버깅을 해야 한다는 것이다.
만약 디버깅을 위한 Ethernet 포트가 있고, 프로세서가 ARMV4i나 X86계열이라면 "www.OpenNETCF.com"를 사용할 것을 추천한다. ActiveSync 없이 TCP/IP를 통해 Windows Embedded CE 장치와 연결하고 Application의 개발과 디버깅을 할 수 있게 하는 유틸리티이다.
테스트 자동화를 통한 Bug Free !
윈도우 임베디드CE 애플리케이션의 개발 방법론은 PC나 웹과 같은데 적용되는 개발 방법론과 결코 다르지 않다. 리펙토링(Refactoring), 페어 프로그래밍(Pair Programming)과 같이 현재 각광 받고 있는 프로그래밍 기법들 역시 윈도우 임베디드 CE 애플리케이션에서도 적용이 가능하다.
하지만 잊지 말아야 할 중요한 차이점은 애플리케이션에서 하드웨어에 대해 좀더 관여를 하고 있다는 점이다. 한 비트 잘못 설정한 프로세서의 레지스터 값이 나비 효과처럼 작용하여 전체 시스템을 불안하게 만드는 원인으로 작용할 수 있다는 것이다. 따라서 작은 문제점도 찾아낼 수 있는 테스트 방법과 기준이 필요한 것이다.
하지만 이러한 문제는 쉽게 발견되는 것이 아니기 때문에 테스트 방법에 대한 기준을 정하고 자동화할 수 있는 방법을 모색하라는 것이다. 말은 쉽지만 많은 시행착오가 있어야 좋은 방법을 찾을 수 있다.
개발 시작 초기에 어떤 테스트를 하고 어떤 테스트 결과를 기대할 것인가에 대한 기준을 정하는 것이 좋다. 완벽한 기준이 있다면 다행이지만 없다면 간단하게라도 만들라는 것이다. 제일 좋은 것은 실제 기기를 사용하는 것과 같은 기준으로 기준을 만들고 테스트 하는 것이다. 즉, "최소한 사용자가 어떻게 사용한다는 가정 하에 기준을 만들고 사용자가 사용하는 것처럼 테스트 하라" 라는 것이다.
예를 들어 내비게이션 시스템을 개발하고 있다고 가정하여 하루에 사용자가 키를 몇 번 누르는지 예측을 하여 제품의 수명만큼 계속 누르는 반복 테스트를 하라는 것이다.
실제로 핸드폰 품질을 책임지고 있는 품질 기술 연구소에서는 자동화된 기계나 로봇을 이용하여 사용자가 핸드폰을 사용하는 형태를 짧은 시간에 집중 테스트 하여 소프트웨어, 하드웨어서 생길 수 있는 문제를 검증하고 있다.
테스트를 하다 보면 개발 중에 예측하지 못하는 다양한 문제점을 이러한 테스트를 통하여 발견 할 수 있다. 실생활에서 특정 키를 연속으로 1만번 누르거나 전원 켜고 끄는 것을 1,000번 이상을 하지는 않는다. 하지만 이러한 반복적인 테스트에서 소프트웨어에서 있을지 모르는 버그를 발견할 수 있는 것이다.
일례로, 필자는 100ms 단위로 키를 반복적으로 1만번 누르는 테스트를 한 적이 있었다. 윈도우 CE의 포팅이나 응용프로그램이 어느 정도 안정화 됐다고 생각을 하고 있었다. 실제로 직접 이것저것 동작 시켜보면 제대로 동작하였다. 하지만 테스트 시작 후 3일 정도가 지난 후 모든 장치가 멈춰있는 것을 보게 되었다. 한마디로 시스템이 다운된 것이다.
나중에 알아낸 사실이지만 드라이버에서 수십 바이트의 메모리 누수가 발생하였고 이게 누적되어 3일 후에는 시스템을 다운 시키는 요소로 작용하였던 것이다. 평상시 간단히 테스트 할 때는 이러한 문제점을 찾을 수 없었다. 이러한 테스트를 하기 위해서 테스트 장치를 모든 회사에서 구비할 필요는 없다.
좀 고민을 하다 보면 몇 줄 안 되는 C 코드로 구현해서 테스트 해볼 수 있기 때문이다. 필자도 테스트 하는 장소가 필자의 회사에서 좀 멀리 떨어진 곳에 있어서 테스트 하러 가기 귀찮아서 고안해낸 방법이다.
다음 코드는 키 입력을 에뮬레이션 하는 간단한 코드이다. 필자는 이 코드를 별도 애플리케이션에서 구현하여 테스트 하는 방법을 사용하고 있다.
Sleep(KEY_PRESS_DURATION);
keybd_event((BYTE) VK_TUP, 0x0, 0, 0);
Sleep(KEY_PRESS_DURATION);
keybd_event((BYTE) VK_TUP, 0x0, KEYEVENTF_KEYUP, 0);
이 방법은 별도의 장치 없이 테스트 하는 방법이며 운영체제의 안정성뿐만 아니라 응용프로그램의 신뢰성 테스트에도 필자는 이용하고 있다. 이런 식의 간단한 루틴으로 간단하게는 키 테스트부터 Application의 반복 동작 시 문제점을 검증할 수 있는 것이다.
조금만 고민 한다면 자동으로 모든 테스트를 할 수 있고, 이러한 자동화된 테스트 방법이 여러분 시스템 및 안정성을 더욱 높여줄 것이다.
끝으로
윈도우 임베디드 CE 상의 애플리케이션 디버깅 방법을 위한 비주얼 스튜디오 2005의 디버깅 방법, 디버그 메시지 등록방법, 디버깅 테크닉 등에 대해 간략히 살펴봤다.
실제 디버깅에 사용되는 방법들은 단순한 한 가지 방법으로는 문제가 해결되지 않을 것이다. 하지만 문제에 대한 실마리는 언제나 비주얼 스튜디오의 디버깅 창에 나온 작은 단서로부터 찾아낼 수 있다.
실제 제품이 기획에서 생산이 되고 출시가 되기까지에는 무수히 반복된 테스트와 디버깅을 통해 안정성을 확보해야 한다. 그래야 비로소 상품으로써의 그 가치를 인정 받을 수 있을 것이다.
디버깅을 하기 위해 밤새 반복된 테스트와 원인 분석을 하고 마침내 그 문제가 해결 됐을 때의 기쁨은 엔지니어가 아니면 누리기 힘든 기쁨일 것이다. 비주얼 스튜디오와 플랫폼 빌더의 막강한 디버깅기능을 이용해 “Bug Free!” Application에 도전해 보기 바란다!
라영호님은 Windows Embedded 분야 Microsoft MVP로 현제 인벤텍 상하이 연구소에서 Windows Embedded CE 기반의 단말기 및 스마트폰을 개발하고 있으며, Windows Embedded 운영체제에 대한 블로그를 운영하고 있다.
윈도우 임베디드 CE(Windows Embedded CE) 개발 과정을 크게 4가지로 구분해 본다면, 하드웨어에 관련된 부트 로더 개발 부분, 디바이스 드라이버 관련 개발 부분, OS를 포팅하고 최적화 하는 부분, 개발한 장비에서 동작할 애플리케이션을 개발하는 것으로 분류해 볼 수 있다. 각 개발 단계 중 본 칼럼에서는 윈도우 임베디드 CE 상의 애플리케이션 개발이라는 주제, 그 중에서도 애플리케이션 개발 과정 중의 디버깅 방법에 대한 내용에 대해 알아보고자 한다.
윈도우 임베디드 CE용 애플리케이션 개발은 <그림 1>과 같이 윈도우 임베디드 CE 운영체제의 포팅, SDK 생성과 같이 PC 애플리케이션에서는 고려하지 않았던 단계들이 추가되고 개발하는 하드웨어의 LCD나 장치를 고려하고 개발해야 한다는 제한 사항이 있다.
다른 어려움은 PC와 같이 어느 정도 안정화된 운영체제 환경에서 개발을 하는 것이 아니라, 개발 중인 운영체제에서 애플리케이션을 개발해야 한다는 것이다. 문제점이 애플리케이션에서 발생하는 것인지 포팅이 완전히 안 끝난 시스템의 문제인지 확인하기가 난해하다는 것이다.
일례로 필자가 이전 개발 프로젝트 개발 중에 생겼던 문제를 꼽을 수 있다. 필자는 LCD 디바이스 드라이버 개발을 담당하고 있었고, 카메라 프로그램을 위한 API를 제공하여 애플리케이션을 개발하도록 돕고 있었다. 카메라 애플리케이션에서 일정 작업을 하다 보면 Memory Leak가 생기는 경우가 있었다.
LCD 디바이스 드라이버나 카메라 드라이버 역시 충분히 테스트를 했기 때문에 그럴 일이 없다고 장담을 하고 있는 상황이었고, CETK나 테스트 절차를 통해 대부분의 테스트가 Pass를 했기 때문에 안정화가 되었다고 생각하고 애플리케이션만의 문제라고 손 놓고 있었다.
하지만 애플리케이션 개발자의 집요한 분석 리포트와 테스트 방법론을 보고 할 수 없이 드라이버를 디버깅해야 했다. 결국 필자의 잘못으로 결론이 나왔고 많은 사람들의 원망(?)속에서 수정을 해야 했다. 이렇듯 윈도우 임베디드 CE 상의 애플리케이션 개발은 단순히 애플리케이션 개발뿐 아니라 시스템의 문제까지도 고려해야 하는 어려운 개발 작업이다.
따라서 개발을 하다 보면 비주얼 스튜디오 2005의 막강한 디버깅 기능만 가지고 디버깅을 하여 문제점을 찾아내기 어려울 때가 있다. 이러한 문제를 디버깅하기 위해 마이크로소프트는 다양한 디버깅 툴을 제공하고, 필자는 이 툴을 사용하여 어떻게 디버깅을 해 나가야 하는지 알려드리고자 한다.
<그림 1 - AppDev.bmp> |
윈도우 임베디드 CE용 애플리케이션 개발에 있어 버그가 없고 안정적인 프로그램을 만들기 위한 좋은 방법은 무엇일까? 이 질문에 대한 필자의 대답은 ‘개발 경험’+’좋은 설계’+’좋은 툴’+’테스트’+’@’ 이 5가지를 꼽을 수 있겠다. 개발 경험이야 개발하면서 얻어져야 하는 것이고, 좋은 설계 방법이나 방법론적인 방법은 S/W Engineering 책에 수없이 다루어졌기 때문에 본 칼럼에서 다루지는 않겠다.
플랫폼 빌더(Platform Builder), 비주얼 스튜디오라는 개발 환경은 사실상 널리 확인이 된 좋은 개발 환경이다. 여기에 반복적인 테스트를 통해 생겨날 수 있는 모든 문제점을 확인하는 것이야말로 윈도우 임베디드 CE용 애플리케이션 개발의 최적의 조건이라고 할 수 있겠다.
@는 어떤 요소일까? 윈도우 임베디드 CE용 애플리케이션은 임베디드 시스템이라는 것과 윈도우 임베디드 CE라는 운영체제라는 것을 염두에 두어야 한다는 것이다. 임베디드 시스템의 제한 사항을 머리에 항상 염두에 두고 적은 메모리를 차지하고 빠르게 동작할 수 있는 애플리케이션을 만들 수 있도록 노력을 해야 한다.
그러기 위해서는 윈도우 임베디드 CE라는 운영체제가 어떻게 동작하는지에 대한 지식을 가지고 있어야 한다. 6.0으로 오면서 메모리, 슬롯(Slot) 개념, 스레드(Thread)에 대한 제한이 많이 없어 졌지만 윈도우 CE 5.0 버전의 경우 이러한 시스템 제한 요소 때문에 애플리케이션 개발 시에도 문제가 되는 경우가 많았다.
슬롯의 한계 때문에 개별 프로그램으로써 개발 할 때는 잘 되다가도 정작 운영체제에 포함시키고 동작시킬 때는 갑자기 프로세스가 종료 되거나 시스템과 충돌하는 문제가 생기기도 했었다.
이러한 이유로 애플리케이션 개발을 할지라도 시스템에 대한 깊은 이해는 좋은 프로그램을 만들기 위한 밑받침이 되는 것이다. 따라서 윈도우 임베디드 CE에 대한 시스템적인 지식이 좋은 프로그램을 만들기 위한 @가 되는 것이다.
개발한 애플리케이션의 알고리즘적인 버그를 디버깅 하기 위해서는 구현한 세부 코드를 잘 살피고 변수의 변경을 추적하면서 어떠한 부분이 잘못되었는지 추적해 나가야 한다.
하지만 윈도우 임베디드 CE용 애플리케이션은 시스템과의 관계 및 구조를 잘 이해하면서 문제에 대해 집중하여 디버깅을 해야 한다. 이때 도움을 줄 수 있는 것들이 비주얼 스튜디오와 플랫폼 빌더, 그리고 각종 Remote Tool들이다.
이제부터 윈도우 임베디드 CE에서의 애플리케이션 디버깅에 관한 내용에 대해 살펴보도록 하겠다.
비주얼 스튜디오 2005 디버깅
일반적으로 윈도우 임베디드 CE 6.0용 애플리케이션의 개발과 디버깅은 비주얼 스튜디오 2005에서 이루어진다. 이전에 임베디드 비주얼 C++이 있어 플랫폼과 응용프로그램 개발도구 각각 존재하였지만 이제는 비주얼 스튜디오 2005라는 통합 환경으로 운영체제, 애플리케이션의 개발 및 디버깅을 같이 할 수 있게 되었다.
<그림 2>는 비주얼 스튜디오 2005에서 윈도우 임베디드 CE용 애플리케이션을 디버깅 하는 화면이다. 코드상의 문제점을 추적하기 위한 중단점(Breakpoint)의 설정을 통해 프로그램 진행을 잠시 중단하도록 한 후에 ‘한 단계씩 코드 실행’, ‘프로시저 단위 실행’ 명령을 통해 애플리케이션의 진행을 Step By Step 진행시키면서 디버깅 할 수 있다.
<그림 2-VS2005 Debug.BMP> |
비주얼 스튜디오에서 애플리케이션 디버깅의 중요 요소들
이제 비주얼 스튜디오 환경은 윈도우 임베디드 CE 운영체제 개발 환경일 뿐 아니라 애플리케이션 개발 환경이다. 비주얼 스튜디오를 이용한 디버깅 방법은 이제 모두 다 아는 사실이다. 그래도 디버깅에 관련된 중요 키워드를 확인해 본다면 다음과 같다.
(1)중단점(BreakPoint) – 중단점은 윈도우 임베디드 CE용 애플리케이션 디버깅을 하기 위한 기본 요소이다. 프로그램 소스 내에 디버깅을 원하는 중요한 위치에 중단점을 설치하고 거기서부터 디버깅이 이루어진다.
(2)지역, 자동 – 지역 및 자동 창에는 현재 실행중인 코드 영역에 해당하는 지역 변수가 표시되고, 자동 창에는 현재 줄과 코드의 이전 줄에 사용된 변수가 나타나게 된다.
(3)호출 스택 – 애플리케이션 디버깅 시 눈 여겨 별 중요한 부분은 호출 스택 창이다. 호출 스택 창은 디버그 메뉴/창/호출 스택에서 확인할 수 있다. 실시간 디버깅작업에서는 호출된 순서를 보여주는 기능으로 사용할 수 있다. 즉, 현재 프로그램 라인까지 어떠한 함수가 호출되었는지 과정을 보여준다.
복잡한 애플리케이션의 디버깅 시 호출된 함수를 순서대로 역추적하면서 문제점을 확인할 수 있기 때문에 중요한 기능이라고 하겠다. <그림 3>은 비주얼 스튜디오 2005에 호출 스택 화면이다.
<그림 3 - CallStack.BMP> |
(4)메모리, 레지스터 – 애플리케이션 동작 중 레지스터의 값 및 메모리의 내용을 확인하기 위해 사용한다. 레지스터나 실제 메모리를 직접 바꾸면서 디버깅 용도로도 사용할 수 있다. <그림 2> 화면 참조.
윈도우 임베디드 CE 애플리케이션 개발의 첫걸음, 디버그 메시지
DEBUGZONE, DEBUGMSG, RETAILMSG 등의 디버깅 메시지 출력 매크로는 윈도우 임베디드 CE 개발을 하게 되면서 알게 된 중요한 매크로들이다. 시리얼 포트를 통하여 하이퍼 터미널이나 플랫폼 빌더의 디버그메시지 창에 출력된 메시지 정보 디버깅을 위한 중요한 실마리다.
문제에 따라 디버그 존을 설정해 어떠한 메시지를 중점적으로 볼 것인가 선택을 하고 출력된 메시지를 추적해 나가면서 문제점을 추적하는 방법은 고전적이지만 매우 유용한 디버깅 방법이다. 비주얼 스튜디오에서의 디버깅 메시지 출력뿐 아니라 OS 이미지 내에 포함되어서도 유용한 디버깅 정보를 제공하기 때문에 DEBUGMSG의 사용은 디버깅을 위한 기본 준비라고 하겠다.
DEBUGMSG 등록 및 사용 아래와 같다. DEBUGZONE을 등록하고, 등록한 DEBUGZONE에 따라 디버그 메시지를 출력할 수 있도록 DEBUGMSG를 사용하는 예이다. DEBUGMSG의 DEBUGZONE 설정은 실시간 디버깅 환경에서 디버깅 메시지 출력을 선택적으로 조절하면서 좀 더 쉽게 디버깅하고자 하기 위해서 사용한다.
플랫폼 빌더에서 모듈에 대한 DEBUGZONE의 표시와 DEBUGZONE의 선택은 <그림 4>과 같다.
<그림 4 - DEBUGZONE.BMP> |
Kernel Debugger를 이용한 애플리케이션 디버깅 방법
비주얼 스튜디오 2005를 이용한 임베디드 CE OS용 애플리케이션의 디버깅 방법은 PC용 애플리케이션을 디버깅하는 것과 별반 차이가 없다. 하지만 윈도우 임베디드 CE에서는 설치 가능한 독립적인 윈도우 임베디드 CE용 애플리케이션을 개발한다기 보다 NAND나 NOR같은 Flash 메모리상에 OS와 함께 탑재되어 동작되는 상황을 고려해야 한다.
UI(User Interface)와 프로그램의 기본 동작에 관련된 사항은 비주얼 스튜디오를 이용하여 디버깅을 마무리하고 OS에 탑재될 환경을 고려하여 OS이미지에 애플리케이션이 포함되어 빌드 되도록 하거나 플랫폼 빌더에서 애플리케이션을 실행시켜 OS 상에서의 애플리케이션의 동작 검증 및 디버깅을 할 수 있도록 한다.
<그림 5>는 윈도우 임베디드 CE 상에서 플랫폼 빌더를 이용해 OS 이미지에 포함된 “WavPlay.exe”라는 윈도우 임베디드 CE용 애플리케이션을 디버깅하는 그림이다. 비주얼 스튜디오에서 애플리케이션 디버깅 방법과 같이 소스 코드에 중단점을 설정한 후 디버깅을 진행하면 된다. 애플리케이션이 OS 이미지 내에 포함되어 있다는 것뿐 디버깅 방법은 차이가 없다.
<그림 5- PlatformDebug.BMP> |
Remote Tools을 사용한 애플리케이션 디버깅
플랫폼 빌더에서 애플리케이션을 디버깅하는 것은 간단하게는 윈도우 임베디드 CE 운영체제가 동작하는 환경에서 애플리케이션이 제대로 동작하는지 검증하는 것도 있지만 운영체제 사이와의 동작 관계를 확인하는 목적도 있다.
이때 사용하는 것이 플랫폼 빌더의 Remote tool이다. 애플리케이션과 운영체제 간의 미묘한 동작 검증을 하기 위해 사용한다. CeLog는 <표 1>과 같이 윈도우 임베디드 CE 운영체제에 대한 Heap 생성, 인터럽트 처리등과 같은 시스템 이벤트가 발생할 때 관련 이벤트를 기록하여 분석할 수 있게 하는 기능이다.
<표 1 - CeLog Event 예> |
플랫폼 빌더 Remote Tool 사용을 위한 준비
윈도우 임베디드 CE 운영체제에서의 애플리케이션 디버깅은 위와 같이 플랫폼 빌더 상에서 실행 이미지를 직접 로드하거나 OS 이미지 내에 포함시켜 디버깅을 하면 된다. 하지만 Remote Tool을 이용하면 운영체제와의 관계를 파악하거나 Profiler를 통해 좀더 OS와의 관계를 통한 내부적인 동작내용을 확인할 수 있다.
그러기 위해서는 몇 가지 운영체제의 옵션을 추가해야 한다.
<그림 6>와 같이 프로젝트/속성 명령에서 설정하거나 환경 변수에 다음과 같이 추가 하면 된다. 환경 변수를 설정한 후 OS를 다시 빌드해야 Remote Tool을 이용해 애플리케이션의 문제점을 분석할 수 있는 환경이 준비되는 것이다.
Profiler나 CeLog Enable의 경우 Ethernet이나 USB 통한 KITL뿐만 아니라 ActiveSync를 통해서도 이용할 수 있기 때문에 개발 시 Profiler, CeLog가 Enable된 이미지를 별도로 릴리스한 후 ActiveSync 연결만으로 Application 디버깅을 위한 OS 이미지로 사용할 수 있다.
set IMGCELOGENABLE=1
set IMGPROFILER=1
set IMGAUTOFLUSH=1
<그림 6-ProfilerSetting.bmp> |
Kernel Tracker를 이용한 Memory Leak 디버깅
윈도우 임베디드 CE용 애플리케이션 개발 중 가장 많이 겪는 문제는 애플리케이션의 성능 문제, 잘못된 동작 혹은 시스템 호출을 통한 “Data Abort” 발생 후 시스템의 중단, Memory Leak 문제이다. Data Abort의 발생은 동작 중 잘못된 코드를 호출한 후 생기는 문제이기 때문에 Data Abort가 발생한 시점의 모듈과 관계를 추적하다 보면 쉽게 찾아낼 수 있다.
누적해서 발생하는 문제가 아니라면 Data Abort 발생 지점을 추적하여 Data Abort를 일으키는 모듈의 위치 및 코드까지 추적할 수 있다.(자세한 사항은 Sue Loh’s Blog, http://blogs.msdn.com/sloh/를 참조하기 바란다).
Memory Leak는 애플리케이션에서 메모리 할당과 해지를 제대로 안 할 경우에 발생한다. Memory Leak을 방지하기 위해서는 사용 메모리의 할당과 해지에 대해서 주의해서 프로그램을 해야 한다.
Memory Leak은 Kernel Tracker를 이용하여 보다 손쉽게 디버깅 할 수 있다. 메모리의 할당과 해지를 이벤트 형태로 실시간 볼 수 있기 때문에 어떠한 부분에서 메모리 해지가 일어나지 않아 문제가 생기는지 확인할 수 있는 것이다. Kernel Tracker를 이용한 Memory Leak을 디버깅하기 위한 방법은 다음과 같다.
● Kernel Tracker의 Edit 메뉴에서 Event Filter를 선택한다. Synchronization, Miscellaneous, User Defined, Extensions에 설정된 이벤트 명을 모두 클리어 시키고 Memory 탭 부분만 설정한 채로 남겨둔다. <그림 7> 참고.
<그림 7- MemoryLeak.bmp> |
● Find Event를 선택하여 메모리 할당에 관련된 Allocate Heap 이벤트와 Free Heap 이벤트, Allocate Virtual Memory와 Free Virtual Memory 이벤트간의 관계 중에 빠진 것이 있는지 확인을 하면서 보다 자세하게 Memory Leak에 대해 디버깅 할 수 있는 것이다. <그림 7>은 Kernel Tracker를 이용한 Memory Leak 디버깅 화면이다. 그림과 같이 Allocate Virtual Memory에 해당하는 Free Virtual Memory가 없기 때문에 Memory Leak이 발생한다는 것을 손쉽게 디버깅할 수 있게 한다. <그림 8>은 Kernel Tracker를 이용해 Memory Leak을 찾아내는 화면이다.
<그림 8 - KernelTracker.bmp> |
Call Profiler를 이용한 수행시간 최적화
Call Profiler는 프로그램내의 함수나 코드의 동작시간을 수치와 그래픽적으로 표시해주어 어떠한 루틴에서 지연 요소가 생겼는지 분석할 수 있게 해주는 Remote Tool이다.
윈도우 임베디드 애플리케이션 개발이 어느 정도 마무리가 되었다면 Call Profiler로 프로그램의 수행시간을 측정하여 동작 지연 요소가 생기는 부분을 찾아내어 개선하는 방법도 애플리케이션의 성능 개선을 위한 좋은 방법이라고 하겠다. <그림 9>은 Call Profiler를 이용하여 프로그램의 수행 시간을 분석하는 화면이다.
<그림 9 - CallProfiler.bmp> |
ActiveSync 없이 Visual Studio 2005로 디버깅 하기
비주얼 스튜디오 2005로 윈도우 임베디드 CE용 애플리케이션을 개발하다 보면 귀찮은 부분 중의 하나가 ActiveSync를 통하여 단말기를 연결하고 디버깅을 해야 한다는 것이다.
만약 디버깅을 위한 Ethernet 포트가 있고, 프로세서가 ARMV4i나 X86계열이라면 "www.OpenNETCF.com"를 사용할 것을 추천한다. ActiveSync 없이 TCP/IP를 통해 Windows Embedded CE 장치와 연결하고 Application의 개발과 디버깅을 할 수 있게 하는 유틸리티이다.
테스트 자동화를 통한 Bug Free !
윈도우 임베디드CE 애플리케이션의 개발 방법론은 PC나 웹과 같은데 적용되는 개발 방법론과 결코 다르지 않다. 리펙토링(Refactoring), 페어 프로그래밍(Pair Programming)과 같이 현재 각광 받고 있는 프로그래밍 기법들 역시 윈도우 임베디드 CE 애플리케이션에서도 적용이 가능하다.
하지만 잊지 말아야 할 중요한 차이점은 애플리케이션에서 하드웨어에 대해 좀더 관여를 하고 있다는 점이다. 한 비트 잘못 설정한 프로세서의 레지스터 값이 나비 효과처럼 작용하여 전체 시스템을 불안하게 만드는 원인으로 작용할 수 있다는 것이다. 따라서 작은 문제점도 찾아낼 수 있는 테스트 방법과 기준이 필요한 것이다.
하지만 이러한 문제는 쉽게 발견되는 것이 아니기 때문에 테스트 방법에 대한 기준을 정하고 자동화할 수 있는 방법을 모색하라는 것이다. 말은 쉽지만 많은 시행착오가 있어야 좋은 방법을 찾을 수 있다.
개발 시작 초기에 어떤 테스트를 하고 어떤 테스트 결과를 기대할 것인가에 대한 기준을 정하는 것이 좋다. 완벽한 기준이 있다면 다행이지만 없다면 간단하게라도 만들라는 것이다. 제일 좋은 것은 실제 기기를 사용하는 것과 같은 기준으로 기준을 만들고 테스트 하는 것이다. 즉, "최소한 사용자가 어떻게 사용한다는 가정 하에 기준을 만들고 사용자가 사용하는 것처럼 테스트 하라" 라는 것이다.
예를 들어 내비게이션 시스템을 개발하고 있다고 가정하여 하루에 사용자가 키를 몇 번 누르는지 예측을 하여 제품의 수명만큼 계속 누르는 반복 테스트를 하라는 것이다.
실제로 핸드폰 품질을 책임지고 있는 품질 기술 연구소에서는 자동화된 기계나 로봇을 이용하여 사용자가 핸드폰을 사용하는 형태를 짧은 시간에 집중 테스트 하여 소프트웨어, 하드웨어서 생길 수 있는 문제를 검증하고 있다.
테스트를 하다 보면 개발 중에 예측하지 못하는 다양한 문제점을 이러한 테스트를 통하여 발견 할 수 있다. 실생활에서 특정 키를 연속으로 1만번 누르거나 전원 켜고 끄는 것을 1,000번 이상을 하지는 않는다. 하지만 이러한 반복적인 테스트에서 소프트웨어에서 있을지 모르는 버그를 발견할 수 있는 것이다.
일례로, 필자는 100ms 단위로 키를 반복적으로 1만번 누르는 테스트를 한 적이 있었다. 윈도우 CE의 포팅이나 응용프로그램이 어느 정도 안정화 됐다고 생각을 하고 있었다. 실제로 직접 이것저것 동작 시켜보면 제대로 동작하였다. 하지만 테스트 시작 후 3일 정도가 지난 후 모든 장치가 멈춰있는 것을 보게 되었다. 한마디로 시스템이 다운된 것이다.
나중에 알아낸 사실이지만 드라이버에서 수십 바이트의 메모리 누수가 발생하였고 이게 누적되어 3일 후에는 시스템을 다운 시키는 요소로 작용하였던 것이다. 평상시 간단히 테스트 할 때는 이러한 문제점을 찾을 수 없었다. 이러한 테스트를 하기 위해서 테스트 장치를 모든 회사에서 구비할 필요는 없다.
좀 고민을 하다 보면 몇 줄 안 되는 C 코드로 구현해서 테스트 해볼 수 있기 때문이다. 필자도 테스트 하는 장소가 필자의 회사에서 좀 멀리 떨어진 곳에 있어서 테스트 하러 가기 귀찮아서 고안해낸 방법이다.
다음 코드는 키 입력을 에뮬레이션 하는 간단한 코드이다. 필자는 이 코드를 별도 애플리케이션에서 구현하여 테스트 하는 방법을 사용하고 있다.
Sleep(KEY_PRESS_DURATION);
keybd_event((BYTE) VK_TUP, 0x0, 0, 0);
Sleep(KEY_PRESS_DURATION);
keybd_event((BYTE) VK_TUP, 0x0, KEYEVENTF_KEYUP, 0);
이 방법은 별도의 장치 없이 테스트 하는 방법이며 운영체제의 안정성뿐만 아니라 응용프로그램의 신뢰성 테스트에도 필자는 이용하고 있다. 이런 식의 간단한 루틴으로 간단하게는 키 테스트부터 Application의 반복 동작 시 문제점을 검증할 수 있는 것이다.
조금만 고민 한다면 자동으로 모든 테스트를 할 수 있고, 이러한 자동화된 테스트 방법이 여러분 시스템 및 안정성을 더욱 높여줄 것이다.
끝으로
윈도우 임베디드 CE 상의 애플리케이션 디버깅 방법을 위한 비주얼 스튜디오 2005의 디버깅 방법, 디버그 메시지 등록방법, 디버깅 테크닉 등에 대해 간략히 살펴봤다.
실제 디버깅에 사용되는 방법들은 단순한 한 가지 방법으로는 문제가 해결되지 않을 것이다. 하지만 문제에 대한 실마리는 언제나 비주얼 스튜디오의 디버깅 창에 나온 작은 단서로부터 찾아낼 수 있다.
실제 제품이 기획에서 생산이 되고 출시가 되기까지에는 무수히 반복된 테스트와 디버깅을 통해 안정성을 확보해야 한다. 그래야 비로소 상품으로써의 그 가치를 인정 받을 수 있을 것이다.
디버깅을 하기 위해 밤새 반복된 테스트와 원인 분석을 하고 마침내 그 문제가 해결 됐을 때의 기쁨은 엔지니어가 아니면 누리기 힘든 기쁨일 것이다. 비주얼 스튜디오와 플랫폼 빌더의 막강한 디버깅기능을 이용해 “Bug Free!” Application에 도전해 보기 바란다!
'Windows Embedded > Windows Embedded CE 6.0' 카테고리의 다른 글
Windows CE 이미지 생성을 위한 configuration files (0) | 2007.10.31 |
---|---|
Windows Embedded CE 6.0 Update Check (0) | 2007.10.29 |
[WindowsCE 6.0 특집 ②] 윈도우 임베디드 CE 6.0의 Cellcore 및 RIL 기능 (0) | 2007.10.18 |
[WindowsCE 6.0 특집 ①] 연결된 장치 개발을 위한 윈도우 임베디드 CE 6 플랫폼 (0) | 2007.10.18 |
Windows CE 개발자를 위한 커뮤니티들.. (0) | 2007.10.17 |
2007. 10. 18. 10:03
[WindowsCE 6.0 특집 ②] 윈도우 임베디드 CE 6.0의 Cellcore 및 RIL 기능
2007. 10. 18. 10:03 in Windows Embedded/Windows Embedded CE 6.0
다음은 'zdnet'에 올라와 있는 성수현님의 글을 스크랩한 것이다.
성수현님은 DST 기술팀에서 WinCE 관련 기술지원과 MS공인 WinCE 교육강사로 활동하고 있으며, 2007년 MS 윈도우즈 임베디드 부분 MVP로 선정되었다.
성수현님은 DST 기술팀에서 WinCE 관련 기술지원과 MS공인 WinCE 교육강사로 활동하고 있으며, 2007년 MS 윈도우즈 임베디드 부분 MVP로 선정되었다.
● Cellcore 와 RIL 이란?
Cellcore와 RIL이란 단어는 윈도우 CE 개발자들에게는 생소한 단어들이다. 왜냐하면 기존에는 모바일에서만 지원이 되었고 CE쪽에서는 필요가 없었기 때문이다. 하지만 하드웨어와 소프트웨어, 네트워크의 발달로 인해 앞으로 윈도우 CE에서도 많이 요구될 것으로 예상되었는지 마이크로소프트에서도 윈도우 임베디드 CE 6.0부터 상기 기능을 지원하게 되었다.
그러면 지금부터 윈도우 CE 개발자를 위해 Cellcore와 RIL 기능에 대해서 알아보자.
-Cellcore란? 무선연결 서비스를 지향하는 기본적인 개념으로 CDMA나 GSM 모듈과의 통신을 가능하게 해주는 것이다. 또한 음성이나 데이터 통신을 가능하게 해주는 컴포넌트이기도 하다.
-RIL이란? Cellcore 시스템 소프트웨어와 Radio 하드웨어를 연결하는 인터페이스로 셀룰러(cellular) 기술을 위한 추상적인 레이어이다.
● 셀룰러 아키텍처
셀룰러 아키텍처는 상당히 복잡한 형태로 되어 있다. 하지만 복잡한 만큼 구현도 어렵지만 그만큼의 많은 기능들도 지원해 준다. 기존의 CE 디바이스에서 네트워크를 이용하려면 Wifi를 이용하거나 유선을 이용했어야 했다. 하지만 윈도우 임베디드 CE 6.0에서 지원하는 Cellcore 기능을 이용한다면 전화뿐만 아니라 인터넷 및 데이터 통신을 할 수 있다.
또한 RIL 드라이버만 포팅하면 GSM의 SIM 카드도 API를 통해 제어가능하며, TAPI를 통해 모뎀통신도 가능하고, 모뎀을 통해 CE 디바이스를 네트워크 연결 통로로 이용해 다른 디바이스에서 인터넷을 가능하게 할 수 있다.
한 예로 그림에서 RIL Proxy를 RIL API를 통해 인스턴스를 생성한 다음 RIL 함수를 통해 전화하거나 문제를 보낼 수 있고, 또한 Miniport 드라이버를 만들게 되면 상위에 있는 NDIS를 통해 인터넷을 할 수 있다. 단 통신모듈 업체에서 RIL 드라이버는 제공해줘야 한다.
기존 5.0때에는 RIL과 비슷한 기능을 구현하기 위해 별도의 CDC(Communication Device Class) 라는 것을 만들었다. 이 CDC는 모뎀과 통신할 수 있도록 하는 것으로 Serial 드라이버를 이용해 모뎀을 동작시키는 방법이다. 이 방법은 시리얼 드라이버를 통해 모뎀을 제어하고 시리얼 드라이버의 PDD 함수에 모뎀을 제어하는 코드를 모두 포팅해줘야 한다.
그러나 윈도우 임베디드 CE 6.0에서 cellcore를 지원하는 만큼 5.0에서 어렵게 포팅했던 방식이 6.0에서 지원하므로 RIL 드라이버를 많이 지원할 것으로 생각이 든다. 이렇게 되면 윈도우 CE에서 RIL을 사용하고자 할 때 어렵게 포팅했던 작업을 크게 줄일 수 있고, 많은 cellcore 기능을 사용하게 될 것으로 기대가 된다.
● RIL
RIL은 크게 RIL Proxy와 RIL Driver로 나누어진다. RIL Proxy는 애플리케이션에서 사용할 수 있는 인스턴스로 CE상에서 여러 개를 생성해서 사용할 수 있다. 반면 RIL Driver의 경우에는 하나만 존재한다.
RIL Proxy는 SIM API, RIL API, CellTSP, SMS API를 통해 접근이 가능하며, VSP(Virtual Serial Port)를 통해서도 접근이 가능하다. 하지만 RIL Proxy는 인스턴스가 많이 생성이 되고, RIL Driver는 하나이기 때문에 RIL Driver는 RIL Proxy에서 들어오는 명령어들을 순차적으로 잘 처리해 줘야 한다.
● RIL Proxy
실제 윈도우 CE에서 RIL Proxy는 ril.dll로 존재하며 ril.dll은 cellcore 애플리케이션에서 생성할 때마다 하나의 인스턴스가 생성된다. 그리고 RIL Proxy는 Microsoft에서 기본적으로 제공을 하며 RIL Driver와 RIL Client 사이의 인터페이스 역할을 담당한다. 또한 RIL 함수를 제어하기 위한 RIL_xxxIOCTLS 함수 등을 제공한다.
대표적인 함수
RIL_Initialize() : RIL Proxy를 생성하기 위한 함수
RIL_Deinitialize() : RIL Proxy를 삭제하기 위한 함수
RIL_Initialize 함수를 통해 RIL Proxy를 생성한다. 여기서 첫 번째, 두 번째, 세 번째 인자가 중요한데, 첫 번째 인자로 RIL 드라이버의 Index를 입력하고 두 번째 인자로 RIL 함수를 처리하면서 result 값들을 받을 수 있는 콜백 함수를 입력하고, 세 번째 인자로 RIL함수에서 발생하는 이벤트를 처리할 수 있는 콜백 함수가 반드시 필요하다.
MyRILResult 함수는 RIL 함수를 통해 명령어를 주는 결과값을 받는 콜백 함수 이다.
RIL 함수로부터 어떠한 이벤트가 들어왔는지 확인할 수 있는 콜백 함수이다.
● RIL Driver
RIL Driver는 윈도우 CE의 전형적인 스트림 인터페이스 드라이버로 PDD(Platform Dependent Driver)와 MDD(Modal Device Driver) 두 부분으로 나누어져 있으며, Windows Embedded CE 6.0 Platform Builder에서 MDD와 PDD의 샘플 코드를 제공한다.
그리고 RIL Driver는 각 모뎀 제공 회사마다 사용되는 모뎀 command가 다르기 때문에 이 commend를 처리해야 하는 코드들이 포함되어 있다. 또한 RIL을 Network로 사용하려면 RIL Miniport Driver가 필요하다.
RIL Miniport Driver의 역할은 RIL Driver와 TCP/IP를 통해 IP 통신을 할 수 있도록 처리하거나, 또는 NDISUIO(NDIS User mode I/O)와 RIL Driver 간의 통신을 해 외부에 인터넷을 연결할 수 있도록 해준다.
● 윈도우 임베디드 CE 6.0에서 RIL 테스트
셀룰러 에뮬레이터(Cellular Emulator)는 전화기를 에뮬레이션 해주는 프로그램으로 윈도우 임베디드 CE에서는 이를 지원하지 않는다. 하지만 Mobile 6 SDK를 설치한다면 셀룰러 에뮬레이터를 CE에서 함께 연동해서 테스트해 볼 수 있다.
테스트해 볼 수 있는 방법은 윈도우 임베디드 CE 6.0에서 에뮬레이터로 OS를 빌드하고 RIL 관련 컴포넌트를 추가하면 에뮬레이터에서 에뮬레이션해주는 시리얼 포트를 통해 Cellular Emulator로 메시지를 전달할 수 있다.
그래서 Windows CE 에뮬레이터에서 전화를 걸거나 SMS 문자를 보내거나 에뮬레이터로부터 보내온 AT command 로그 등을 확인할 수 있다.
글을 마치며
이와 같이 윈도우 임베디드 CE 6.0부터 새롭게 추가된 Cellcore 및 RIL 기능은 네트워크와 통신기능을 점차 중시하는 PMP, CNS 와 같은 모바일 및 임베디드 기기에 또 하나의 차별화된 부가기능을 제공할 것으로 기대한다.
Cellcore와 RIL이란 단어는 윈도우 CE 개발자들에게는 생소한 단어들이다. 왜냐하면 기존에는 모바일에서만 지원이 되었고 CE쪽에서는 필요가 없었기 때문이다. 하지만 하드웨어와 소프트웨어, 네트워크의 발달로 인해 앞으로 윈도우 CE에서도 많이 요구될 것으로 예상되었는지 마이크로소프트에서도 윈도우 임베디드 CE 6.0부터 상기 기능을 지원하게 되었다.
그러면 지금부터 윈도우 CE 개발자를 위해 Cellcore와 RIL 기능에 대해서 알아보자.
-Cellcore란? 무선연결 서비스를 지향하는 기본적인 개념으로 CDMA나 GSM 모듈과의 통신을 가능하게 해주는 것이다. 또한 음성이나 데이터 통신을 가능하게 해주는 컴포넌트이기도 하다.
-RIL이란? Cellcore 시스템 소프트웨어와 Radio 하드웨어를 연결하는 인터페이스로 셀룰러(cellular) 기술을 위한 추상적인 레이어이다.
● 셀룰러 아키텍처
셀룰러 아키텍처는 상당히 복잡한 형태로 되어 있다. 하지만 복잡한 만큼 구현도 어렵지만 그만큼의 많은 기능들도 지원해 준다. 기존의 CE 디바이스에서 네트워크를 이용하려면 Wifi를 이용하거나 유선을 이용했어야 했다. 하지만 윈도우 임베디드 CE 6.0에서 지원하는 Cellcore 기능을 이용한다면 전화뿐만 아니라 인터넷 및 데이터 통신을 할 수 있다.
또한 RIL 드라이버만 포팅하면 GSM의 SIM 카드도 API를 통해 제어가능하며, TAPI를 통해 모뎀통신도 가능하고, 모뎀을 통해 CE 디바이스를 네트워크 연결 통로로 이용해 다른 디바이스에서 인터넷을 가능하게 할 수 있다.
한 예로 그림에서 RIL Proxy를 RIL API를 통해 인스턴스를 생성한 다음 RIL 함수를 통해 전화하거나 문제를 보낼 수 있고, 또한 Miniport 드라이버를 만들게 되면 상위에 있는 NDIS를 통해 인터넷을 할 수 있다. 단 통신모듈 업체에서 RIL 드라이버는 제공해줘야 한다.
기존 5.0때에는 RIL과 비슷한 기능을 구현하기 위해 별도의 CDC(Communication Device Class) 라는 것을 만들었다. 이 CDC는 모뎀과 통신할 수 있도록 하는 것으로 Serial 드라이버를 이용해 모뎀을 동작시키는 방법이다. 이 방법은 시리얼 드라이버를 통해 모뎀을 제어하고 시리얼 드라이버의 PDD 함수에 모뎀을 제어하는 코드를 모두 포팅해줘야 한다.
그러나 윈도우 임베디드 CE 6.0에서 cellcore를 지원하는 만큼 5.0에서 어렵게 포팅했던 방식이 6.0에서 지원하므로 RIL 드라이버를 많이 지원할 것으로 생각이 든다. 이렇게 되면 윈도우 CE에서 RIL을 사용하고자 할 때 어렵게 포팅했던 작업을 크게 줄일 수 있고, 많은 cellcore 기능을 사용하게 될 것으로 기대가 된다.
● RIL
RIL은 크게 RIL Proxy와 RIL Driver로 나누어진다. RIL Proxy는 애플리케이션에서 사용할 수 있는 인스턴스로 CE상에서 여러 개를 생성해서 사용할 수 있다. 반면 RIL Driver의 경우에는 하나만 존재한다.
RIL Proxy는 SIM API, RIL API, CellTSP, SMS API를 통해 접근이 가능하며, VSP(Virtual Serial Port)를 통해서도 접근이 가능하다. 하지만 RIL Proxy는 인스턴스가 많이 생성이 되고, RIL Driver는 하나이기 때문에 RIL Driver는 RIL Proxy에서 들어오는 명령어들을 순차적으로 잘 처리해 줘야 한다.
● RIL Proxy
실제 윈도우 CE에서 RIL Proxy는 ril.dll로 존재하며 ril.dll은 cellcore 애플리케이션에서 생성할 때마다 하나의 인스턴스가 생성된다. 그리고 RIL Proxy는 Microsoft에서 기본적으로 제공을 하며 RIL Driver와 RIL Client 사이의 인터페이스 역할을 담당한다. 또한 RIL 함수를 제어하기 위한 RIL_xxxIOCTLS 함수 등을 제공한다.
대표적인 함수
RIL_Initialize() : RIL Proxy를 생성하기 위한 함수
RIL_Deinitialize() : RIL Proxy를 삭제하기 위한 함수
RIL_Initialize 함수를 통해 RIL Proxy를 생성한다. 여기서 첫 번째, 두 번째, 세 번째 인자가 중요한데, 첫 번째 인자로 RIL 드라이버의 Index를 입력하고 두 번째 인자로 RIL 함수를 처리하면서 result 값들을 받을 수 있는 콜백 함수를 입력하고, 세 번째 인자로 RIL함수에서 발생하는 이벤트를 처리할 수 있는 콜백 함수가 반드시 필요하다.
MyRILResult 함수는 RIL 함수를 통해 명령어를 주는 결과값을 받는 콜백 함수 이다.
RIL 함수로부터 어떠한 이벤트가 들어왔는지 확인할 수 있는 콜백 함수이다.
● RIL Driver
RIL Driver는 윈도우 CE의 전형적인 스트림 인터페이스 드라이버로 PDD(Platform Dependent Driver)와 MDD(Modal Device Driver) 두 부분으로 나누어져 있으며, Windows Embedded CE 6.0 Platform Builder에서 MDD와 PDD의 샘플 코드를 제공한다.
그리고 RIL Driver는 각 모뎀 제공 회사마다 사용되는 모뎀 command가 다르기 때문에 이 commend를 처리해야 하는 코드들이 포함되어 있다. 또한 RIL을 Network로 사용하려면 RIL Miniport Driver가 필요하다.
RIL Miniport Driver의 역할은 RIL Driver와 TCP/IP를 통해 IP 통신을 할 수 있도록 처리하거나, 또는 NDISUIO(NDIS User mode I/O)와 RIL Driver 간의 통신을 해 외부에 인터넷을 연결할 수 있도록 해준다.
● 윈도우 임베디드 CE 6.0에서 RIL 테스트
셀룰러 에뮬레이터(Cellular Emulator)는 전화기를 에뮬레이션 해주는 프로그램으로 윈도우 임베디드 CE에서는 이를 지원하지 않는다. 하지만 Mobile 6 SDK를 설치한다면 셀룰러 에뮬레이터를 CE에서 함께 연동해서 테스트해 볼 수 있다.
테스트해 볼 수 있는 방법은 윈도우 임베디드 CE 6.0에서 에뮬레이터로 OS를 빌드하고 RIL 관련 컴포넌트를 추가하면 에뮬레이터에서 에뮬레이션해주는 시리얼 포트를 통해 Cellular Emulator로 메시지를 전달할 수 있다.
그래서 Windows CE 에뮬레이터에서 전화를 걸거나 SMS 문자를 보내거나 에뮬레이터로부터 보내온 AT command 로그 등을 확인할 수 있다.
글을 마치며
이와 같이 윈도우 임베디드 CE 6.0부터 새롭게 추가된 Cellcore 및 RIL 기능은 네트워크와 통신기능을 점차 중시하는 PMP, CNS 와 같은 모바일 및 임베디드 기기에 또 하나의 차별화된 부가기능을 제공할 것으로 기대한다.
'Windows Embedded > Windows Embedded CE 6.0' 카테고리의 다른 글
Windows Embedded CE 6.0 Update Check (0) | 2007.10.29 |
---|---|
[WindowsCE 6.0 특집 ③] 윈도우 임베디드 CE 애플리케이션 디버깅 (0) | 2007.10.18 |
[WindowsCE 6.0 특집 ①] 연결된 장치 개발을 위한 윈도우 임베디드 CE 6 플랫폼 (0) | 2007.10.18 |
Windows CE 개발자를 위한 커뮤니티들.. (0) | 2007.10.17 |
Windows Embedded CE 6.0 platform builder 설치 순서. (0) | 2007.10.17 |
2007. 10. 18. 09:44
[WindowsCE 6.0 특집 ①] 연결된 장치 개발을 위한 윈도우 임베디드 CE 6 플랫폼
2007. 10. 18. 09:44 in Windows Embedded/Windows Embedded CE 6.0
다음은 'zdnet'에 올라와 있는 서진호님의 글을 스크랩한 것이다.
서진호님은 현재 마이크로소프트 임베디드 디벨로퍼 에반젤리스트로 활동하고 있으며 국내 모바일/임베디드 및 로봇 기술전도에 앞장서고 있다. 현재 서진호 모바일/임베디드 이야기라는 블로그를 운영하고 있다.
서진호님은 현재 마이크로소프트 임베디드 디벨로퍼 에반젤리스트로 활동하고 있으며 국내 모바일/임베디드 및 로봇 기술전도에 앞장서고 있다. 현재 서진호 모바일/임베디드 이야기라는 블로그를 운영하고 있다.
여러분은 어떤 술을 좋아하는가?
남자분들이라면 만추의 그윽한 향기를 느낄 수 있는 몰트 위스키 한 잔을 떠올릴 것이고 여자분들이라면 부드럽고 감미로운 붉은 포도주 한 잔을 떠오를 것이다. 최근 미국 로스앤젤레스에서 개최된 와이어드 넥스트 페스트2007에서 이 와인에 RFID를 달아서 판매된 수량 및 재고 파악 외에 이 와인을 사 가지고 간 고객 정보를 입력 받아 같은 와인 종류를 좋아하는 사람들끼리 커뮤니티를 형성 해주는 일종의 소셜 네트워크(Social Networking) 마케팅을 한 사례가 소개되었다.
생각보다 우리가 알지 못하는 사이에 임베디드 장치는 우리의 생활 속에 사람들과 잘 융합해 가고 있다. 오늘은 이러한 임베디드 장치를 만드는 데 향후 차세대 먹거리가 어떠한 것이 될 것인가에 대해 함께 이야기를 나누어 보도록 하자.
연결형 장치 개발의 도래 배경
국내 유비쿼터스 전도사인 차원용 소장님은 향후 유비쿼터스 시대가 도래하게 되면 우리의 오감을 만족시키는 임베디드 장치와 소프트웨어 서비스가 융복합(NT+IT+BT융합)된다고 예측한 바 있다.
이러한 예측은 [그림1]에서 보듯이 IDC 기관의 2005년도 11월 리포트에서 잘 입증해 주고 있다. 따라서 향후 2010년에는 PC 시장이 점차 태블릿PC 또는 미니PC와 같은 인간 중심의 필기/음성 인식이 탑재된 사용자 인터페이스를 가진 PC로 서서히 진화되며, 지금의 강력한 PC 기능은 개인 사용자가 사용하고 있는 나만의 PC(PDA)로 변모하고 산업 속에서 점차 기계와 기계 간의 스스로 연결되고 동작하는 로봇과 같은 장치로 변모될 것이다.
그만큼 개인과 기업 시장에서의 임베디드 시장은 폭발적인 성장을 할 것이라는 예측을 하고 있다. 특히 연결된 장치라 부르는 인터넷이나 다른 네트워크(무선랜/블루투스)와 같은 연결형 장치의 출시가 주류를 이끌게 될 것이다.
한편, 이러한 연결된 장치는 독립형 장치와 달리 인터넷을 통한 웹 사이트 또는 기업의 기간계 백-엔드 시스템과 접속을 기본으로 한다.
예를 들어 앞에서 말했던 RFID를 이용한 와인 소셜 네트워킹 시스템에서 RFID가 담긴 와인 장치를 클라이언트라고 보면 고객의 동적인 정보를 기록하여 소셜 네트워킹으로 연결해 주는 백-엔드 고객 관리 시스템은 서버라고 볼 수 있다.
지금까지 이러한 클라이언트는 메인 프레임의 호스트부터 다운사이징이 된 후 PC, 그리고 웹을 이용한 클라이언트를 이용하는 것까지 발전해왔다. 그러나 향후 이러한 시스템과 병행하여 임베디드 장치를 클라이언트로 하는 하드웨어, 소프트웨어 및 웹 서비스가 융합하는 이른바 ‘서비스로서의 소프트웨어’ 시장이 도래하게 될 것이다.
결론적으로 말해서 서비스로서의 소프트웨어는 장치 중심에서 사람 중심으로 시나리오가 변경되므로 새로운 비즈니스 모델을 기반한 수익 창출의 증대에 있다. 특히 국내와 같은 하드웨어 기반의 IT 산업에서는 하드웨어와 소프트웨어 지식이 결합하여 다른 나라와의 경쟁에서 우위를 선점할 수 있는 기반이 중요하다.
새로운 여정의 시작, 윈도우 임베디드 CE 6
그렇다면 임베디드 개발자 입장에서 보자면 이것을 어떻게 구현할 것인가에 대해 의문을 가지게 될 것이다. 만일 지금 당장 이를 시제품으로 구현해 보라고 명령이 떨어진다면 연결된 장치라고 해서니까 먼저 임베디드 보드에 통신을 할 수 있는 LAN 포트와 그 밖의 부가적으로 동작시키는 CPU와 메모리, 배터리 등 하드웨어 사양에 대한 조사를 할 것이다.
그런 후에 여러분들은 보드 기반의 소프트웨어 프레임워크인 BSP(Board Support Package)가 있는지 점검하게 될 것이다. 그 위의 여러분들이 동작시킬 장치 드라이버와 사용자 인터페이스에 필요한 쉘(Shell)이나 최종 사용자가 사용할 응용 프로그램을 탑재 시킬 것이다.
여기까지가 일반적으로 임베디드 개발자가 구현하는 범위일 것이다. 여기 범위에서 한 발짝 더 나아가 연결된 장치는 웹 서버를 통한 웹 사이트나 기간계 백-엔드 시스템을 연결하면 된다.
이때 SOAP이나 REST와 같은 표준 통신 프로토콜을 이용한 서비스-지향 아키텍처로 기존의 솔루션과 통합하는 작업이 필요하다. [그림3]은 연결된 장치 기반의 솔루션 아키텍처를 잘 보여주는 예이다.
이러한 연결된 장치는 개인 부문 시장에서는 자동차 내비게이션 또는 IPTV와 같은 솔루션에서 이미 DMB나 안정된 케이블 또는 WiBro/HSDPA와 같은 유무선 네트워크와 연결되어 서비스되고 있다. 그러나 고객들은 좀 더 빠르고 편리하게 사용하며 저전력의 소프트웨어를 원하고 있다.
이것을 뒷받침하기 위해서는 하드웨어 업체도 CPU와 메모리의 용량도 증폭시키는 데 투자를 많이 하고 있지만 소프트웨어 플랫폼들도 이를 긴밀하게 지원하기 위한 프로세스 및 메모리 관리를 혁신시킬 필요가 있다.
윈도우 임베디드 CE 6부터는 10년 동안 사용하던 정적으로 프로세스를 관리하는 방법을 버리고 PC 운영체제와 비슷하게 동적으로 프로세스를 관리하는 방식으로 변경되었다.
윈도우 임베디드 CE 6에서는 3만2,000개의 프로세스와 하나의 프로세스당 4기가 가상 메모리 중 2기가 사용자 메모리를 쓸 수 있어서 기존 버전보다 가상 메모리를 더 사용할 수 있기 때문에 용량이 많은 HD급 화질의 멀티미디어 동영상이나 트래픽이 많은 스트리밍 서비스 등을 소프트웨어적으로 더 가속화시킬 수 있는 기반을 마련했다.
[그림4]는 작년 11월에 발표된 윈도우 임베디드 CE 6 커널 아키텍처를 나타낸 그림이다. 여기에서 보듯이 윈도우 임베디드 CE6는 과거 버전과 달리 커널 모드와 사용자 모드라는 두 가지의 모드로 분리했다.
이것은 커널 장치 드라이버의 성능을 좀더 높이기 위해, 그리고 USB나 SDIO과 같은 입출력 많은 사용자 드라이버로 인하여 견고성을 갖추기 위해 분리시켰다.
또한 임베디드 보드나 칩을 만드는 회사가 포팅을 해주는 NK.EXE 와 윈도우 임베디드 CE 6의 커널을 DLL 형태로 분리하며 KITL 또한 분리하여 개발자가 쉽게 커널 모드에서 디버깅을 할 수 있도록 제공하게 되었다.
그리고 윈도우 임베디드 CE6부터는 커널 소스를 100%로 공유 소스 라이선스 방식으로 공개되어 CE 6 플랫폼 빌더만 있으면 그 소스를 쉽게 접근하게 되었다.
인터넷에 연결된 장치를 양산함으로써 여러분의 코드에 대해 한 가지 더 주의를 기울여야 하는 점이 생기게 되었다. 그것은 말하지 않아도 잘 알겠지만 이제부터 보안을 강화해야 한다.
다시 말해 특정 장치 드라이버에 알 수 없는 메모리 블록 복사로 인하여 버퍼가 오버런이 나거나 특정 포트를 공격하는 것과 같은 인터넷 상에서 발생하는 웜 바이러스 또는 DOS 공격 등을 여러분의 장치에서도 할 수 있다는 이야기이다.
이를 방지하기 위해 CE 6부터는 커널 모드에 곧바로 접근할 수 없고 보안을 강화는 API만 사용해야만 접근할 수 있도록 변경되었다.
윈도우 임베디드 운영체제의 시즌2
시즌2라는 말은 로스트나 프리즌 브레이크와 같은 미국 드라마나 연속극들이 시리즈 물을 편성하기 위해 사용된 말인데 마이크로소프트는 올 하반기에 ‘R2(Release2)’ 라는 이름으로 작년에 발표되었던 윈도우 임베디드 운영체제의 특징을 좀더 보강할 계획이 있다.
특히 윈도우 임베디드 CE6 R2에서는 개발 및 디버깅할 수 있는 플랫폼 빌더나 운영체제 시스템 및 커널, BSP 등은 변경되지 않는다.
그러나 CEPC에서 하드 디스크를 사용할 수 있도록 시리얼 ATA(Sa-ta) 드라이버 지원을 확장했고 부트로더에서는 FAT32 와 ExFAT 파티션을 지원하여 플래시 메모리에서 새로운 멀티 레이어 셀을 지원하여 스트리밍 드라이버 방식인 MDD/PDD 표준 방식으로 변경될 예정이다.
한편 R2의 BSP에서는 연결형 기업 장치를 위하여 씬 클라이언트에서 많이 사용될 X86 프로세서를 지원하는 HP/Compaq t5530 보드를 새롭게 지원하며 ST마이크로 사의 STI7109 보드를 지원하여 비디오 스트리밍을 강화시키며, 마벨 사의 PXA270을 통한 VoIP 솔루션을 참조할 수 있도록 추가될 예정이다.
끝으로 R2 에서는 인터넷 익스플로러와 윈도우 미디어 플레이어가 업데이트 될 예정이다. 아직까지는 데스크톱 PC에서 사용하는 만큼 풀 브라우징을 지원하지 못하지만 보안 강화를 통해 연결형 장치의 보안에 대비를 한 것이 돋보인다. 또한 미디어 플레이어 컨트롤을 버전 7.0으로 데스크톱 PC에서 사용했던 것과 똑같이 API 인터페이스를 지원하기 시작한다.
그리고 연결된 장치를 위해 Windows XP 와 Windows 서버2003 과 같은 원격 서버를 웹 패드와 같은 씬 클라이언트로 접속 및 제어하기 위해 RDP 프로토콜 6.0으로 업그레이드되었다.
통합 커뮤니케이션을 위한 VoIP 솔루션을 더욱 더 쉽고 빠르게 개발할 수 있도록 홈 스크린 사용자 인터페이스 및 폰 응용 프로그램를 개선했으며 멀티 레벨과 멀티 파티에서 비디오 컨퍼런싱을 할 수 있도록 서버 솔루션들과 함께 컴포넌트를 제공한다. 한편 CE6 R2 발표는 11월 OEM테크니컬 세미나에서 발표될 예정이다.
결론: 우리의 내일
이와 같이 임베디드 장치 시장에서는 하드웨어나 소프트웨어 모두 급변하게 변해가고 있다. 그것도 그럴 것이 요즘 택시를 타 보면 자동차 내비게이션 시스템의 맵이 2D에서 3D로 바뀌고 있으며 어디에서 고객이 요청해 오는지 호출 번호가 화면에 떠오른다. 그리고 그 호출 번호에 연결되어 통화할 수 있도록 지원해주는 연결형 장치가 우리 눈앞에 벌써 다가왔다.
그리고 올 여름 서울에서 개최된 전세계 대학생들의 소프트웨어 경연대회인 이매진 컵(Imagine Cup)에서 국내 세종대학교 EN#605팀이 준우승한 소식을 이미 들었을 것이다.
이렇게 준우승을 할 수 있는 이유는 시각장애자에게 학습과 커뮤니케이션을 위해 임베디드 칩을 이용한 장갑을 개발하여 점자 언어를 이용할 수 있도록 창의적 아이디어의 혁신성 때문이었다.
향후 미래의 임베디드 개발에서는 현업에서 나오는 창의적 아이디어로 개발된 솔루션이 매우 중요하며 이것은 플랫폼을 지원하는 회사와, 이를 임베디드 하드웨어와 연결하여 솔루션을 개발하는 국내 파트너와 나아가서는 실용적인 학문을 익혀 학생들이 사회진출을 돕는 대학교 및 연구소의 역할이 상생을 이루어야 한다.
참고 레퍼런스 사이트
남자분들이라면 만추의 그윽한 향기를 느낄 수 있는 몰트 위스키 한 잔을 떠올릴 것이고 여자분들이라면 부드럽고 감미로운 붉은 포도주 한 잔을 떠오를 것이다. 최근 미국 로스앤젤레스에서 개최된 와이어드 넥스트 페스트2007에서 이 와인에 RFID를 달아서 판매된 수량 및 재고 파악 외에 이 와인을 사 가지고 간 고객 정보를 입력 받아 같은 와인 종류를 좋아하는 사람들끼리 커뮤니티를 형성 해주는 일종의 소셜 네트워크(Social Networking) 마케팅을 한 사례가 소개되었다.
생각보다 우리가 알지 못하는 사이에 임베디드 장치는 우리의 생활 속에 사람들과 잘 융합해 가고 있다. 오늘은 이러한 임베디드 장치를 만드는 데 향후 차세대 먹거리가 어떠한 것이 될 것인가에 대해 함께 이야기를 나누어 보도록 하자.
연결형 장치 개발의 도래 배경
국내 유비쿼터스 전도사인 차원용 소장님은 향후 유비쿼터스 시대가 도래하게 되면 우리의 오감을 만족시키는 임베디드 장치와 소프트웨어 서비스가 융복합(NT+IT+BT융합)된다고 예측한 바 있다.
이러한 예측은 [그림1]에서 보듯이 IDC 기관의 2005년도 11월 리포트에서 잘 입증해 주고 있다. 따라서 향후 2010년에는 PC 시장이 점차 태블릿PC 또는 미니PC와 같은 인간 중심의 필기/음성 인식이 탑재된 사용자 인터페이스를 가진 PC로 서서히 진화되며, 지금의 강력한 PC 기능은 개인 사용자가 사용하고 있는 나만의 PC(PDA)로 변모하고 산업 속에서 점차 기계와 기계 간의 스스로 연결되고 동작하는 로봇과 같은 장치로 변모될 것이다.
그만큼 개인과 기업 시장에서의 임베디드 시장은 폭발적인 성장을 할 것이라는 예측을 하고 있다. 특히 연결된 장치라 부르는 인터넷이나 다른 네트워크(무선랜/블루투스)와 같은 연결형 장치의 출시가 주류를 이끌게 될 것이다.
[그림1] 임베디드 장치 성장 예측 |
한편, 이러한 연결된 장치는 독립형 장치와 달리 인터넷을 통한 웹 사이트 또는 기업의 기간계 백-엔드 시스템과 접속을 기본으로 한다.
예를 들어 앞에서 말했던 RFID를 이용한 와인 소셜 네트워킹 시스템에서 RFID가 담긴 와인 장치를 클라이언트라고 보면 고객의 동적인 정보를 기록하여 소셜 네트워킹으로 연결해 주는 백-엔드 고객 관리 시스템은 서버라고 볼 수 있다.
지금까지 이러한 클라이언트는 메인 프레임의 호스트부터 다운사이징이 된 후 PC, 그리고 웹을 이용한 클라이언트를 이용하는 것까지 발전해왔다. 그러나 향후 이러한 시스템과 병행하여 임베디드 장치를 클라이언트로 하는 하드웨어, 소프트웨어 및 웹 서비스가 융합하는 이른바 ‘서비스로서의 소프트웨어’ 시장이 도래하게 될 것이다.
결론적으로 말해서 서비스로서의 소프트웨어는 장치 중심에서 사람 중심으로 시나리오가 변경되므로 새로운 비즈니스 모델을 기반한 수익 창출의 증대에 있다. 특히 국내와 같은 하드웨어 기반의 IT 산업에서는 하드웨어와 소프트웨어 지식이 결합하여 다른 나라와의 경쟁에서 우위를 선점할 수 있는 기반이 중요하다.
[그림2] 임베디드 장치 마켓 분석 |
새로운 여정의 시작, 윈도우 임베디드 CE 6
그렇다면 임베디드 개발자 입장에서 보자면 이것을 어떻게 구현할 것인가에 대해 의문을 가지게 될 것이다. 만일 지금 당장 이를 시제품으로 구현해 보라고 명령이 떨어진다면 연결된 장치라고 해서니까 먼저 임베디드 보드에 통신을 할 수 있는 LAN 포트와 그 밖의 부가적으로 동작시키는 CPU와 메모리, 배터리 등 하드웨어 사양에 대한 조사를 할 것이다.
그런 후에 여러분들은 보드 기반의 소프트웨어 프레임워크인 BSP(Board Support Package)가 있는지 점검하게 될 것이다. 그 위의 여러분들이 동작시킬 장치 드라이버와 사용자 인터페이스에 필요한 쉘(Shell)이나 최종 사용자가 사용할 응용 프로그램을 탑재 시킬 것이다.
여기까지가 일반적으로 임베디드 개발자가 구현하는 범위일 것이다. 여기 범위에서 한 발짝 더 나아가 연결된 장치는 웹 서버를 통한 웹 사이트나 기간계 백-엔드 시스템을 연결하면 된다.
이때 SOAP이나 REST와 같은 표준 통신 프로토콜을 이용한 서비스-지향 아키텍처로 기존의 솔루션과 통합하는 작업이 필요하다. [그림3]은 연결된 장치 기반의 솔루션 아키텍처를 잘 보여주는 예이다.
[그림3] 연결형 장치 아키텍처 |
이러한 연결된 장치는 개인 부문 시장에서는 자동차 내비게이션 또는 IPTV와 같은 솔루션에서 이미 DMB나 안정된 케이블 또는 WiBro/HSDPA와 같은 유무선 네트워크와 연결되어 서비스되고 있다. 그러나 고객들은 좀 더 빠르고 편리하게 사용하며 저전력의 소프트웨어를 원하고 있다.
이것을 뒷받침하기 위해서는 하드웨어 업체도 CPU와 메모리의 용량도 증폭시키는 데 투자를 많이 하고 있지만 소프트웨어 플랫폼들도 이를 긴밀하게 지원하기 위한 프로세스 및 메모리 관리를 혁신시킬 필요가 있다.
윈도우 임베디드 CE 6부터는 10년 동안 사용하던 정적으로 프로세스를 관리하는 방법을 버리고 PC 운영체제와 비슷하게 동적으로 프로세스를 관리하는 방식으로 변경되었다.
윈도우 임베디드 CE 6에서는 3만2,000개의 프로세스와 하나의 프로세스당 4기가 가상 메모리 중 2기가 사용자 메모리를 쓸 수 있어서 기존 버전보다 가상 메모리를 더 사용할 수 있기 때문에 용량이 많은 HD급 화질의 멀티미디어 동영상이나 트래픽이 많은 스트리밍 서비스 등을 소프트웨어적으로 더 가속화시킬 수 있는 기반을 마련했다.
[그림4] 윈도우 임베디드CE 6 커널 아키텍처 |
[그림4]는 작년 11월에 발표된 윈도우 임베디드 CE 6 커널 아키텍처를 나타낸 그림이다. 여기에서 보듯이 윈도우 임베디드 CE6는 과거 버전과 달리 커널 모드와 사용자 모드라는 두 가지의 모드로 분리했다.
이것은 커널 장치 드라이버의 성능을 좀더 높이기 위해, 그리고 USB나 SDIO과 같은 입출력 많은 사용자 드라이버로 인하여 견고성을 갖추기 위해 분리시켰다.
또한 임베디드 보드나 칩을 만드는 회사가 포팅을 해주는 NK.EXE 와 윈도우 임베디드 CE 6의 커널을 DLL 형태로 분리하며 KITL 또한 분리하여 개발자가 쉽게 커널 모드에서 디버깅을 할 수 있도록 제공하게 되었다.
그리고 윈도우 임베디드 CE6부터는 커널 소스를 100%로 공유 소스 라이선스 방식으로 공개되어 CE 6 플랫폼 빌더만 있으면 그 소스를 쉽게 접근하게 되었다.
인터넷에 연결된 장치를 양산함으로써 여러분의 코드에 대해 한 가지 더 주의를 기울여야 하는 점이 생기게 되었다. 그것은 말하지 않아도 잘 알겠지만 이제부터 보안을 강화해야 한다.
다시 말해 특정 장치 드라이버에 알 수 없는 메모리 블록 복사로 인하여 버퍼가 오버런이 나거나 특정 포트를 공격하는 것과 같은 인터넷 상에서 발생하는 웜 바이러스 또는 DOS 공격 등을 여러분의 장치에서도 할 수 있다는 이야기이다.
이를 방지하기 위해 CE 6부터는 커널 모드에 곧바로 접근할 수 없고 보안을 강화는 API만 사용해야만 접근할 수 있도록 변경되었다.
윈도우 임베디드 운영체제의 시즌2
시즌2라는 말은 로스트나 프리즌 브레이크와 같은 미국 드라마나 연속극들이 시리즈 물을 편성하기 위해 사용된 말인데 마이크로소프트는 올 하반기에 ‘R2(Release2)’ 라는 이름으로 작년에 발표되었던 윈도우 임베디드 운영체제의 특징을 좀더 보강할 계획이 있다.
특히 윈도우 임베디드 CE6 R2에서는 개발 및 디버깅할 수 있는 플랫폼 빌더나 운영체제 시스템 및 커널, BSP 등은 변경되지 않는다.
그러나 CEPC에서 하드 디스크를 사용할 수 있도록 시리얼 ATA(Sa-ta) 드라이버 지원을 확장했고 부트로더에서는 FAT32 와 ExFAT 파티션을 지원하여 플래시 메모리에서 새로운 멀티 레이어 셀을 지원하여 스트리밍 드라이버 방식인 MDD/PDD 표준 방식으로 변경될 예정이다.
한편 R2의 BSP에서는 연결형 기업 장치를 위하여 씬 클라이언트에서 많이 사용될 X86 프로세서를 지원하는 HP/Compaq t5530 보드를 새롭게 지원하며 ST마이크로 사의 STI7109 보드를 지원하여 비디오 스트리밍을 강화시키며, 마벨 사의 PXA270을 통한 VoIP 솔루션을 참조할 수 있도록 추가될 예정이다.
끝으로 R2 에서는 인터넷 익스플로러와 윈도우 미디어 플레이어가 업데이트 될 예정이다. 아직까지는 데스크톱 PC에서 사용하는 만큼 풀 브라우징을 지원하지 못하지만 보안 강화를 통해 연결형 장치의 보안에 대비를 한 것이 돋보인다. 또한 미디어 플레이어 컨트롤을 버전 7.0으로 데스크톱 PC에서 사용했던 것과 똑같이 API 인터페이스를 지원하기 시작한다.
그리고 연결된 장치를 위해 Windows XP 와 Windows 서버2003 과 같은 원격 서버를 웹 패드와 같은 씬 클라이언트로 접속 및 제어하기 위해 RDP 프로토콜 6.0으로 업그레이드되었다.
통합 커뮤니케이션을 위한 VoIP 솔루션을 더욱 더 쉽고 빠르게 개발할 수 있도록 홈 스크린 사용자 인터페이스 및 폰 응용 프로그램를 개선했으며 멀티 레벨과 멀티 파티에서 비디오 컨퍼런싱을 할 수 있도록 서버 솔루션들과 함께 컴포넌트를 제공한다. 한편 CE6 R2 발표는 11월 OEM테크니컬 세미나에서 발표될 예정이다.
결론: 우리의 내일
이와 같이 임베디드 장치 시장에서는 하드웨어나 소프트웨어 모두 급변하게 변해가고 있다. 그것도 그럴 것이 요즘 택시를 타 보면 자동차 내비게이션 시스템의 맵이 2D에서 3D로 바뀌고 있으며 어디에서 고객이 요청해 오는지 호출 번호가 화면에 떠오른다. 그리고 그 호출 번호에 연결되어 통화할 수 있도록 지원해주는 연결형 장치가 우리 눈앞에 벌써 다가왔다.
그리고 올 여름 서울에서 개최된 전세계 대학생들의 소프트웨어 경연대회인 이매진 컵(Imagine Cup)에서 국내 세종대학교 EN#605팀이 준우승한 소식을 이미 들었을 것이다.
이렇게 준우승을 할 수 있는 이유는 시각장애자에게 학습과 커뮤니케이션을 위해 임베디드 칩을 이용한 장갑을 개발하여 점자 언어를 이용할 수 있도록 창의적 아이디어의 혁신성 때문이었다.
향후 미래의 임베디드 개발에서는 현업에서 나오는 창의적 아이디어로 개발된 솔루션이 매우 중요하며 이것은 플랫폼을 지원하는 회사와, 이를 임베디드 하드웨어와 연결하여 솔루션을 개발하는 국내 파트너와 나아가서는 실용적인 학문을 익혀 학생들이 사회진출을 돕는 대학교 및 연구소의 역할이 상생을 이루어야 한다.
참고 레퍼런스 사이트
와이어드 넥스트 페스트2007
스터디 비즈니스 닷컴, 차원용 소장
OEM 테크니컬 세미나
이매진 컵 국내 첫 우승
'Windows Embedded > Windows Embedded CE 6.0' 카테고리의 다른 글
[WindowsCE 6.0 특집 ③] 윈도우 임베디드 CE 애플리케이션 디버깅 (0) | 2007.10.18 |
---|---|
[WindowsCE 6.0 특집 ②] 윈도우 임베디드 CE 6.0의 Cellcore 및 RIL 기능 (0) | 2007.10.18 |
Windows CE 개발자를 위한 커뮤니티들.. (0) | 2007.10.17 |
Windows Embedded CE 6.0 platform builder 설치 순서. (0) | 2007.10.17 |
Windows Embedded CE 6.0 관련 웹 캐스트 (0) | 2007.10.17 |
2007. 10. 17. 20:21
Windows CE 개발자를 위한 커뮤니티들..
2007. 10. 17. 20:21 in Windows Embedded/Windows Embedded CE 6.0
요즘들어 WinCE로 개발하는 개발자들 사이에서 'Windows Embedded CE 6.0'에 대한 관심이 많아지고 있다.
국내의 경우를 보면 삼성전자 반도체 사업부LSI팀 외에도 어드벤텍, DST, 매직아이 등의 회사들도 Windows Embedded CE 6.0용의 BSP개발을 거의 마무리, 테스트중에 있다고 한다. 올 하반기부터는 이를 기반으로 하는 6.0 플랫폼 기반의 하드웨어(교육용 보드 및 제품)를 사용할 수 있지 않을까 생각한다.
이와 더불어 WECOM, WEEG등의 Windows
CE에 관련된 임베디드 커뮤니티 등도 활성화 되어있는 상태이다.
이에 따라 MS쪽에서도 커널과 CSP기반에서 BSP를 개발할 수 있도록 CE 6.0용 BSP Wiki를 공개하고 있다. 이 Wiki는 BSP를 개발하는데 필요한 기본지식은 물론이고, 포팅할 부분과 디버깅, 테스트 방법에 대해서도 설명이 되어 있다고 한다.
그렇지 않아도 개발하는데 많은 어려움을 겪고 있는 임베디드 부분에서 이러한 커뮤니티 활성화를 위한 웹페이지가 있다는 것은 크나 큰 도움이
되지않을가 생각한다.
함께 개발하고 함께 배워갈 수 있는 위키 혹은 커뮤니티가 되길 바란다.이 외에도 활성화 되고 잘 활용할 수 있는 사이트를 아시는 분들은 좀 갈켜주세요~ ㅋ
'Windows Embedded > Windows Embedded CE 6.0' 카테고리의 다른 글
[WindowsCE 6.0 특집 ②] 윈도우 임베디드 CE 6.0의 Cellcore 및 RIL 기능 (0) | 2007.10.18 |
---|---|
[WindowsCE 6.0 특집 ①] 연결된 장치 개발을 위한 윈도우 임베디드 CE 6 플랫폼 (0) | 2007.10.18 |
Windows Embedded CE 6.0 platform builder 설치 순서. (0) | 2007.10.17 |
Windows Embedded CE 6.0 관련 웹 캐스트 (0) | 2007.10.17 |
Platform Builder 6.0의 Catalog Items View... (0) | 2007.10.17 |