유정현 과장 / chris@mdstec.com 마이크로소프트 Windows Embedded MVP로 MDS테크놀로지(주)에서 윈도우 임베디드 운영체제 기술지원을 담당하고 있다. 다양한 마이크로소프트 임베디드 세미나와 개발 실습 교육을 통해 윈도우 임베디드 기술 전도사 로서 활약하고 있다. 윈도우 임베디드 개발자 커뮤니티: www.iwecom.co.kr 윈도우와 IoT 이야기 페이스북: fb.com/mdswinemb 윈도우 임베디드 제품 솔루션: www.embedsolution.com MDS테크놀로지 홈페이지: www.mdstec.com 마이크로소프트 차세대 IoT 플랫폼 Windows 10 IoT Core Internet Of Things 시대를 대비하는 마이크로소프트 전략이 Build 2015 행사를 통해 공개 되었다. 마이크로소프트의 IoT 전략은 크게 IoT 디바이스와 클라우드 전략으로 나뉜다. 클라우드 플랫폼은 마이크로소프트 애저를 통해 진행되고 있다. 애저에 서비스 버스, 이벤트 허브, 실시간 분석 (Azure Stream Analytics) 등의 IoT 시나리오를 고려한 기능들이 업데이트 되었고, 머신 러닝이나 파워 BI 등의 솔루션으로 데이터를 가공하는 것이 마이크로소프트의 IoT 클라우드 전략이다. 윈도우 10 의 출시와 더불어 마이크로소프트의 IoT 디바이스 전략도 업데이트 되었다. 기존 IoT 디바이스를 겨냥한 마이크로소프트의 플랫폼은 윈도우 임베디드와 더불어, 윈도우 10 출시를 통해 IoT 디바이스를 위한 플랫폼 세 가지를 더 추가하였다.
<그림 1> 윈도우 10 기반의 IoT 플랫폼 새롭게 출시된 세 개의 플랫폼 중 가장 흥미로운 플랫폼은 그 동안 코드명 아테네(Athens) 로 알려졌던 Windows 10 IoT Core(이하 Windows IoT Core) 플랫폼이다. 이 플랫폼은 오랫동안 개발자들의 요구사항이었던 ARM 과 x86 을 아우르는 하나의 플랫폼을 구현한 원코어 시스템이라 한다. 윈도우가 ARM 에 포팅 되었다는 것이 필자는 처음엔 생소하고 신기하였다. 실제 OS 코어는 100% 같지 않음에도 불구하고 프레임워크만 비슷하게 하는 방법으로 OS 통합을 했다고 하는 것이 아닌가 하는 생각마저 들었다. ARM 기반의 라즈베리파이 2 Windows IoT Core 의 개발 환경, 어플리케이션 개발, 주변기기 통신, 드라이버 개발, OS 디버깅에 대해 알아보면서 과연 Windows IoT Core 가 마이크로소프트가 제시하는 원코어 플랫폼인 Universal Windows Platform (이하 UWP)의 조건을 갖추었는지 알아보기로 하자. 개발환경 Windows IoT Core 를 개발하기 위해 개발 PC (윈도우 10 PC) 와 타깃 디바이스 (라즈베리파이 2 혹은 인텔의 MinnowBoard Max) 가 필요하다. 개발 PC 에 윈도우 10 을 설치 후 비주얼 스튜디오 2015
RC 버전을 설치한다. <그림 2>Windows IoT Core 개발 환경 및 툴 개발 PC 에서 앱과 디바이스 드라이버를 개발한 후 타깃 디바이스에 이더넷을 통해 배포하여 테스트 한다. 타깃 디바이스는 모니터가 있는 디바이스(Headed) 와 그렇지 않은 디바이스 (Headless) 로 나뉜다. 많은 IoT 장비 들은 키보드가 없는 환경이 있기 때문에 타깃 디바이스 제어는 개발 PC 에서 이더넷을 통한 PowerShell 명령어로 가능하다. 그리고 시스템이나 드라이버 디버깅을 위해 WINDBG 툴이 사용 가능하다. 개발 PC 환경 설정 개발 PC 에 윈도우 10 과 비주얼 스튜디오 2015 버전을 설치하면 기본적인 앱개발 테스트를 진행할 수 있다. 앱 개발과 더불어 OS 자체를 새롭게 빌드하거나 디바이스 드라이버 개발을 하려면 추가적인 툴 설치가 요구된다. ADK (Windows Assessment and Deployment Kit) : 사용자가 원하는 대로 사용자 정의의 윈도우 IoT 이미지를 만들기 위한 툴이다. Windows IoT Core 이미지에서 컴포넌트화된 기능들을 적절히 조합하여 이미지 사이즈나 기능들을 제어할 수 있다. 이 툴은 Windows Insider 프로그램에 가입한 후 무료로 다운 가능하다. 이 툴 안에는 WICD ( Windows Imaging and Configuration Designer), Windows Assessment Toolkit, Windows Performance Toolkit 등이 포함되어 있다.
SDK (Software Development Kit) : 앱 개발 뿐만 아니라, 드라이버 개발을 위한 WDK 를 사용하기 위해 Standalone Windows SDK 를 반드시 설치 하여야 한다. WDK (Windows Driver Kit) : 윈도우 디바이스 드라이버 개발을 위한 툴킷이다. 윈도우 10 출시와 함께 소개된 Universal 드라이버 모델의 디바이스 드라이버를 만들 수 있다. 디바이스 드라이버의 기본 템플릿, 테스트, 사이닝에 대한 툴이 제공되고 사용자 정의 OS 제작 시에 필요한 툴들도 포함되어 있다. ADK 나 WDK 툴킷은 사용자 정의의 OS 이미지를 만들거나, 사용자 정의 디바이스 드라이버를 만들지 않는 다면 별도로 설치를 하지 않아도 된다. 이 두 개의 툴킷은 상당히 큰 저장장치의 용량을 요구하기 때문이다. 타깃 디바이스(라즈베리파이 2)에 Windows IoT Core 설치하기 개발 PC 의 환경설정이 완료되었다면 타깃 디바이스인 라즈베리파이 2 에 Windows IoT Core 이미지를 설치해 보자. 라즈베리파이 2 용 Windows IoT Core 이미지는 Microsoft Connect 사이트를 통해 다운 받을 수 있다. 사이트에 접속하여 Windows Embedded 를 검색하여 프로그램에 지원하면 라즈베리파이 2 용 Windows IoT Core 이미지를 다운 받을 수 있다. <그림 3> Microsoft Connect 사이트에서 라즈베리파이 2 용 Windows IoT Core 이미지 링크 (출처: Microsoft Connect 사이트) "Windows 10 IoT Core Insider Preview Image for Raspberry Pi 2" 를 다운로드 받고 압축을 풀면 flash.ffu 를 볼 수 있다. 이것이 라즈베리파이 2 용 Windows IoT Core 이미지이다. 마이크로 SD 카드를 개발 PC 에 넣고 이미지를 굽는 툴인 DISM 을 실행하기 위해 Command Prompt 를 관리자 계정으로 실행 한다. Diskpart, list disk, exit 명령을 통해 DISM 으로 작업할 파티션을 확인한다.
Windows IoT Core 이미지(flash.ffu) 가 있는 폴더로 이동하여 DISM 명령어를 사용해 이미지를 굽는(Flash) 작업을 한다. 디바이스 안전 제거를 하여 라즈베리파이 2 에 삽입 후 전원을 인가하여 부팅이 완료되면 IoTCoreDefaultApp 어플리케이션이 실행된 모습을 확인할 수 있다. <그림 4>기본 쉘로 지정된 IoTCoreDefaultApp 의 모습 (출처 : WindowsOnDevices.com )
파워쉘을 이용하여 개발 PC 에서 타깃 디바이스 제어하기 IoT 장비는 여러 시나리오가 가능하다. 모니터가 있는 디바이스(Headed)에서 없는 디바이스(Headless), 키보드가 없는 디바이스 등 여러 가지 형태로 변형된 OS 가 탑재될 것이다. 여러 제약사항이 있는 환경을 고려해 개발 PC 에서 타깃 PC 를 제어하기 위해 파워쉘을 사용할 수 있다. 파웨쉘을 사용하여 타깃 디바이스 접근을 위한 간단한 명령어 숙지는 필수이다. 라즈베리파이 2 에 개발 PC 에서 파워쉘로 접근하기 위해서 라즈베리파이 2 를 부팅하고 기본 쉘에서 IP 주소를 확인한다. 개발 PC 에서 파워쉘을 관리자 계정으로 실행하고 WINRM 서비스(Windows Remote Management)를 실행하여 리모트 연결을 활성화한다. 이 후 개발 PC 와 라즈베리파이 2 의 Trust Relationship 을 위해 SET-ITEM 명령어를 이용한다. 라즈베리파이 2 의 디바이스 이름이나 IP 주소를 이용할 수 있으나 필자의 경험으로는 IP 주소를 넣는 것이 여러모로 좋을 수 있다. 이어지는 질문에 Y 를 입력하여 명령어 실행을 마무리 한다. 파워쉘에서 리모트머신의 StackOverflowException 을 야기 시키는 이슈가 있다. 이를 대처하는 방안으로 remove-module psreadline -force 명령어를 실행한다. Enter-PsSession 명령어를 이용하여 Windows IoT Core 와 세션을 시작한다. Enter-PsSession -ComputerName <machine-name or IP Address> -Credential <machine-name or IP Address or localhost>\administrato 기본 Connect 사이트에서 받은 이미지의 기본 패스워드는 p@ssw0rd 이다. Universal 앱 개발 준비 하기 UWP 기반의 Universal 앱을 개발하면 윈도우 IoT 의 모든 플랫폼에서 구동 가능하다. Universal 앱 개발을 위해 준비할 사항이 있다. 우선 WindowsIoTWatcher.exe 구동이다. IoT 시나리오에서 특히 모니터가 없는 장비의 부팅 여부나 상태를 확인하기 위해 유용한 앱이다. WindowsIoTWatcher 를 이용하여 이더넷으로 연결된 타깃 디바이스의 상태를 확인할 수 있다. <그림 5> WindowsIoTWatcher 로 타깃 디바이스 모니터링
Universal 앱을 개발하고 디버깅하기 위해서 개발 PC 에 개발자 모드를 활성화 하여야 한다. 개발자 모드가 활성화 되어 있지 않으면 Universal 앱을 디버깅할 수 없고, 비주얼 스튜디오의 XAML 디자이너 기능도 활성화 되지 않는다. 현재 윈도우 10 버전에서 GUI 로 디버그 모드 활성화 기능이 제공되지 않아 GPEDIT.MSC 를 활용하여야 한다. CMD 에서 GPEDIT.MSC 를 실행하고 Local Computer Policy > Computer Configuration > Administrative Templates > Windows Components > App Package Deployment 에서 Allow all trusted apps to install -> Enable 로 활성화 Allows development of Windows Store apps and installing them from an integrated development environment (IDE) -> Enable 로 활성화 한다. <그림 6>개발 PC 에 개발자 모드 활성화 모습 비주얼 스튜디오에서 Hello World! 실행하기 비주얼 스튜디오 2015 RC 를 열고 새로운 프로젝트를 생성한다. 다이얼로그 박스에서 Windows Universal 앱 모델을 C# 기반으로 사용해 보기로 하자. 프로젝트 템플릿은 Blank App 을 선택한다.
프로젝트를 생성하면 솔루션 탐색기에서 프로젝트 생성 중에 생성된 UI 와 소스 코드를 확인할 수 있다. 이 파일은 Windows 8 이상의 스토어 앱 프로젝트 생성 시 생성되었던 파일과 크게 다르지 않다. 프로젝트에서 MainPage.xaml 파일에 텍스트박스와 버튼을 생성하기 위한 부분을 추가해 보기로 한다. MainPage.xaml 의 <Grid> 속성안에 다음의 스크립트를 삽입해 보자. XAML 디자이너에서 버튼을 선택하면 속성 창에서 ClickMe_Click 이벤트가 Click 이벤트란에 정의가 된 것을 확인 할 수 있다. ClickMe_Click 텍스트 박스를 더블 클릭하면 MainPage.xaml.cs 에 ClickMe_Click 이름의 이벤트가 생성 되는 것을 확인 할 수 있다. ClickMe_Click 이벤트에 간단하게 텍스트 박스의 내용을 Hello, Windows IoT Core! 로 바꾸도록 해보자.
작성한 앱은 Universal 앱이기 때문에 개발 PC 에서도 비주얼 스튜디오 에서 F5 버튼을 눌러 앱을 구동 시켜 볼 수 있다. 물론 작성한 앱을 윈도우 10 IoT 코어가 동작 중인 라즈베리파이 2 에도 구동 시켜 볼 것이다. 라즈베리파이 2 는 우리가 흔히 개발용 PC 로 사용하는 x86 플랫폼이 아니라 ARM 플랫폼이다. 그렇기 때문에 비주얼 스튜디오 툴바에서 아케텍쳐 메뉴를 ARM 으로 설정 하고, Local Machine 대신 Remote Machine 을 선택한다. 이어서 나타나는 Remote Connections 다이얼로그 박스에서 라즈베리파이 2 의 디바이스 이름이나, IP 주소를 Address 란에 입력할 수 있다. 추가로 Authentication Mode 는 None 으로 선택하고, Select 버튼을 누른다.
리모트 연결에 대한 설정 확인이나 수정은 프로젝트의 속성 -> 디버그 란을 통해서 진행할 수 있다. 이제 리모트 연결을 통해 Windows IoT Core 가 동작 중인 라즈베리파이 2 와 연결하기 위한 준비는 모두 마쳤다. 비주얼 스튜디오에서 F5 를 눌러 앱이 라즈베리파이 2 에서 잘 동작 되는 지 확인해 볼 수 있다. < 그림 7 > 라즈베리파이 2 에서 Universal 앱 실행의 예
GPIO 컨트롤러 사용하기 IoT 의 디바이스들은 여러 주변기기, 센서들과 통신을 할 수 있어야 한다. GPIO, SPI, I2C 그리고 시리얼 포트 등의 인터페이스를 통해 주변기기와 통신할 수 있도록 UWP 에 새로운 네임스페이스가 포함이 되었다. 새롭게 추가된 GPIO 네임스페이스를 이용해 라즈베리파이 2 의 GPIO 포트를 제어하여 LED 를 켜보는 코드를 살펴보도록 하자. LED 의 두 핀 중 짧은 부분이 (-) 로써 라즈베리파이 2 의 GPIO 5 번 포트에 연결이 되고, 긴 핀은 (+)로써 220 Ω 을 통해 3.3v 부분에 연결을 하여 하드웨어 구성을 하여 본다. < 그림 8 >라즈베리파이 2 의 핀에 LED 를 연결한 모습 (출처 : WindowOnDevices.com) GPIO 네임스페이스 사용을 위해 프로젝트의 Windows IoT Extension SDK 이 참조 되어야 한다.
프로젝트가 준비 되면 GPIO 네임스페이스와 GpioController, GpioPin 클래스를 이용하여 라즈베리파이 2 의 GPIO 5 번 포트를 제어할 수 있다. GpioController 의 GetDefault(); 를 이용해 GPIO 컨트롤러를 접근하고 OpenPin(); 를 이용하여 라즈베리파이 2 의 GPIO 5 번 핀을 연결한다. GPIO 5 번 핀을 Output 모드로 설정 후 Write(); 를 통해 GPIO 에 데이터를 출력할 수 있다. Universal Windows Driver 개발 UWP 에서는 동일한 어플리케이션 모델을 지원함과 동시에 디바이스 드라이버 모델도 동일하다. Universal Windows Driver 모델로 작성된 디바이스 드라이버는 모든 윈도우 10 IoT 플랫폼에서 동작 가능하다. 하나의 앱을 만들어 모든 윈도우 10 기반 디바이스에 배포하는 것처럼 디바이스 드라이버도 모든 윈도우 10 기반 디바이스에서 동작시킬 수 있다. (단 하드웨어 종속적인 기본 코드들은 ACPI 코드 수정을 통해 재정의하여야 한다. ) 현재 비주얼 스튜디오 2015 RC 버전에서 WDK (Windows Driver Kit) 을 설치 후 Universal Windows Driver 개발이 가능하다. 윈도우에서는 간단한 드라이버 개발을 위해 WDF (Windows Driver Frameworks) 모델을 지원한다. WDF 기반의 디바이스 드라이버 템플릿을 사용하면 드라이버 객체에 대한 초기화, 하드웨어 접근, 메시지 처리에 대한 기본 인터페이스가 정의 되어 있다. WDF 템플릿에서 제공되는 기본 인터페이스 코드를 최대한 이용하여 몇 줄의 코드 추가로 디바이스 드라이버 개발이 가능하다. Universal Windows Driver 에서는 GPIO 컨트롤을 위해 GPIOClx 프레임워크를 제공한다. CPU 벤더가 GPIO Controller Driver 를 제작하여 윈도우 IoT 플랫폼을 지원한다. 이 드라이버는 일반적인 GPIO 포트를 통한 읽기/쓰기 및 인터럽트 명령을 수행한다. 하지만 때로는 다양한 IoT 시나리오에 의해 CPU 벤더가 개발한 기본 드라이버 동작 외에 사용자가 정의한 다른 동작을 해야 하는 경우도 있다. 읽기/쓰기로 설정된 GPIO 핀 속성을 인터럽트 설정으로 변경한다든지, 센서 모듈과의 GPIO 포트를 이용한 통신 드라이버 작성, 보드
핀맵 변경 그리고 사용자 정의의 특정 IOCTL 처리 등이 필요할 때가 바로 사용자 정의 디바이스 드라이버가 필요한 때이다. 이런 사용자 정의 디바이스 드라이버를 윈도우 10 에서는 Peripheral Device Driver 모델로 개발할 수 있다. <그림 9 >GPIO 드라이버 프레임워크 WindowsOnDevices.com 에서 제공하는 샘플 드라이버(GPIOKMDFDEMO)로 Windows IoT Core 에서 WDK 를 이용한 커널모드 드라이버 (Kernel Mode Device Framework) 를 구동하여 테스트 해볼 수 있다. 이 드라이버는 Win32 콘솔 앱에서 사용자 정의 디바이스 드라이버 인터페이스인 IOCTL 명령을 통해 GPIO 핀을 High 나 Low 로 설정 한다. 샘플드라이버인 GPIOKMDFDEMO 는 윈도우 10 에서 제공되는 GPIO 프레임워크인 GPIOClx (GPIO Class Extension) 와 통신 하는 Peripheral Device Driver 이다. 샘플 드라이버 빌드 샘플드라이버를 비주얼 스튜디오 2015 RC 에서 열고 빌드를 하기 위한 몇 가지 준비를 해야 한다. 샘플드라이버 프로젝트의 속성 창에서 Driver Signing 노드에서 General 메뉴를 선택한다. Test Certificate 를 선택하고 Select from Store 메뉴에서 Windows Phone OEM Test Cert 2013 (TEST ONLY) 증명서를 선택한다.
선택이 완료되면 비주얼 스튜디오에서 라즈베리파이 2 용으로 빌드하기 위해 ARM 플랫폼으로 선택 후 빌드 메뉴를 통해 프로젝트를 빌드 한다. 빌드가 성공적으로 완료되면, 프로젝트의 ARM\Debug\gpiokmdfdemo 폴더에.inf 파일과.sys 파일이 생성된다. INF 파일은 디바이스 드라이버의 매니페스트 파일이다. 디바이스 드라이버가 등록되는 속성의 값을 가지고 있다. 그리고 SYS 파일은 디바이스 드라이버의 소스가 컴파일 된 바이너리 파일이다.
디바이스 드라이버의 빌드가 완료되면 하드웨어 종속적인 코드인 ACPI 테이블이 업데이트되어야 한다. WDK 를 설치하면 C:\Program Files (x86)\windows Kits\10\Tools\x86\ACPIVerify 폴더에 마이크로소프트가 제공하는 ACPI 소스 컴파일러가 존재한다. 이 폴더에 rpi2.asl 파일을 복사한다. CMD 파일을 관리자 권한으로 실행하고, ACPI 컴파일러 폴더로 이동한다. cd C:\Program Files (x86)\windows Kits\10\Tools\x86\ACPIVerify 라즈베리파이 2 용 ACPI 테이블을 아래 명령어로 컴파일 한다. asl.exe rpi2.asl 컴파일이 완료되면 ACPITABL.dat 파일이 생성된다. 샘플 드라이버 배포와 테스트 샘플 드라이버 빌드로 생성된 INF, SYS, DAT 파일을 타깃 디바이스의\Windows\system32\ 로 복사하고 BCDEDIT 로 테스트 사인을 활성화하여 테스트 할 수 있다. 타깃 디바이스에서 디바이스 드라이버를 설치하기 위해서는 DEVCON.exe 명령어를 파워쉘을 통해 사용한다. bcdedit /store C:\EFIESP\EFI\Microsoft\boot\BCD /set testsigning on devcon.exe install gpiokmdfdemo.inf ACPI\GPOT0001 설치가 완료되면 DEVCON STATUS ACPI\GPOT0001 명령어로 드라이버 상태를 확인한다. 샘플드라이버 프로젝트안에 제공되는 콘솔 앱(BlinkyApp_ARM.exe)을 타깃 디바이스의 FTP 를 통해 복사한 후 파워쉘을 이용하여 복사한 콘솔 앱의 위치로 이동 후 low 2, high 2 매개변수를 통해 LED 를 제어해 본다. 디바이스 드라이버 디버깅 Windows IoT Core 가 구동중인 라즈베리파이 2 의 디바이스 드라이버 디버깅을 WINDBG 로 할 수 있다. WINDBG 는 기존 데스크탑 OS 의 디버깅이나 드라이버 디버깅에 사용되는 툴이다. 라즈베리파이 2 를 디버깅하기 위해서는 USB TTL UART 케이블이 필요하다. USB TTL UART 케이블을 라즈베리파이 2 에 연결하고 개발 PC 에서 몇 번 시리얼 포트로 연결되었는지 확인한다.
< 그림 10 >USB TTL UART 를 라즈베리파이 2 에 연결한 모습 라즈베리파이 2 를 구동 하고, 파워쉘 명령어를 이용하여 접속한다. 부팅정보를 BCDEDIT 로 설정하여 라즈베리파이 2 를 시리얼 포트를 이용한 디버깅 설정을 한다. bcdedit -store C:\EFIESP\efi\Microsoft\Boot\bcd -dbgsettings serial bcdedit -store C:\EFIESP\efi\Microsoft\Boot\bcd -debug on 개발 PC 의 CMD 에서 WINDBG 가 있는 폴더로 이동하여 COM3 을 통한 연결 설정하여 WINDBG 를 구동시킨다. 설정 후 파워쉘의 명령어 shutdown /r /t 0 을 이용하여 라즈베리파이 2 를 재부팅 시킨다. 재부팅이 완료되면 개발 PC 에서 대기하고 있던 WINDBG 가 시리얼 포트를 통해 연결이 되는 것을 확인할 수 있다. WINDBG 가 타깃 디바이스와 연결이 되면 GPIOKMDFDEMO 드라이버의 OnDeviceIoControl 함수에 BM 명령어를 활용하여 브레이크 포인트를 설정한다. 파워쉘을 통해 라즈베리파이 2 의 BLINKYAPP_ARM LOW 2 를 실행 시킨다.
BlinkyApp_Arm.exe 콘솔앱을 실행 시키면 WINDBG 에서 브레이크 포인트를 설정한 함수에서 실행이 멈추는 것을 확인할 수 있다. < 그림 11 >드라이버 소스에 WINDBG 로 브레이크 포인트가 설정된 모습 콘솔앱에서는 사용자 정의 디바이스 드라이버 접근을 위해 DeviceIoControl 인터페이스를 사용한다. 이 DeviceIoControl 인터페이스를 통해 디바이스 드라이버의 함수를 호출하면, GPIOKMDFDEMO 드라이버에서 사용자가 정의한 기능을 수행하기 위해 OnDeviceIoControl 함수가 호출 되고 이 과정에서 브레이크 포인트가 설정된 부분에서 디버깅을 시작할 수 있다. 사용자 정의 OS 만들기 IoT 디바이스에서는 디바이스 설정 관련하여 여러 가지 사용자 정의 설정이 있을 수 있다. OS 의 쉘을 변경한다든지, 특정 디바이스 드라이버를 제거하여 디바이스의 오동작을 미연에 방지한다든지, 사용자 정의 디바이스 패키지를 첨부하는 것이 여러 사용자 정의의 시나리오들이다.
Windows IoT Core 는 사용자 정의에 의해 OS 를 빌드 할 수 있는 다양한 툴을 지원한다. ImageApp.exe 와 WICD(Windows Image and Configuration Designer)가 바로 OS 빌드를 위한 툴이다. ADK 와 WDK 를 설치한 개발 PC 에서 이 툴들을 사용할 수 있다. Microsoft Connect 사이트를 통해 x86 과 ARM 플랫폼 빌드를 위한 기본 패키지를 다운받을 수 있고, 라즈베리파이 2 하드웨어와 종속된 패키지도 다운 가능하다. ImageApp.exe 를 실행하는 기본 스크립트가 C:\Program Files (x86)\windows Kits\10\Tools\bin\i386 경로에 IMGGEN.cmd 파일로 제공되어 간단한 명령어로 Windows IoT Core 의 사용자 정의 이미지.FFU 파일을 만들 수 있다. imggen.cmd flash.ffu "%KITSROOT%\OEMInputSamples\RPi2\ProductionOEMInput.xml" "%KITSROOT%\MSPackages" arm 현 시점에서는 WICD 의 많은 부분이 공개되지 않았다. WICD 는 GUI 환경에서 쉽게 OS 설정을 할 수 있는 환경을 제공한다. 차후 WICD 에 대한 부분이 공개 되면 GUI 환경에서 OS 설정을 쉽게 진행할 수 있다. 마치며 지금까지 ARM 기반의 라즈베리파이 2 에 포팅된 Windows IoT Core 의 개발 환경, 어플리케이션 개발, 디바이스 드라이버 개발 방법 그리고 WINDBG 툴을 사용한 디버깅 방법까지 알아보았다. 플랫폼 별로 OS 코어가 다르다는 점은 결국 개발 소스와 툴 사용에 있어서 파편화를 초래한다. 윈도우 10 기반의 IoT 플랫폼은 하나의 코어로 이루어져 있기 때문에 소스의 수정 없이 x86 에서 사용했던 코드를 그대로 ARM 기반 플랫폼에서 사용할 수 있었다. 디바이스 드라이버 코드도 마찬가지다. 하드웨어 종속성이 강한 ACPI 부분만 제외하면 x86 과 ARM 플랫폼에서 소스 하나 바꾸지 않은 채로 디바이스 드라이버가 호환되었다. 개발과 디버깅에 동일한 툴인 비주얼 스튜디오와 WINDBG 를 사용했고, 타깃 디바이스 컨트롤이나 설정에 있어서도 파워쉘, BCDEDIT, DISM 등 동일한 툴을 이용하여 진행하였다. ARM 과 x86 지원에 대한 부분은 마치 윈도우의 리눅스화라고 생각되는 부분이며 마이크로소프트의 툴들을 충분히 활용하여 오히려 더 편리한 개발 환경이 구축되었다. 하지만 아직 프리뷰 버전이라 몇 가지 아쉬운 점들도 있다. 우선 x86 플랫폼과 비교하였을 때 UI 관련 성능에 대한 부분이다. 이 부분은 현재 마이크로소프트에서 최적화 작업이 진행 중이라고 한다. 물론 지난 오랜 시간 동안 마이크로소프트와 인텔의 협업으로 일궈낸 성과을 단기간에 따라 잡기란 여간 쉬운
일이 아닐 것이라 생각 된다. 하지만 필자가 예상했던 성능 보다는 좋은 성능을 보여 준 점은 고무적인 부분이다. 그리고 다른 아쉬운 점은 아직 지원되는 ARM 플랫폼이 몇 가지 없다는 데에 있다. 현재 브로드컴, 퀄컴 정도의 칩셋이 지원되어 좀 더 많은 칩셋 지원은 플랫폼 확산에 큰 숙제인 것으로 생각된다. 첫 술에 배부를 수 있을까? 그리고 아직 프리뷰 버전이다. Universal Windows Platform 의 어플리케이션 모델과 디바이스 드라이버 모델, 그리고 기존 툴과의 유기적인 결합에 많은 잠재성이 있는 것으로 생각된다. 성능과 칩셋 지원 부분의 숙제가 해결 되면 IoT 디바이스 군에서 Universal Windows Platform 의 지배력이 커지는 것을 기대해 보자.