'공장이야기/모바일'에 해당되는 글 18건
- 2010.10.13 otool -l xxx
- 2010.05.26 윈도우모바일(WM) 액티브싱크 블루투스 통해 연결.
- 2010.05.09 iTunes Store 모든 컴퓨터 인증 해제
- 2010.04.26 안드로이드 버전별 명칭
- 2010.04.18 xcode gdb이용 아이폰 런타임 변수값 변경.
- 2009.11.19 SD-340 NAM설정
- 2009.06.30 canU801EX PC Sync 3
- 2009.01.02 U300K SIO모드 설정
- 2008.02.22 BREW폰중에 폰번호 표시가 (0) 인것 2
- 2008.02.20 모바일참고
- 2007.12.18 KTF 위피 교육 초급
- 2007.05.29 SKVM에서 유니코드 인코딩
- 2006.12.11 WIPI-C 에서 유니코드 스트링 사용
- 2006.12.04 KTF WIPI-C 개발환경 구축
- 2006.11.27 위피(Clet) 개발 환경
- 2006.11.24 SK WIPI-Jlet 커맨드창에서 에뮬 실행.
- 2006.10.19 유무선 연동 도면.
- 2006.10.18 WPIC-C 에서 동적메모리 할당/해제시 유의점. 1
- 블루투스 장치 COM 포트와 액티브 싱크의 COM 포트를 동일하게 설정하면, 윈도우모바일 장치에서 서비스 검색했을 때 Active Sync 서비스가 나타남.
사용자 계정과 관련된 모든 컴퓨터를 인증 해제하려면 다음을 수행합니다.
인증된 컴퓨터 수가 5대에 도달하면 계정 정보 화면에서 Deauthorize All을 클릭하여 인증 횟수를 재설정할 수 있습니다.
iTunes의 왼쪽에 있는 메뉴에서 iTunes Store를 클릭합니다.
스토어에 서명하지 않은 경우 계정 버튼을 클릭한 다음 계정 이름과 암호를 입력합니다.
계정 버튼을 다시 클릭하고(사용자 ID가 버튼에 나타남) 암호를 입력한 다음 계정 보기를 클릭합니다.
계정 정보 윈도우에서 Deauthorize All을 클릭합니다.
참고: 이 기능은 1년에 한 번만 사용할 수 있습니다. 인증된 컴퓨터가 5대 미만이거나 최근 12개월 내에 이 옵션을 사용한 경우에는 Deauthorize All 버튼이 나타나지 않습니다. 이 기능을 사용하는 데 도움이 필요할 경우, (http://www.apple.com/kr/support/itunes/)로 이메일을 보내 iTunes Store 지원부에 문의하십시오.
http://support.apple.com/kb/HT1420?viewlocale=ko_KR&locale=ko_KR
1.5버전(첫 개발작): 컵케익(Cupcake)
1.6버전: 도넛(Donut)
2.0∼2.1버전(최신): 이클레어(Eclair)
2.2버전(5월 발표 예정): 프로요(Froyo·Frozen Yogurt)
차기 버전 후보: 진저브레드(Gingerbread) 유력
차차기 버전 예상: 핫도그(hotdog) or 햄버거(hamburger)
HelloWorld
(gdb) set sText = @"ChangedText"
(gdb) print-object sText(변수명)
ChangedText
* 휴대폰도 초기화 할 것.
출처: http://www.lgtelecom.com/CanuBoardViewCmd.lgtservice?cat_key=13&cnt_key=123550&lgt_tmp=&targetRow=21&board_type=2&cnt_tmp_n_1=1&cate1=1&dummy=2009629223216&condition=cnt_name&keyword=
1. 제어판 → 프로그램추가/제거 → "SKY USB Driver Software" 항목이 있다면 제거 버튼을 눌러 삭제합니다.
2. 삭제 후 PC를 꼭! 재부팅합니다.
3. canU-801EX 모델의 USB 드라이버 설치 파일을 고객님 PC의 바탕화면에 다운 받습니다.
canU → 다운로드 → 다운 받으려는 모델로 canU 801EX 선택 → "USB 드라이버"”
4. USB 드라이버 압축파일 “USBDriver_801EX”을 PC의 바탕화면에 압축 파일을 해제합니다.
5. 압축 풀기가 완료되셨다면 PC의 바탕화면에 있는 USBDriver_801EX 폴더안에 "Setup" 아이콘을 실행하여 USB 드라이버 설치를 진행합니다.
6. USB 드라이버를 설치하기 전에 PC와 단말기가 연결되어 있다면 USB 케이블을 제거한 상태에서 설치를 진행합니다.
7. "Setup" 아이콘 실행 후 "Install"을 선택하면 호환성 확인을 묻는 창이 나타납니다.
이 때, "계속" 버튼을 눌러 설치를 완료합니다. (총 3번)
8. USB 드라이버 설치가 완료된 후 단말기와 PC가 정상적으로 연결되었다면 PC에서는 단말기를 인식하는 과정으로 "새 하드웨어 검색 마법사"가 실행되고,
휴대폰에서는 외장메모리가 장착되어 있을 경우 "케이블 연결 메뉴"가 팝업됩니다. (① PC Sync 선택)
9. "새 하드웨어 검색 마법사" 실행 방법
목록 또는 특정 위치에서 설치(고급) 선택 후 "다음" → 검색 안 함.
설치할 드라이버를 직접 선택 후 "다음" → 호환 가능한 하드웨어 표시 "SKY USB Composite Device" 클릭 후 "다음"→ 호환성 확인을 묻는 창이 나타나면 "계속" → 마침
"새 하드웨어 검색 마법사"를 여러번 진행하여 SKY Handset Modem과 SKY Handset Diagnostic Serial Port 까지 인식 시킵니다.
10. ⑨번을 완료 후 "새 하드웨어 발견"이라는 작은 창에 "새 하드웨어를 설치했으며 사용할 준비가 되었습니다." 라는 안내 문구가 보여진다면,
PC에서 canU-801EX 모델을 정상적으로 인식한 것이니 해당 문구를 확인하신 후 PC Sync 프로그램을 실행해보시기 바랍니다
SKY SIO 모드 설정법
LEFT → 4시스템 → 0 → 000000 → 2.통신환경설정
시스템설정 : DM포트선택(UART1), DM통신속도(115,2000), DS포트선택(USB)
● 단말셋팅(위피) : 환경설정 → Debug to Serial
● 디버깅툴 : BREW Logger / 3.x / COM1 / QCOMOEM.dll
-> SPC에 580918 입력함.
HAL API는 단말API와 매칭되는 것을 사용함.
arm or gcc
3g에서는 pause, resume이 안 먹음
pSpace: 소스코드가 메모리에 올라가는 양, 리소스(사운드, 이미지) 포함 안된것.
static 변수, 배열
oSpace: startApp 이후 새로 생성하는 객체.
ktf c++ 위피 2.0 단말.
메인클래스: 패키지명.클래스
* 단말등록 옵션
최대 Thread 갯수
1개로 했을때 간혹 어플이 무한루프에 빠졌을때 실행이 안될 경우가 있음.
프리로드: 어플이 단말출시때 설치되어 나옴.
offrun: 폴더를 닫았을때 어플이 종료되지 않고 계속 구동.
압축 하면: 사이즈 줄어들고, 실행속도 줄어든다.
압축 안하면: 사이즈 늘고, 실행속도 빠름.
아이콘은 8, 16 비트로 작성.
24, 32일때 리부팅 되는 단말 있음.
컴파일 실패 요인.
1) .java 파일에 소스가 너무 길때(10,000 라인 정도)
2) 함수명이 길때.
3) 코드 오류...(사용 못하는 API 사용등)
시리얼 통한 디버깅 안될때 SIO 모두 달라서 그런것.
SK-VM은 EUC-KR로 인코딩설정이 되어 있습니다. (J2SE와 동일하게)
그러므로 서버에서 ASCII나 EUC-KR바이트를 수신해서 바이트 배열에 저장되었을때
ASCII, EUC-KR ---> UNICODE
new String( byte[] byte ) 생성자를 사용하면,
SK-VM은 바이트 배열을 16bit 유니코드 문자열로 변환 합니다.
(MIDP API Ref 참조)
UNICODE ---> ASCII, EUC-KR
String.getBytes(byte[] byte) 메쏘드를 사용하시면
SK-VM이 유니코드를 ASCII또는 EUC-KR로 변경 합니다.
(MIDP API Ref 참조)
http://www.unicode.org
const M_Ucode* m_strFileHeader = L"FileHeader";
위와 같이 유니코드 스트링의 상수를 선언하고.
MC_grpDrawUnicodeString(fb, 0, 0, m_strFileHeader, -1, gc);
위의 유니코드 출력함수를 이용했을때,
L""(유니코드 스트링)이 에뮬레이터에서는 인식을 하나, 단말에서는 인식을 못한다는 것을 알았다.
따라서 유니코드 스트링을 상수로 사용하기 위해서는 다음과 같이 사용한다.
const WCHAR m_strFileHeader[] = { 'F','i','l','e','H','e','a','d','e','r',0};
① 통합 SDK 설치경로에서 "Program File"의 공백으로 인해 cygwin에서 빌드 시 인식 못할 수 있음. 따라서 각 드라이브의 root 폴더 아래 설치하기를 권장.
② 단말용 컴파일을 위해 cygwin을 설치한다.
http://www.cygwin.com/setup.exe
설치 간 주의사항은 다운로드 소스 선택에서 빠른 설치를 위해 “Install from local dir"을 선택한다.
③ arm 컴파일러를 KTF WIPI 자료실에서 다운받아, cygwin/usr/local/arm 으로 복사한다.
④ visual C++에서 빌드 결과를 바로 확인하기 위해서는 Tools - Options - Directories에서 include 파일 폴더를 추가한다. 위피 타겟 버전이 1.2.0.3 일 경우 아래와 같이 함.
i) C:\KTFSDK\WIPI\pkg\WIPI1203\include
ii) C:\KTFSDK\WIPI\pkg\WIPI1203\include_WIPIC
⑤ 디버깅 하기
통합 SDK에서 디버깅을 지원하지 않으므로, 이전 버전의 SDK(1.1 / 1.2)를 이용한다.
Executable for debug session: %WIPI 1.2 SDK HOME%\에뮬실행파일.exe
Working directory: %WIPI 1.2 SDK HOME%\Emulator
Program arguments: -DEBUG 프로젝트 하위 Debug 폴더의 dll 파일 경로.
ex. )-DEBUG C:\KTFSDK\WIPI\workspace\HelloWorld\Debug\HelloWorld.dll
F5를 눌러 디버깅 모드로 들어가면 위와 같은 다이얼로그창이 뜬다.
Jar Path: 빌드 시 프로젝트 루트 폴더에 jar 파일이 생성되는데 그것의 path를 지정하도록 함.
Skin Path: 지정하지 않으면 기본 스킨 사용됨.
Jlet's Name(or Clet): Jlet의 경우 Jlet을 상속 받는 클래스의 이름을 지정하지만, Clet의 경우 Clet을 입력한다.
Heap Size: 타겟폰에 맞게 입력. 위피 스펙상 1.2의 경우 1024kb 이고 2.0의 경우 2048kb 이다.
위 다이얼로그 창이 열릴 때 default.qt 파일을 읽어서 설정하니, 입력한 정보를 default.qt 파일에 저장할 것을 권장한다.
1) SDK : WIPI SDK (이노에이스) : 통합툴 (WIPI 1.2, WIPI 2.0) ** 1.2, 2.0 동시 설치 x
2) IDE : Visual Studio 6.0
3) Compiler : ARM 1.2 (버전은상관없으나), GCC
4) 그래픽 : Photoshop 8.0CS (png 용량 최소화)
- KTF 개발환경
1) SDK : WIPI SDK (지오텔) : 통합툴 (WIPI 1.2), WIPI 1.1은 예전 SDK 사용
2) IDE : Visual Studio 6.0
3) Compiler : cygwin(+arm( cass 제공)), GCC
4) 그래픽 : Photoshop 8.0CS (png 용량 최소화)
-skin c:\xce\wipi_java122\device_info\176202.xml -classpath /MyExample/smMIDlet
/classes smMIDlet
- 옵션정리
-h : 힙사이즈
-skin : 스키지정
-classpath : 클래스 위치 지정
패스를 지정할 때는 설치된 폴더(c:\xce\wipi_java122)이 root가 된다는 점에 유의해야 한다.
-classpath c:\xce\wipi_java122/MyExample 과 같이 하지 않고,
root를 기준으로 –classpath /MySample 과 같이 지정한다.
MC_knlAlloc 또는 MC_knlCalloc 으로 할당된 메모리를 MC_knlFree 로 해제 했다고 해서 완전히 해제되는 것이 아니며 MC_knlGetFreeMemory 를 호출하여 컴팩션을 해주어야 한다. 이 때 동적 할당된 메모리의 포인터가 바뀔 수 있으므로 할당된 메모리 포인터 이용시 MC_GETPTR 을 이용하여 다시 포인터를 얻어야 한다.
* 도움될만한 퍼온글 (www.mobilejava.com WIPI-C 게시판)
Q1. WIPI에서 Memory Compaction을 지원합니다. 이 COMPACTION이 Fragmentation을 줄이기 위한 일반 정렬 수준인지 아니면 정말 메모리를 절약할 수 있는 압축기술을 쓰는 것인지 궁 금합니다. 메모리가 정말 압축 될 것이라고 생각하기는 힘든데 혹시나 해서 여쭤봅니다.
A1. 제가 보기에는 WIPI에서 지원하는 Compaction은 Fragmentation을 줄이기 위한것 같네요. 여지껏 메모리를 압축하는것은 엄청난 기술이며... 여지껏 경험을 못해봤기 때문입니다. 그리고 압축하는거라면 거기에 따른 프로세싱 타임이 있어서 약간의 작업시간이 걸릴듯 하구요. 어쨌든 압축을 하기 위해 작업중에는 또 다른 공간이 필요함으로서 메모리를 더 쓰면 썼지... 절약은 되지 않는다고 봅니다... 다만 작업완료후에는 엄청나게 줄어들겠죠... 이래저래 디코딩이나 인코딩 하기 위해서는 추가 메모리 영역 사용 및 작업시간으로 손해를 보게 되는군요. 답변은 No입니다.
Q2. 수시로 Memory Compaction이 일어난다면 메모리 번지를 리턴받은 후 재사용할 때는 문제가 생길 수 있는건가요? 예를 들면 어플 초기화 단계에서 gLCDFrameBuffer = (WORD*)MC_GRP_GET_FRAME_BUFFER_POINTER(g_GrpFrameBuffer); 와 같이 gLCDFrameBuffer에 포인터를 리턴 받았다고 했을 때 일정 루틴을 실행 한 다음 gLCDFrameBuffer 값을 그대로 사용하면 Compaction으로 인한 메모리 주소가 변경이 생겨 심각한 문제가 생길 수 있는가 하는 것이지요. 만약 그렇다면 항상 MC_GRP_GET_FRAME_BUFFER_POINTER(g_GrpFrameBuffer); 이렇게 포인터를 받아 와야 하는 것인가요? 물론 Memory Compaction 기능이 지원되지만 수시로 이루어 지는 것이 아니라 개발자가 직접 명령을 내리는 것이라면 다르겠지만요.
A2. 사용자가 원하는 메모리 영역이 확보되어있다고 하지만 메모리가 Fragmentation 되어있다면... 메모리 할당은 이루어지지 않습니다. 이러한 상황을 해결하기 위한것이 Compaction 입니다. 이미 할당해 놓은 메모리 영역이 있음에도 불구하고 Compaction이 발생되게 되면 일단 미리 지정해놓은 메모리 포인터는 변경이 됩니다. 그리고 Compaction은 수시로 발생이 되나 발생되는 시점이 한정되어져 있습니다. 메모리 할당이라든지 메모리 재할당 등등... 대체적으로 메모리 사용 관련과 연관이 있죠. 그러기에 이부분에서만 실수를 안하시면 그렇게 문제는 안될것 같네요. 그리고 MC_knlCalloc 같은 메모리 할당을 했을시 넘어오는 ID값을 잘 생각하셔야 합니다. WIPI에서는 메모리 할당을 했을시 넘어오는 값이 포인터가 아닌 ID값이죠. 내부적으로 메모리 관리자가 있는듯 하구요. 거기에서 ID값에 맞는 포인터 값을 관리합니다. 그리고 메모리 할당을 한 포인터로 접근할시에 MC_GETDPTR 를 사용하여 ID값 전달후 넘어오는 포인터로 접근해서 사용하시면 될듯합니다. 그냥 메모리 포인터만으로 사용하시면 Compaction 이 발생한후에는 보관중이 포인터가 변경이 되기전 포인터이기에 다른 메모리영역 violation이 일어나게 됩니다. 그리고 내부적으로 Compaction은 자주 발생이 되며, 사용자가 MC_knlCalloc 하기전 메모리 영역이 확보가 되기 위한 작업으로 직접 Compaction을 내릴수 있습니다. MC_knlGetFreeMemory를 사용하여 메모리 할당전에 미리 Compaction을 발생시키는 거죠. 그러므로 사용자가 항상 Compaction이 일어났는지는 알길이 없다는겁니다. 그러기에 항상 포인터에 접근하실려면 Helper 함수를 통해 포인터를 매번 구해오셔야 합니다. 답변은 Yes입니다.