2010年9月30日 星期四

USB Request Block & USB Protocol

5.1 Sync Field
Each USB packet starts with a SYNC field. This is basically used to synchronise the transmitter and the receiver so that the data can be transferred accurately.
In a USB slow / full speed system this SYNC field consists 3 KJ pairs followed by 2 K’s to make up 8 bits of data.
In a USB Hi-Speed system the synchronisation requires 15 KJ pairs followed by 2 K’s to make up 32 bits of data

Bus Hound 裏面有關 URB

USB Request Block 是定義在 Windows 或 Linux 中
跟實際的USB Protocol 沒有關係
URB 的定義在 usb.h 中
它是各種不同的定義的集合 ( union )
http://msdn.microsoft.com/en-us/library/ff538923(VS.85).aspx

2010年9月27日 星期一

sal.h

在做 USB Printer 的專案(x86)時,會用到 GUID_DEVINTERFACE_USB_DEVICE
及 IOCTL_PAR_QUERY_DEVICE_ID
所以要
#include
#include

而這兩個檔案是在 Windows DDK (WDK)裏有,所以要 add additional include directory
在 wdk 中的 \inc\api

現在問題來了,原來的project 為 vs2005
轉換成vs2008後 會出現一堆沒有定義 _In_opt 等等的錯誤
(為什麼要轉成 vs2008 的原因 是因為在vs2005中 下斷點有問題
有些部份無法設 breakpoint 會出現 the breakpoint will not currently be hit. invalid file line xxx
改成vs2008 之後就好了)

那是因為 vs2008 的 sal.h 和 ddk sdk 中的 sal.h 定義不同
必需要用到原來 vs2008中的 sal.h ( Visual Studio 9.0\vc\include ) 才行
但是因為我們加了 additional include directory
所以 wdk 中的 sal.h 會被先用到....
而造成錯誤

解決方法就是修改 Visual Studio 9.0\vc\include\crtdefs.h
在crtdefs.h 中會
#include
把它改成
#include "sal.h"
就可解決。(目前完美的方式)

...簡單的東西搞出麻煩的過程

2010年9月20日 星期一

build gnash on Windows

http://wiki.gnashdev.org/Building_on_Windows



boost
boost 1.44

cd \tools\jam
build_dist.bat

然後 build 出3個 Library?
libboost_program_options-vc100-mt-gd-1_44.lib
libboost_filesystem-vc100-mt-gd-1_44.lib
libboost_system-vc100-mt-gd-1_44.lib

2010年9月14日 星期二

WINCE 6.0 image making

嘗試 WinCE 6.0 Image 的 build,
在build minimal configuration 時
出現don't know how to make xxx\....\ndis.lib 的錯誤
ndis.lib 是在 core os->CEBASE -> shell and interface -> user interface -> network user interfacer


porting 參考 
http://blog.csdn.net/xilidecai/archive/2009/09/18/4566731.aspx


LNK2001: unresolved external symbol __CxxFrameHandler3 in otg


要加選 C++ Runtime support for Exception Handling and RTTI




Config.bib 中還是設定 AUTOSIZE=ON 比較好,一來沒有空間不夠的問題,二來能釋放出更多的記憶體。

2010年9月9日 星期四

Thread, Thread Quantum 測試

為了解決一些常見的煩人問題
只好實地下去測試 WinCE Thread 的運作機制

結果非常有趣,跟想像理解中有所不同


1. WinCE default time slice ( quantum )是為 100ms,OEM可以自己設定。(在OEMInit中設定 dwDefaultThreadQuantum) 。CE 也提供了2個函式 CeGetThreadQuantum and CeSetThreadQuantum


extern DWORD dwDefaultThreadQuantum;
 
 
void OEMInit()
{
                dwDefaultThreadQuantum = 50;
}

2.  Sleep(0)  就是把目前thread 剩下的 quantum 時間 ( <=100ms) 讓給 同Priority 的 Thread。如果沒有同Priority 的Thread ,則馬上 return. 也就是說 Sleep(0) 有兩種可能(效果)  
 I. 睡100ms (或更少) 
 II.沒有效果(馬上return)

3. Sleep(1) (或Sleep(X))  就很有趣了,就實地測試,依環境不同,有不同的結果。
如果只有2個同 Priority 的Thread, Sleep(1) 後再度醒來已經是 100ms後了。
如果有3個 Thread,則 Sleep(1) 大概睡 3~9ms。
神奇吧?

2010年9月7日 星期二

null, nullptr

簡單來說
在 C# / Java, use null
在 C++, use NULL
在 C++ .NET ( compile with /clr ), use nullptr