3.31.2010

build celogflush.exe in VS2005

celogflush.exe 的 source code 在
C:\WINCE600\PUBLIC\COMMON\SDK\SAMPLES\CELOG\FLUSH\CELOGFLUSH
實際上也有用到上層的
transport.c, transport.h
所以
  • VS2005 新開一個 smart device console mode project
  • copy celogflush 下的 .cpp, .h 和 上層(flush)的 transport.c, transport.h 到 project folder
  • 用 celogflush.cpp 取代原 project 的 source,並且加入 transport.c
  • 加入 stdafx.h 後還是發生問題,所以到 build option 中把precompile header 關掉不用
  • 修改 原 celogflush.cpp 加入:
    #include "pkfuncs.h"
    extern "C"
    {
    #include "transport.h"
    }
  • 把WINCE600 COMMON OAK 裡的 toolhelp.h, vmlayout.h, pkfunc.h copy 到目錄下。
  • build project,發現include 不到時,把 include < > 改為 include " "

3.29.2010

celogflush.exe

有關 celog,好像有source code,在
C:\WINCE600\PUBLIC\COMMON\SDK\SAMPLES\CELOG\

有 celogflush.exe 的 source code。

但是沒有 celogflush_lib.lib 的 source。


要build celogflush.exe 可以到 celogflush 目錄下:
 sysgen -p common celogflush
relese directory 就會有新的 celogflush.exe

從 source code 可以看出來,celog 是可以停止的,停止的方法是 set event,event name 是:
"SYSTEM/CeLogFlush Quit"
宣告在同目錄的 transport.h

停止的 ap 也寫好了,一樣在 common sdk tool celog 目錄: celogstopflush.exe



結果在 啟動 celogflush.exe 時有 error message:
CeLogFlush: Failed to load CeLog DLL
但是 手動把 celog.dll 和 celogflush.exe copy 到 windows 目錄後,就可以手動啟動了。
這好像是因為 multi-xip 的原因,celog.dll, celogflush.exe 要在boot kernel 的 bin part (跟nk.exe 一起)。
所以要手動修改 %_FLATRELEASEDIR%\common.bib:
IF IMGCELOGENABLE
celog.dll $(_FLATRELEASEDIR)\celog.dll TINYNK SHK
IF IMGAUTOFLUSH
celogflush.exe $(_FLATRELEASEDIR)\celogflush.exe TINYNK SH
ENDIF IMGAUTOFLUSH
其中 TINYNK 就是multixip 的 part I - booting 的部份。


不然就要修改 makexip.js,把 celog.dll 和 celogflush.exe 加到filelist

這一篇 news groupe 文章有說,可以改..

KMOS

You could fix that by alter the launch sequence (LaunchXX) of CeLogFlush in
[HKEY_LOCAL_MACHINE\init]
Or alter the CeLogFlush (source can be found in
PUBLIC\COMMON\SDK\SAMPLES\CELOG\FLUSH\CELOGFLUSH\flush.c) to delay the file
openning

.

3.25.2010

Celog : log on local files

Enable Celog 並且log 到 localfile

在 project option enable celog 和 celogflush 後,
設定部份要參考
http://msdn.microsoft.com/en-US/library/ee481192%28v=WinEmbedded.60%29.aspx

很好心的列出 log 在 SDCard 的方法..

但是我照著作卻不會成功,有一篇在 newsgroupe 的說明好像是說 在 system/init 啟動的 celogflush 太早,常常不能正確的 access registry setting,所以會不正確...

還有如果log到 localfile,又是 physical storage(不是ram)的話,要注意,當 celogflush 啟動的時候,一堆 storage都還沒mount 起來.......(唉~~)




另外一個,手動啟動的方法,不用 rebuild OS (所以 boot message log 不到)
http://msdn.microsoft.com/en-us/library/ms905191.aspx
  • Copy CeLog.dll and CeLogFlush.exe 到 \Windows 目錄
  • 在 SD 上 creatr 一個 "flush.lnk",內容是
    83#\Windows\celogflush.exe -buf 0x100000 -time 60000 -n \celog.clg -z 0x00800000 -ui 1
    對應的reg 設定是:

    [HKEY_LOCAL_MACHINE\System\CeLog]
    "Transport"="LocalFile"
    "FileName"="\\celog.clg"
    "ZoneCE"=dword:"00800000"
    "BufferSize"=dword:"100000"
    "UseUI"=dword:1
    這一個在system boots 時不能設1,因為GWES還沒起來。
  • 插入SD card,double click flush.lnk
會有一個 dialog 顯示log 到 \celog.clg

看 celog.clg 內容的方法:
  • 到 \ 去看(因為剛剛指定 \celog.clg),可以找到 celog.clg,copy 到 SD card
  • 開啟 VS2005 - platformbuilder -- open reslease directory
  • 在 dos prompt 下command
  • readlog celog.clf output.txt
..

所以為了避免麻煩,把celog.dll, celogflush.exe 放進 kernel image 好了..
如果是XIP的話,要放在 boot 的 bin part
也就是要改 makexip.js

CeFindFirstRegChange : monitor registry changes for you

這一篇文章(http://ce4all.blogspot.com/2010/03/registry-notifications-to-pass-data.html) 提到。
原來,可以利用CeFindFirstRegChange( ) 來幫忙 monitor registry 的變更。
然後用 WaitForSingleObject( ) 就可以了。
免去一直 pollig registry 的麻煩。

在 MSDN 也有說明這個: State and Notification Broker

偉大的 Bruce Eitman 有一系列文章講這個: http://geekswithblogs.net/BruceEitman/archive/2009/08/25/windows-ce-cereggetnotificationinfo-works-sort-of-part-3.aspx

... 嗯,沒錯,這篇只是一篇書籤而已 XD

維持Dialog 在最上面

要讓一個dialog 一直維持在最上層,不被其他AP蓋掉。
可以在 timer 的 handler 加上:

RECT rect;
GetWindowRect(hWnd,&rect);
SetWindowPos(hWnd,HWND_TOPMOST,
rect.left,rect.top,
rect.right-rect.left,rect.bottom-rect.top,
SWP_SHOWWINDOW);

定期的把自己 (hWnd) 設為 TOPMOST

3.24.2010

用 GetSystemInfo( ) 可以取得系統 的 SYSTEM_INFO 資料。
其中包含:
  • PageSize : 在 CE 6.0, ARM 上讀出是 4096 (4k)
  • AllocationGranularity : CE 6.0, ARM 上讀出是 65536 (64k)

CE 6.0 的不同

這一篇 (http://msdn.microsoft.com/en-us/library/bb331824.aspx) 說的.

下面這些 IPC, CE 6.0 還是支援:
  • RAM-backed memory-mapped files,
  • point-to-point message queues,
  • WM_COPYDATA message.

下面這些利用 CE Memory "Slot" 特性的 API 就沒辦法支援了:
  • MapCallerToProcess and
  • SetProcPermissions APIs
其中
SetProcPermissions 可以用e ReadProcessMemory and WriteProcessMemory 來代替

Process 之間也不能用直接傳遞 Handle 的方式來共用了,傳遞之前要用
DuplicateHandle 來 clone handle 後再傳給其他 process

一團混亂的 *.reg 設定

platform builder 裡有一堆 registry 設定 (*.reg)
registry 設定同一個 path 的 value 可以設定很多次,platform builder 會以最後一個為準
(也就是說,後來設的會 overwrite 前面的)

所以你要是在某 *.reg 中看到某個 key 設定,也不代表真正 build 出來的 image 的 key 會是這個值。
或許,某個 *.reg,或是同一個 *.reg 的後面設定,又把這個 key 改了..
...真是個災難呀..

但是 MSDN 說(http://msdn.microsoft.com/en-us/library/ee490779.aspx)
Platform.reg 會 overwrite Project.reg 和 Common.reg。
Project.reg 會 overwrite Common.reg
要看最後build 出來的 reg ,可以到 %_FLATRELEASEDIR% 的 reginit.ini 去看
.. 當然,這要在 build 出 image 後才會有

3.09.2010

Clean build include public folder

在 CE 6.0 的 Build -Advance Build Commands - Rebuild and clean sysgen
連 public folder 都會重 build。
所以執行時會出現 prompt message。

實際執行的 command 是

blddemo clean cleanplat -c

附:
只做 bsp 部份的 clean build 是

blddemo clean -c