블랙잭을 이용하여 프로그램을 작성하던 도중 특정 구문을 수행할시에 Data Abort 에러가 발생하는 것을 확인하였다.
평소 Win32 용 프로그램만 작성해 보다가 처음 하고 있는 Windows Mobile 디바이스 작업이기 때문에 처음 보는 에러였는데, 구글을 통해 검색해 보니 대충 윈도의 잘못된 연산 수행이나, 리눅스의 Segmentation fault 와 비슷한 것이라는 얘기가 나왔다.
그런데 이상한 점이, 분명히 윈도용 프로그램을 개발할 때에는 잘못된 연산을 수행하면 즉시 그 부분에 브레이크가 걸리고 무엇이 잘못되었는지 표시가 되는데 여기서는 그렇지가 않다는 것이었다.
멈추지 않고 에러가 계속 발생한다.
나같은 초보 프로그래머들은 저 에러메시지만 보고서는 대체 무슨 에러인지도 모르겠고, 소스에도 의심가는 부분이 없게 된다면 무척이나 당황하게 된다.
결국 Trace 를 통해 문제가 되는 부분을 찾았는데, 전혀 이상이 없다. 해답을 찾아 삼만리..
결국 발견한 것은 다음과 같은 방법이다.
Debug>Exceptions 메뉴를 실행한다. 다음과 같은 창이 뜬다.
Win32 Exceptions
주의해서 봐야 할 부분은 여기 Win32 Exceptions 부분이다.
여기 체크된 예외만이 디버거 실행을 멈추게 되어있다. 기본값은 위와 같고 (물론 항목은 더 많다.) 잘 보면 기본적인 Access violation 이나 Illegal Instruction, Datatype misalignment 가 체크되어 있지 않은 것을 알 수 있다.
위 항목을 체크하고 OK를 눌러주자
멈추길 바라는 항목들을 체크
다시 프로그램을 실행하면 결과가 아까와는 조금 달라진다.
뭐가 달라졌을까?
과연 어떤점이 다를까.
아까는 볼 수 없었던 줄이 하나 추가 된것을 볼 수 있다.
First-chance exception at 0x00028048 in xxxxxxxx.exe: 0x80000002: Datatype misalignment.
그리고 훌륭하게 디버거는 문제가 발생한 지점에서 실행을 중단하고 메시지 창을 띄운다.
Datatype misalignment
Data Abort 를 일으킨 장본인은 바로 Datatype misalignment 에러였다.
자! 문제가 무엇인지 좀 더 분명해 졌다. 왜 이런 Exception 들을 기본으로 체크해 놓지 않았는지 의문이 생기지만, 어쨌든 해결하게 된 것 만으로도 기쁘게 생각한다. 이제 문제가 무엇인지 알았으니 이제 문제를 해결하기만 하면 된다! (아직 해결 안됐음)
Windows Mobile 용 프로그램은 자체 전원관리에 의하여 백라이트가 꺼지고 화면이 꺼지는 작동을 하게 된다.
만약 동영상 플레이어나 기타 프로그램을 만들 경우 백라이트가 꺼지지 않는 것을 원할 수 있는데, 다음과 같은 코드를 이용하면 된다.
// IN BOOL fBacklightOn - TRUE to keep the backlight on. void SetBacklightRequirement(BOOL fBacklightOn) { // The name of the backlight device. TCHAR tszBacklightName[] = TEXT("BKL1:");
static HANDLE s_hBacklightReq = NULL;
if (fBacklightOn) { if (NULL == s_hBacklightReq) { // Turn the backlight on by setting the requirement that the backlight device // must remain in device state D0 (full power). Replace D0 with D4 (zero power) to // turn the backlight off. s_hBacklightReq = SetPowerRequirement(tszBacklightName, D0, POWER_NAME, NULL, 0);
if (!s_hBacklightReq) RETAILMSG(1, (L"SetPowerRequirement failed: %X\n", GetLastError())); } } else { if (s_hBacklightReq) { if (ERROR_SUCCESS != ReleasePowerRequirement(s_hBacklightReq)) RETAILMSG(1, (L"ReleasePowerRequirement failed: %X\n", GetLastError()));
블랙잭은 Windows Mobile 5.0 for Smartphone 운영체제를 이용하고 Landscape QVGA, QWERTY 사양을 가진 제품이다.
블랙잭용 프로그램 개발은 Windows Mobile 5.0 SDK for Smartphone (이하 SDK) 을 통해 Visual Studio 2005 로 하게 된다. SDK 를 설치하고 개발환경을 구축하고 보면 SDK 에서 에뮬레이터를 제공한다는 사실을 알게 되는데 각각 Smartphone, Smartphone QVGA 라고 밖에 되어있지 않다는 것을 볼 수 있다.
WM5.0 Smartphone QVGA 는 Landscape 모드를 찾을수도 없고 모양새도 아래와 같이 블랙잭과는 전혀! 딴판이다.
숫자판이 핸드폰과 동일하다.
이 상태에서 Landscape 를 찾아도 별 볼일 없음은 당연할 것이다.
이 상황에서 블랙잭과 같은 환경을 만들어 보려고 수차례 애를 썼으나 별 소득은 없었고, 다음과 같은 설정을 통해 블랙잭과 거의(!) 동일한 환경을 구축하는데 성공하였다.
4-2. 즉, 컴파일 설정은 Windows Mobile 5.0 Smartphone SDK (ARMV4I) 로 하고, 디바이스는 에뮬레이터로 할때는 KOR Windows Mobile 6 Landscape QVGA Emulator (한글이 나오기 때문), 실제 디바이스로 할 때는 Windows Mobile 6 Standard Device / Windwos Mobile 5.0 Smartphone 아무거나 해도 잘 돌아간다.
여기서 Windows Mobile 6 Standard Landscape QVGA Emulator 를 골라야 한다. 한글을 보고싶다면 앞에 KOR 이 붙은걸 고르면 된다.
설정을 다 하고 Windows Mobile 6 에뮬레이터를 실행하면 아래와 같이 뜬다.
한글 WM6 가 뜬 모습. 블랙잭과 거의 동일한 구성이다.
Windows Mobile 6는 Windows Mobile 5 에 대한 호환성을 기본적으로 갖추고 있기 때문에 우리가 빌드한 WM5 용 응용프로그램이 전혀 무리 없이 돌아가게 되며 구성또한 블랙잭과 동일하기 때문에 WM5 SDK 로 힘겹게 개발하는 것 보다 정신 건강에도 이롭다.
Windows Mobile 6 SDK를 까는 이유.
하드가 낭비되는 아주 안좋은 것이지만 핵심은 다음과 같다.
Windows Mobile 6 SDK를 설치하고 나면 Device Emulator Manager에 Windows Mobile 6 (Normal/Landscape QVGA/QVGA) Emulator 가 설치 된다.
Windows Mobile 5 Smartphone Emulator 에는 블랙잭과 동일한 환경을 제공하는 Emulator가 없다. 즉 Landscape QVGA를 지원하는 환경이 없다는 말이다.
그리고 꼭 필요하지는 않지만 QWERTY 키보드 역시 에뮬레이터에 포함되어있지 않다.
참고로 컴파일 설정을 Windows Mobile 6 로 하면 절대로 블랙잭에서 돌아가지 않는다. 그렇기 때문에 Windows Mobile 5 SDK for Smartphone을 꼭 깔아야 WM6 에뮬레이터와 블랙잭 모두에서 돌아가는 이미지를 만들 수 있다.
Windows Mobile Localized Emulator Images를 까는 이유
블랙잭은 한글로 로컬라이징된 WM5 Smartphone 환경이다. 기본적으로 제공되는 에뮬레이터는 영문 이미지이기 때문에 영문 윈도가 가동된다.
이를 한글 환경으로 하기 위해 로컬라이즈드 이미지를 설치하는 것이다. 이를 설치하고 나면
KOR Windows Moble 6 Standard Emulator
KOR Windows Moble 6 Standard Landscape QVGA Emulator
KOR Windows Moble 6 Standard Emulator QVGA Emulator
의 세가지 항목이 추가된다.
그런데, Windows Mobile 6 SDK를 안깔고 Localized Emulator 만 깔면 Device Emulator Manager 에 WM6 이미지가 들어가지 않기 때문에 실제 개발환경에 이용할 수가 없게 된다.
블랙잭 폰에서(블랙잭 1) 블루투스를 이용한 프로그램 개발. 주의사항 - 기존의 PC 환경과는 다르게 SerialPort class를 통한 연결은 어려울 뿐만 아니라, 잘 되지가 않는다. 때문에 C# 으로 개발 하기 위해서는 기존의 SerialPort 방식과는 다른 방식을 사용해야 한다. 라이브러리 : InTheHand InTheHand 는 이동성(mobility)를 위한 .NET Component를 제공하는데, 무료로 다운 받아서 사용할수 있고,..
시중에서 구할 수 있는 블랙잭은 일반인들에게 판매되는 제품이기 때문에 프로그램을 만들어서 넣는 다거나 다른 사람이 만든 프로그램을 실행하기가 불편하도록 되어 있다.
이는 각종 기능이 막혀있기 때문인데 다행히도 MS 의 개발킷과 기타 인터넷 글들에서 이들을 언락할 수 있는 기능을 제공하고 있어서 알아보았다.
1. 개발용 언락. (프로그램 실행만 하기 위한 언락은 이 항목을 뛰어넘고 2번 항목만 하면 됨)
일단 블랙잭용으로 프로그램 개발을 하기 위해 Windows Mobile 5.0 SDK for Smartphone 이 깔려 있는 상태에서 프로그램을 빌드하게 되면 빌드 후 Deployment 과정에서 아래와 같은 오류가 발생한다.
1>All attempts to connect to the deployment target at port 5655 have failed. Addresses attempted: 1> 127.0.0.1. 1>The device security configuration may have disallowed the connection. Ensure that you have the appropriate certificates on your device for development. Review your SDK documentation for proper security settings for connecting to this device. 1> ========== Build: 0 succeeded, 0 failed, 1 up-to-date, 0 skipped ========== ========== Deploy: 0 succeeded, 1 failed, 0 skipped ==========
이는 RAPI(Remote API) 언락이 되지 않아서 발생하는 에러인데 이는 개발 편의를 위해 Microsoft 에서 간단한 방법으로 언락을 할 수 있도록 하고 있다.
일단 Windows Mobile 5.0 SDK for Mobile 이 깔려 있다는 전제 하에 아래와 같이 입력하면 간단히 개발용 언락을 할 수 있다,
C:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0 Smartphone SDK\Tools >RapiConfig.exe /p SdkCerts.xml Config results written to output file RapiConfigOut.xml. Config succeeded.
SPH-M6200 의 초기상태. RAPI가 Restricted 로 막혀있는 것을 볼 수 있다.
TEST 용 인증서가 추가되었다.
위와 같이 하면 RAPI에 관한 락이 풀리고 테스트용 인증서가 설치된다. 그리고 VS 2005 를 통해 어플리케이션을 빌드해서 실행하면 블랙잭에서 잘 실행되는 것을 확인할 수 있다. 하지만 처음 어플리케이션이 설치 및 실행할 때는 인증되지 않은 프로그램이니 실행할 것이냐는 창이 계속 뜨게 된다.
왜 이런일이 발생하는가 하면, 3rd party 의 어플리케이션을 이용할 수 없도록 락을 걸었기 때문이다. 블랙잭은 Smartphone 이라는 특성상 프로그램 설치가 이통사의 수익과 연결되어 있어서 3rd party 의 어플리케이션을 이용할 수 있도록 쉽게 허용하지 않고 있다. (외국보다 폐쇄적인 우리나라의 경우는 정도가 더 심한것 같다.)
그래서 필요한 것이 어플리케이션 언락이다.
2. 어플리케이션 언락 블랙잭에서 기본으로 실행할 수 있는 프로그램은 M2M (Mobile 2 Market), KTF (SKT), Microsoft, Samgung 의 인증을 받은 프로그램 뿐이고 유저가 ActiveSync 나 WMDC(Windows Mobile Device Center) 를 통해 설치한 프로그램은 확인 메시지를 거친 다음 실행할 수 있다.
이 블랙잭에 자신이 직접 개발하거나 다른 사용자가 빌드한 프로그램을 경고 메시지 없이 돌리고 싶다면 어플리케이션 언락을 할 필요가 있다.
어플리케이션 언락은 인터넷에 타 스마트폰을 언락하는 방법을 참고하여 동일한 방법으로 언락할 수 있다.
Device Security Manager PowerToy for Windows Mobile 5.0 를 실행한 초기 화면
Provision 을 클릭하면!
언락 완료!
이런 다이얼 로그가 뜬 뒤 화면이 아래와 같이 변한다.
언락 완료. 오른쪽에 Security Off 가 보인다.
위와 같이 표시가 되면 모든 프로그램을 무제한으로 설치, 실행할 수 있는 모드로 변한 것이고 이제 자유롭게 프로그램을 이용할 수 있다. 다만 인증받지 않은 프로그램을 설치하여 이용하는 것이기 때문에 프로그램의 잘못된 실행으로 인한 기기 오류는 무조건 사용자의 책임이라는 것이다. 그러므로 주의하여 실행하도록 하자.
Windows Mobile 6은 Windows Mobile 5.0 에서 쓰이던 Phone Edition, Smartphone, Pocket PC 등의 이름을 버리고 Classic, Standard, Professional 과 갈은 보다 Windows 스러운 이름으로 갈아탔다.
물론 그런다고 해서 기능 자체가 달라지거나 명확한 변화가 있는 것은 아니지만 기종이 나올 때마다 새로 이름을 지어서 난잡해진 명칭들을 정리하려는 듯한 인상을 준다.
하지만!
Classic, Standard, Professional이라는 이름과 Pocket PC, Smartphone, Pocket PC등의 이름을 비교할 때, 전자가 후자에 비해 명시적으로 나아지는 점이 뭔지 모르겠다.
아무튼 Windows Mobile 5.0 개발에서 Windows Mobile 6 개발로 옮겨갈 때 필요한 SDK를 설치하기 위해서는 위와 같은 상황을 알아야 하니 참고.
사이버 포뮬러라는 만화를 보셨거나.. 아니면 자동차 경주에 관심이 있으신 분들이 들어보셨을만한 Slipstream이라는 용어를 쓰고 있는게 재미있네요. 영어가 짧아서 저 문장 자체가 어떻게 해석되는지 잘 모르겠지만, Visual Studio 2005 를 설치할때 자동으로 Service Pack1 을 끼어들게 한다는 의미로 쓴것 같기도 하고.. 영어는 참 어렵네요?? (이게 결론??)
별로 그럴일은 없겠지만, 이렇게 설치한 SP1 은 따로 삭제할 수 없다고 합니다. 저는 이 글을 쓰기 전에 시키는대로 따라 해 보았는데, 이렇게 설치한 VS2005가 지금 잘 돌아가고 있습니다. Service Pack1 을 까는 악몽같은 시간이 없으니 정말 상쾌합니다.
예전에 이런것을 찾아서 헤맨적이 있었는데, 결국 무수한 수식만 발견했던 기억이 있다. 결국은 수식을 가지고 변환식을 만들어서 썼었는데, 간단한 루틴이었지만 무척 귀찮았다 -.-;
이런걸 깔끔하게 정리해놓은게 있었으면 했는데, 역시 지구는 넓어서 저런걸 만든 사람이 있었다. 이걸 평가절하 할 사람들도 많겠지만, 결국은 귀찮음의 문제이다. 누구나 만들 수 있는것이긴 하지만 귀찮아서 안만드는 것 아닌가ㅋ 픽셀 셰이더 코드로도 되어있으면 더 유용하게 써먹을 수 있을것 같은데, 그냥 ANSI C 용인것은 약간 아쉽다~
euphoria brings Dynamic Motion Synthesis (DMS) onto Playstation® 3, Xbox 360 and PC.
With euphoria, animations are not canned but are generated on-the-fly by the CPU as the game is played. Every tackle is your tackle, every haymaker is your haymaker.
euphoria provides unprecedented interactivity and realism, and gives users a true next-generation gaming experience.
물리 엔진인줄 알았는데, 딱히 물리엔진은 아닌것 같고 미리 만들어둔 애니메이션과 실시간으로 효과를 내야 어울리는 동작들을 실시간으로 생성하여 블랜딩하는 것을 관장하는 엔진인듯 하다.
endorphin 은 3D Tool 의 플러그인 비슷하게 작동하며 euphoria 로 생성한 애니메이션을 키프레임으로 잡을 수 있도록 도와주게 되어있고, 소니, 남코, 코나미가 이 툴을 적용하고 있다고 하는 것으로 보아 철권등에서 맞는 모션이나 굴러다니거나 추락하는 실제로 모션캡쳐도 어려운 장면들을 이런 툴로 생성한듯 하다.
저희 팀이 개발하고 있는 '실시간 3D 렌더링을 이용한 애니메이션 제작 환경' (이하 ProjectAlice) 에서는 애니메이션 데이터 포멧으로 XML 포멧을 사용하고 있습니다.
XML의 장점에 대해서는 굳이 설명드리지 않더라도 여러 매체를 통해서 소개되어 있기 때문에 따로 얘기는 하지 않겠고, 대신 ProjectAlice 에서 왜 XML을 쓰는지에 대해서만 간단히 얘기하도록 하겠습니다.
프로그램의 기능이 부족하다. 이 부분은 차차 해결해 나가야 할 부분입니다만, 데이터 값을 수정하는 부분은 다분히 UI에 관련된 사항입니다. 실제 내용물이 구현되는 것과 값을 수정할 수 있는 부분이 만들어지는 것은 별개의 사항이죠. 보통은 코어부분을 먼저 개발하기 때문에, 데이터를 편집할 수 있는 UI는 아직 완성이 안되어있는 경우가 많습니다. (실제로 저희 프로젝트가 그렇습니다.)
그럴 경우 보통은 데이터 구조 (구조체나 클래스)를 정하고 난 뒤, 소스 내에서 객체를 생성하고 임의의 값을 하드 코딩하여 엔진을 테스트 하는 경우가 다반사인데, 그럴경우 데이터 값을 변경시킬때마다 프로그램을 컴파일해야하는 상황이 발생합니다. 요즘엔 컴퓨터가 빨라서 못할짓은 아니지만 그닥 좋은 방법은 아니라고 할 수 있겠죠.
그것보다 조금 유용하고 정석적인 방법은 데이터 로더를 만들어서 외부 데이터를 읽어오는 방법입니다. 오래전부터 C 코딩을 하셨던 분들은 보통 구조체를 fwrite(&구조체인스턴스, ..); 하는 방식으로 파일에 덤프하고 fread로 읽는데 익숙하실겁니다. 편리한 방법이긴 하지만 그런식으로 값을 저장할 경우 프로그램에서 쓰기는 편하지만 지금같이 UI가 부족할 경우에는 완전 난감하죠.
이럴때는 텍스트 포멧으로 저장하여 외부에 걸출한 텍스트 에디터들로 편집을 할 수 있도록 하는것이 정답입니다. 값이 눈으로 보이기 때문에 손으로 고치기가 편하다는 장점이 있죠.
유일한 단점은, 파서를 만들기가 귀찮다는 것입니다.
그럴 때 쓸 수 있는 대안이 바로 XML 입니다. 텍스트 포멧으로 만들어져 있고 수많은 파서가 존재하며 외부 프로그램과의 호환도 유리한 장점이 있지요.
시간이 지나고 프로그램의 기능이 좀 더 많아지면 속성값이 늘어나거나, 형식이 변한다.
위에서 이야기 하였던 fwrite/fread 의 경우에는 구조체를 그대로 덤프하기 때문에 구조체에 변수가 추가된다거나 변수의 형식이 변할경우에 초난감한 사태가 발생합니다. (데이터 포멧 컨버터를 만들어야할지도) 하지만 XML 은 태그의 속성을 손쉽게 변형할 수 있고 속성의 추가도 자유롭습니다. 만약 데이터의 형식이 변화하더라도 데이터파일에 미치는 영향을 최소화 할 수 있을 겁니다.
데이터가 깨졌을때 유리하다.
이 부분은 모든 텍스트 포멧에 대한 장점인데, ProjectAlice 와 같이 초기 단계에 있는 프로젝트는 프로그램이 불완전한 관계로 데이터 파일을 날려먹을 수 있는 확률도 있습니다. 아니면 하드가 박살이 난다던가 하는 천재지변이 있을수도 있겠죠. 그럴경우 바이너리 파일은 복구하기가 샤워실에서 털줍는일 만큼이나 괴로운 일이 되겠지만 텍스트 포멧은 human-readable 하기 때문에 에디터로 열어놓고 눈으로 확인 가능한 만큼은 살릴 수 있을 것입니다.
이러한 사유로 저의 ProjectAlice 는 XML을 데이터 포멧으로 이용하기 시작하였습니다. 아직까지는 별다른 탈 없이 잘 작동하고 있고, 데이터 포멧 하나만으로도 왠지 고급 프로그램이 된것 같은 느낌입니다.
원래는 저희 프로젝트의 데이터 예제와 태그 설명도 같이 올리려고 했지만 내용이 꽤 길어진 관계로 차후 포스팅 하도록 하겠습니다.