偷拍小视频99在线,www久久com,一级做a爰片欧美aaaahttp://www.bjzhda.cnzh-cn曙海教育集團論壇http://www.bjzhda.cnRss Generator By Dvbbs.Netofficeoffice@126.comimages/logo.gif曙海教育集團論壇wince驅動開發學習筆記http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1396&Page=1wangxinxin2010-11-16 14:53:22嵌入式開發技術:wince驅動開發學習筆記

首先是wince驅動的分類問題。按照書上講的說CE下驅動分成單體驅動和分層驅動,而看到另一種說法是本機驅動和流式驅動。經過microsun大哥的指點,把這兩種分類法分開了。在這里引用一下:

“單體與分層只是從代碼的形式上做的分類.分層驅動代碼上分為PDD與MDD,一般的微軟已經實現了MDD,可能也實現了PDD,我們只需要對PDD做些修改就能使用,比如音頻的驅動,顯示的驅動。單層驅動是把PDD與MDD寫在一起,沒有做嚴格的區分,通常這種驅動比較簡單,比如:ATADISK。

嵌入式 嵌入式開發 嵌入式系統 wince驅動開發

至于本地驅動和流式驅動是從驅動與系統其它模塊(調用者)的接口形式上做的分類.其實,本地驅動這個名稱不大恰當,可能叫專用驅動或其它名字更為合適.它是指調用它的模塊給它有特定的接口,比如電源驅動和通用LED驅動。而串口,網卡等就是流接口驅動程序.

所以,一個驅動程序可以是單體的流式驅動,例如:ATADISK.也可以是分層的流式: 如OHCI ”

       按照我的理解,單體和分層是驅動實現方式上的分類,而本地和流式則是驅動模型上的分類,所謂本地驅動就是操作系統有保留專門的接口,所謂流式是指編寫的DLL文件里可以導出各種流式接口函數。

         第二點:驅動的功能屬性。設備驅動程序是操作系統內核和硬件的接口,操作系統定義了一組標準的接口,編寫驅動的過程也就是實現這些接口。從應用程序到具體硬件間有如下這些環節起作用:應用程序-調用OS函數-操作系統-驅動接口-驅動程序-硬件操作函數-硬件。在wince里驅動都以用戶態的DLL存在,需要通過進程加載到slot里。共有三類系統進程用來加載:Device.exe,GWES.exe,FileSys.exe.絕大多數設備驅動都是通過Device.exe加載的。需要注意的是,不同的OS保留的設備驅動接口是不一樣的,如桌面windows和wince就不同。

     第三點:wince下設備的初始化分為兩個階段:Device.exe的初始化;外設的枚舉和加載。其流程是:上電-啟動bootloader-啟動NK-啟動注冊表init鍵(Device.exe啟動)-初始化數據結構,I/O,電源管理等-加載BusEnum.dll(總線枚舉器)-枚舉注冊表下Driver/buildin的所有子鍵。這里的枚舉過程就是循環調用ActivateDeviceEx()函數加載驅動的過程。在OS啟動完畢后,我們可以用PB的Remote Registry Tool查看H_L_M/drivers/active包含的子鍵,看哪些驅動隨啟動而加載 。

     第四點:流接口驅動的概念。暴露流式接口函數的驅動即是流驅動,它把外設抽象成一個文件。過程是:應用程序使用文件API對設備進行訪問,OS接受API調用FileSys.exe,轉到device.exe,調用流接口,與硬件交互。所謂流接口函數有十個,包括XXX_Init、XXX_Deinit、XXX_Open、XXX_Close、XXX_Read、XXX_Write、XXX_PowerUp、XXX_PowerDown、XXX_Seek、XXX_IOControl,在wince5.0中增加le了XXX_PreClose,XXX_PreDeinit.而我們在應用程序里對應的文件API有CreateFile、DeviceIoControl、 ReadFile、 WriteFile,CloseHandle,SetFilePointer. 

      第五點:編寫流驅動的步驟。有兩種實現途徑:1。寫DLL,做成Project,加入到OS里。2。改BSP,把驅動寫在BSP里,再選擇那個BSP做OS。第一種方法步驟是在PB中新建一個DLL項目,編寫一些輸入函數,寄存器,外設的聲明,寫DLLENTRY函數;實現流接口函數;編寫DLL的導出函數文件.DEF;為驅動程序寫入注冊表項,還需要修改bib文件。 第二種方法就是在platform/BSP/drivers下新建一個目錄,然后在drivers目錄中的dirs文件中加入新建的目錄名。在新建的目錄下,新建你的源代碼文件,在其中實現DLL函數。新建名稱分別為sources, makefile, ***.def的文件;修改platform.reg和platform.bib文件

]]>
winCE 注冊表相關討論http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1395&Page=1wangxinxin2010-11-16 14:46:47這一章主要講解Windows CE.NET下注冊表相關技術。

1、 對象存儲(object store)
  對象存儲是Windows CE默認的數據存儲機制。任何新創建的內核中都默認包含對象存儲器。對象存儲的實質是在RAM中創建一個文件系統,將文件保存在RAM中,這些文件來源于ROM。當設備啟動時,引導程序將ROM中的內核文件解壓并存放在RAM中。"\windows"目錄就是基于對象存儲的。對象存儲的特點是文件可以壓縮、支持事務機制(和數據庫中的事務機制相似)、數據I/O相對較快。

A、對象存儲中的對象類型包括文件、目錄、數據庫、記錄、數據庫卷。CE為每個對象分配一個對象ID(CEOID)。訪問或者操作任何對象的前提是得到該對象ID。
B、CE能夠自動壓縮所有對象存儲中的文件(CE提供了一個選項供OEM設置是否能夠自動壓縮文件)。所以文件沒有壓縮或不壓縮的標志,但是有一個標志,標明此文件存在于ROM還是RAM中。一個文件最大長度可達到4 GB。
C、CE提供了三種文件系統:基于ROM的文件系統、基于RAM的文件系統、FAT文件系統。
2、 注冊表(registry)
  CE下注冊表和其它windows操作系統中注冊表概念和結構基本相同。

A、CE下注冊表限制:鍵名最大長度255個字符; 數據最大 4KB;子鍵深度最大值 16層。
B、根鍵有HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE、HKEY_USERS。
C、操作注冊表函數:

i. 打開RegOpenKeyEx 和創建RegCreateKeyEx 
ii. 讀RegQueryValueEx寫RegSetValueEx 
iii. 枚舉入口或子鍵RegEnumValue、RegEnumKeyEx 
iv. 刪除入口或子鍵RegDeleteValue、RegDeleteKey  
v. 關閉RegCloseKey
3、CE下注冊表類型
  分為基于RAM的注冊表和基于HIVE的注冊表。

 

A、基于RAM的注冊表,也叫基于對象存儲(oject storage)的注冊表。用于將注冊表數據全部保存在RAM中。
i. 從CE v1.0開始到CE .NET之前,僅采用此技術來保存注冊表。每個新創建的內核都默認采用此技術來保存注冊表。
ii. 適合頻繁熱啟動而不冷啟動的設備。系統關閉時提供低電源給RAM。如果斷電,重新啟動設備后,系統將從內核中重新讀取注冊表數據到RAM。當然以前保存的用戶數據已經丟失。
iii. 基于RAM的注冊表也能夠永久保存注冊標數據。CE提供了兩個機制。

1) 第一種機制的設計思路是在設備關閉前調用RegCopyFile函數將整個注冊表數據以文件形式保存到永久存儲器上。重新啟動設備時,調用RegRestoreFile函數將文件全部讀出到RAM中。但是這時必須一次熱啟動才能使恢復的注冊表數據有效。所以每次啟動就多出一次熱啟動。好在熱啟動非常快,幾秒鐘的時間。
2) 另一種機制可以避免前一種機制的需要兩次啟動的缺點。但也有它的缺點。OEM(原始設備制造商)可以在OAL層編寫WriteRegistryToOEM and ReadRegistryFromOEM兩個函數,內核在啟動時會自動調用ReadRegistryFromOEM函數來讀注冊表數據。而應用程序調用RegFlushKey函數時,這個函數用調用WriteRegistryToOEM函數寫注冊表數據到永久存儲器上。這個機制避免了兩次啟動的缺陷。但問題出現在內核啟動時,調用ReadRegistryFromOEM之前文件系統驅動程序還沒加載,那就無法打開、讀取文件。CE幫助文件中說解決辦法是將從永久存儲器中讀取數據的代碼加到ReadRegistryFromOEM中。幫助中說的意思可不是調用ReadFile這么簡單的,因為文件系統驅動程 序還沒加載。
3) 個人建議:如果要采用基于RAM的注冊表保存機制,而且要求永久保存注冊表數據,使用第一種機制比較容易。
B、 基于HIVE的注冊表。用于將注冊表數據全部或部分保存到永久存儲器上。
i.它是從CE.NET開始采用的新技術。適合經常冷啟動而不熱啟動的設備。
ii.支持多用戶信息分別保存。當一個用戶登錄時,加載這個用戶的注冊表數據,注銷時卸載這個用戶的注冊表數據。
iii. HIVE是指一組鍵,包括子鍵、鍵值、數據。是保存或者加載注冊表數據的單位。分為系統HIVE(system hive)、用戶HIVE(uer hive)、引導HIVE(boot hive)。
1) 系統HIVE包含了關于系統的設置信息。具體保存注冊表中HKEY_LOCAL_MACHINE、HKEY_CLASSES_ROOT、HKEY_USERS鍵下所有數據。保存系統HIVE的文件的路徑在【HKEY_LOCAL_MACHINE\init\BootVars】下,鍵名為"systemhive",鍵值為文件的路徑。默認為"\Documents and Settings\system.hv"。
2) 用戶HIVE包含了一個用戶的信息。具體保存注冊表中HKEY_CURRENT_USER鍵下所有數據。保存用戶HIVE的文件的路徑同樣為【HKEY_LOCAL_MACHINE\init\BootVars】下,鍵名為"profiledir",鍵值為所有用戶HIVE的共同目錄。默認為"\Documents and Settings",在這個目錄下包含了以每個用戶名命名的子目錄。子目錄里含有一個文件,默認文件名為user.hv。
3) 引導HIVE保存在ROM(內核)中。具體保存內容同系統HIVE一樣。當解壓內核并加載注冊表時,系統先將引導HIVE數據讀出,引導HIVE包含了永久存儲器的驅動程序和文件系統的驅動程序,這些驅動加載后,系統HIVE被加載,然后引導HIVE被釋放。因為引導HIVE被包含在內核中,所以存在一種情況:如果重新做了一個新內核,引導HIVE中的數據同系統HIVE可能不相同。那么系統該加載哪個版本好呢?為此,CE在生成每個內核時都做了一個標志。而系統HIVE也存在這樣一個標志,當加載引導HIVE時,如果引導HIVE和系統HIVE的標志不相同,系統會刪除系統HIVE文件,然后重新創建一個文件并從引導HIVE復制數據。
iv. 永久保存注冊表數據
Windows CE.NET采用新的注冊表保存技術――基于HIVE的注冊表,的確讓人很興奮,在這之前基于Windows CE的設備,大多數采用給RAM供電方式來保存注冊表數據,雖然也可以通過RegCopyFile函數永久保存,但畢竟啟動時還要再熱啟動一次,有了基于HIVE的技術,啟動時系統會自動加載數據,免去了熱啟動的麻煩,而且當內核更新升級時,你不用擔心保存在永久存儲器上的系統HIVE文件影響你新的內核,系統會自動判斷并刪除過時的系統HIVE文件。只有擁有了這樣的技術,基于CE的產品才算是一個真正的電腦。
注:關于基于HIVE的注冊表的實現,暫不講解。
下面簡單說明 RegCopyFile和RegRestoreFile的用法。
///使用基于RAM的注冊表,利用RegCopyFile和RegRestoreFile
///實現永久保存注冊表數據。

#include <Pkfuncs.h>
#include <winbase.h>

CString  strRegBackup = L"\\hard disk\\RegBackup.reg";
CString  strTmp      = L"\\windows\\temp.reg";

////////導出。在系統關閉前。 
if(! RegCopyFile(strTmp))     ///導出注冊表,用temp.reg做緩沖用。
{
 return FALSE; 
}

if(! CopyFile(strTmp, strRegBackup, FALSE))  ///把temp.reg再復制到RegBackup.reg
{
 return  FALSE;
}

/////////導入。在系統啟動時。
if(! CopyFile(strRegBackup, strTmp, FALSE))
{
 return  FALSE;
}

if(! RegRestoreFile(strTmp))  ///恢復注冊表
{
 return  FALSE;
}

if(! KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL)) ///重新啟動
{
 return  FALSE;
}


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/ymzhou117/archive/2009/11/11/4799873.aspx

]]>
支持wince5.0的6串口單板電腦http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1394&Page=1wangxinxin2010-11-16 14:38:53
以下內容含腳本,或可能導致頁面不正常的代碼
說明:上面顯示的是代碼內容。您可以先檢查過代碼沒問題,或修改之后再運行.
]]>
DC平臺 WINCE下開發DVD播放器http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1393&Page=1wangxinxin2010-11-16 14:37:38想在Dreamcast上的WinCE&DirectX6.1 SDK 開發DVD播放器
目前網上找了個DVD解碼源代碼
利用DC的SH4
unsigned int CSStab0[11]={5,0,1,2,3,4,0,1,2,3,4};
unsigned char CSStab1[256]=
{
0x33,0x73,0x3b,0x26,0x63,0x23,0x6b,0x76,0x3e,0x7e,0x36,0x2b,0x6e,0x2e,0x66,0x7b,
0xd3,0x93,0xdb,0x06,0x43,0x03,0x4b,0x96,0xde,0x9e,0xd6,0x0b,0x4e,0x0e,0x46,0x9b,
0x57,0x17,0x5f,0x82,0xc7,0x87,0xcf,0x12,0x5a,0x1a,0x52,0x8f,0xca,0x8a,0xc2,0x1f,
0xd9,0x99,0xd1,0x00,0x49,0x09,0x41,0x90,0xd8,0x98,0xd0,0x01,0x48,0x08,0x40,0x91,
0x3d,0x7d,0x35,0x24,0x6d,0x2d,0x65,0x74,0x3c,0x7c,0x34,0x25,0x6c,0x2c,0x64,0x75,
0xdd,0x9d,0xd5,0x04,0x4d,0x0d,0x45,0x94,0xdc,0x9c,0xd4,0x05,0x4c,0x0c,0x44,0x95,
0x59,0x19,0x51,0x80,0xc9,0x89,0xc1,0x10,0x58,0x18,0x50,0x81,0xc8,0x88,0xc0,0x11,
0xd7,0x97,0xdf,0x02,0x47,0x07,0x4f,0x92,0xda,0x9a,0xd2,0x0f,0x4a,0x0a,0x42,0x9f,
0x53,0x13,0x5b,0x86,0xc3,0x83,0xcb,0x16,0x5e,0x1e,0x56,0x8b,0xce,0x8e,0xc6,0x1b,
0xb3,0xf3,0xbb,0xa6,0xe3,0xa3,0xeb,0xf6,0xbe,0xfe,0xb6,0xab,0xee,0xae,0xe6,0xfb,
0x37,0x77,0x3f,0x22,0x67,0x27,0x6f,0x72,0x3a,0x7a,0x32,0x2f,0x6a,0x2a,0x62,0x7f,
0xb9,0xf9,0xb1,0xa0,0xe9,0xa9,0xe1,0xf0,0xb8,0xf8,0xb0,0xa1,0xe8,0xa8,0xe0,0xf1,
0x5d,0x1d,0x55,0x84,0xcd,0x8d,0xc5,0x14,0x5c,0x1c,0x54,0x85,0xcc,0x8c,0xc4,0x15,
0xbd,0xfd,0xb5,0xa4,0xed,0xad,0xe5,0xf4,0xbc,0xfc,0xb4,0xa5,0xec,0xac,0xe4,0xf5,
0x39,0x79,0x31,0x20,0x69,0x29,0x61,0x70,0x38,0x78,0x30,0x21,0x68,0x28,0x60,0x71,
0xb7,0xf7,0xbf,0xa2,0xe7,0xa7,0xef,0xf2,0xba,0xfa,0xb2,0xaf,0xea,0xaa,0xe2,0xff
};

unsigned char CSStab2[256]=
{
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x09,0x08,0x0b,0x0a,0x0d,0x0c,0x0f,0x0e,
0x12,0x13,0x10,0x11,0x16,0x17,0x14,0x15,0x1b,0x1a,0x19,0x18,0x1f,0x1e,0x1d,0x1c,
0x24,0x25,0x26,0x27,0x20,0x21,0x22,0x23,0x2d,0x2c,0x2f,0x2e,0x29,0x28,0x2b,0x2a,
0x36,0x37,0x34,0x35,0x32,0x33,0x30,0x31,0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,
0x49,0x48,0x4b,0x4a,0x4d,0x4c,0x4f,0x4e,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
0x5b,0x5a,0x59,0x58,0x5f,0x5e,0x5d,0x5c,0x52,0x53,0x50,0x51,0x56,0x57,0x54,0x55,
0x6d,0x6c,0x6f,0x6e,0x69,0x68,0x6b,0x6a,0x64,0x65,0x66,0x67,0x60,0x61,0x62,0x63,
0x7f,0x7e,0x7d,0x7c,0x7b,0x7a,0x79,0x78,0x76,0x77,0x74,0x75,0x72,0x73,0x70,0x71,
0x92,0x93,0x90,0x91,0x96,0x97,0x94,0x95,0x9b,0x9a,0x99,0x98,0x9f,0x9e,0x9d,0x9c,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x89,0x88,0x8b,0x8a,0x8d,0x8c,0x8f,0x8e,
0xb6,0xb7,0xb4,0xb5,0xb2,0xb3,0xb0,0xb1,0xbf,0xbe,0xbd,0xbc,0xbb,0xba,0xb9,0xb8,
0xa4,0xa5,0xa6,0xa7,0xa0,0xa1,0xa2,0xa3,0xad,0xac,0xaf,0xae,0xa9,0xa8,0xab,0xaa,
0xdb,0xda,0xd9,0xd8,0xdf,0xde,0xdd,0xdc,0xd2,0xd3,0xd0,0xd1,0xd6,0xd7,0xd4,0xd5,
0xc9,0xc8,0xcb,0xca,0xcd,0xcc,0xcf,0xce,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,
0xff,0xfe,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf6,0xf7,0xf4,0xf5,0xf2,0xf3,0xf0,0xf1,
0xed,0xec,0xef,0xee,0xe9,0xe8,0xeb,0xea,0xe4,0xe5,0xe6,0xe7,0xe0,0xe1,0xe2,0xe3
};

unsigned char CSStab3[512]=
{
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff
};

unsigned char CSStab4[256]=
{
0x00,0x80,0x40,0xc0,0x20,0xa0,0x60,0xe0,0x10,0x90,0x50,0xd0,0x30,0xb0,0x70,0xf0,
0x08,0x88,0x48,0xc8,0x28,0xa8,0x68,0xe8,0x18,0x98,0x58,0xd8,0x38,0xb8,0x78,0xf8,
0x04,0x84,0x44,0xc4,0x24,0xa4,0x64,0xe4,0x14,0x94,0x54,0xd4,0x34,0xb4,0x74,0xf4,
0x0c,0x8c,0x4c,0xcc,0x2c,0xac,0x6c,0xec,0x1c,0x9c,0x5c,0xdc,0x3c,0xbc,0x7c,0xfc,
0x02,0x82,0x42,0xc2,0x22,0xa2,0x62,0xe2,0x12,0x92,0x52,0xd2,0x32,0xb2,0x72,0xf2,
0x0a,0x8a,0x4a,0xca,0x2a,0xaa,0x6a,0xea,0x1a,0x9a,0x5a,0xda,0x3a,0xba,0x7a,0xfa,
0x06,0x86,0x46,0xc6,0x26,0xa6,0x66,0xe6,0x16,0x96,0x56,0xd6,0x36,0xb6,0x76,0xf6,
0x0e,0x8e,0x4e,0xce,0x2e,0xae,0x6e,0xee,0x1e,0x9e,0x5e,0xde,0x3e,0xbe,0x7e,0xfe,
0x01,0x81,0x41,0xc1,0x21,0xa1,0x61,0xe1,0x11,0x91,0x51,0xd1,0x31,0xb1,0x71,0xf1,
0x09,0x89,0x49,0xc9,0x29,0xa9,0x69,0xe9,0x19,0x99,0x59,0xd9,0x39,0xb9,0x79,0xf9,
0x05,0x85,0x45,0xc5,0x25,0xa5,0x65,0xe5,0x15,0x95,0x55,0xd5,0x35,0xb5,0x75,0xf5,
0x0d,0x8d,0x4d,0xcd,0x2d,0xad,0x6d,0xed,0x1d,0x9d,0x5d,0xdd,0x3d,0xbd,0x7d,0xfd,
0x03,0x83,0x43,0xc3,0x23,0xa3,0x63,0xe3,0x13,0x93,0x53,0xd3,0x33,0xb3,0x73,0xf3,
0x0b,0x8b,0x4b,0xcb,0x2b,0xab,0x6b,0xeb,0x1b,0x9b,0x5b,0xdb,0x3b,0xbb,0x7b,0xfb,
0x07,0x87,0x47,0xc7,0x27,0xa7,0x67,0xe7,0x17,0x97,0x57,0xd7,0x37,0xb7,0x77,0xf7,
0x0f,0x8f,0x4f,0xcf,0x2f,0xaf,0x6f,0xef,0x1f,0x9f,0x5f,0xdf,0x3f,0xbf,0x7f,0xff
};

unsigned char CSStab5[256]=
{
0xff,0x7f,0xbf,0x3f,0xdf,0x5f,0x9f,0x1f,0xef,0x6f,0xaf,0x2f,0xcf,0x4f,0x8f,0x0f,
0xf7,0x77,0xb7,0x37,0xd7,0x57,0x97,0x17,0xe7,0x67,0xa7,0x27,0xc7,0x47,0x87,0x07,
0xfb,0x7b,0xbb,0x3b,0xdb,0x5b,0x9b,0x1b,0xeb,0x6b,0xab,0x2b,0xcb,0x4b,0x8b,0x0b,
0xf3,0x73,0xb3,0x33,0xd3,0x53,0x93,0x13,0xe3,0x63,0xa3,0x23,0xc3,0x43,0x83,0x03,
0xfd,0x7d,0xbd,0x3d,0xdd,0x5d,0x9d,0x1d,0xed,0x6d,0xad,0x2d,0xcd,0x4d,0x8d,0x0d,
0xf5,0x75,0xb5,0x35,0xd5,0x55,0x95,0x15,0xe5,0x65,0xa5,0x25,0xc5,0x45,0x85,0x05,
0xf9,0x79,0xb9,0x39,0xd9,0x59,0x99,0x19,0xe9,0x69,0xa9,0x29,0xc9,0x49,0x89,0x09,
0xf1,0x71,0xb1,0x31,0xd1,0x51,0x91,0x11,0xe1,0x61,0xa1,0x21,0xc1,0x41,0x81,0x01,
0xfe,0x7e,0xbe,0x3e,0xde,0x5e,0x9e,0x1e,0xee,0x6e,0xae,0x2e,0xce,0x4e,0x8e,0x0e,
0xf6,0x76,0xb6,0x36,0xd6,0x56,0x96,0x16,0xe6,0x66,0xa6,0x26,0xc6,0x46,0x86,0x06,
0xfa,0x7a,0xba,0x3a,0xda,0x5a,0x9a,0x1a,0xea,0x6a,0xaa,0x2a,0xca,0x4a,0x8a,0x0a,
0xf2,0x72,0xb2,0x32,0xd2,0x52,0x92,0x12,0xe2,0x62,0xa2,0x22,0xc2,0x42,0x82,0x02,
0xfc,0x7c,0xbc,0x3c,0xdc,0x5c,0x9c,0x1c,0xec,0x6c,0xac,0x2c,0xcc,0x4c,0x8c,0x0c,
0xf4,0x74,0xb4,0x34,0xd4,0x54,0x94,0x14,0xe4,0x64,0xa4,0x24,0xc4,0x44,0x84,0x04,
0xf8,0x78,0xb8,0x38,0xd8,0x58,0x98,0x18,0xe8,0x68,0xa8,0x28,0xc8,0x48,0x88,0x08,
0xf0,0x70,0xb0,0x30,0xd0,0x50,0x90,0x10,0xe0,0x60,0xa0,0x20,0xc0,0x40,0x80,0x00
};

void CSSdescramble(unsigned char *sec,unsigned char *key)
{
unsigned int t1,t2,t3,t4,t5,t6;
unsigned char *end=sec+0x800;

t1=key[0]^sec[0x54]|0x100;
t2=key[1]^sec[0x55];
t3=(*((unsigned int *)(key+2)))^(*((unsigned int *)(sec+0x56)));
t4=t3&7;
t3=t3*2+8-t4;
sec+=0x80;
t5=0;
while(sec!=end)
{
t4=CSStab2[t2]^CSStab3[t1];
t2=t1>>1;
t1=((t1&1)<<8)^t4;
t4=CSStab5[t4];
t6=(((((((t3>>3)^t3)>>1)^t3)>>8)^t3)>>5)&0xff;
t3=(t3<<8)|t6;
t6=CSStab4[t6];
t5+=t6+t4;
*sec++=CSStab1[*sec]^(t5&0xff);
t5>>=8;
}
}

void CSStitlekey1(unsigned char *key,unsigned char *im)
{
unsigned int t1,t2,t3,t4,t5,t6;
unsigned char k[5];
int i;

t1=im[0]|0x100;
t2=im[1];
t3=*((unsigned int *)(im+2));
t4=t3&7;
t3=t3*2+8-t4;
t5=0;
for(i=0;i<5;i++)
{
t4=CSStab2[t2]^CSStab3[t1];
t2=t1>>1;
t1=((t1&1)<<8)^t4;
t4=CSStab4[t4];
t6=(((((((t3>>3)^t3)>>1)^t3)>>8)^t3)>>5)&0xff;
t3=(t3<<8)|t6;
t6=CSStab4[t6];
t5+=t6+t4;
k=t5&0xff;
t5>>=8;
}
for(i=9;i>=0;i--)
key[CSStab0[i+1]]=k[CSStab0[i+1]]^CSStab1[key[CSStab0[i+1]]]^key[CSStab0];
}

void CSStitlekey2(unsigned char *key,unsigned char *im)
{
unsigned int t1,t2,t3,t4,t5,t6;
unsigned char k[5];
int i;

t1=im[0]|0x100;
t2=im[1];
t3=*((unsigned int *)(im+2));
t4=t3&7;
t3=t3*2+8-t4;
t5=0;
for(i=0;i<5;i++)
{
t4=CSStab2[t2]^CSStab3[t1];
t2=t1>>1;
t1=((t1&1)<<8)^t4;
t4=CSStab4[t4];
t6=(((((((t3>>3)^t3)>>1)^t3)>>8)^t3)>>5)&0xff;
t3=(t3<<8)|t6;
t6=CSStab5[t6];
t5+=t6+t4;
k=t5&0xff;
t5>>=8;
}
for(i=9;i>=0;i--)
key[CSStab0[i+1]]=k[CSStab0[i+1]]^CSStab1[key[CSStab0[i+1]]]^key[CSStab0];
}

void CSSdecrypttitlekey(unsigned char *tkey,unsigned char *dkey)
{
int i;
unsigned char im1[6];
unsigned char im2[6]={0x51,0x67,0x67,0xc5,0xe0,0x00};

for(i=0;i<6;i++)
im1=dkey;

CSStitlekey1(im1,im2);
CSStitlekey2(tkey,im1);
本文轉貼自 【 浮游城 - Castle in the Sky | 開放邀請注冊,PS|SS|WII|DC下載研究中心 】 ,原文地址:http://bbs.chinaemu.org/read-htm-tid-93244.html

]]>
主要討論在WinCE設計和開發C...WindowsCE.Net下CAN卡的驅動程序設計31028http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1392&Page=1wangxinxin2010-11-16 14:31:362 CAN卡驅動底層函數設計

本方案設計CAN驅動是放在Windows CE操作系統的內核下層,圖片點擊可在新窗口打開查看位于OEM adaptation layer(OAL)層的一個真正的驅動,而不是在主程序中的串口操作。在Windows CE的設備管理器可以看到CAN1和CAN2兩個端口,并且可以查看其工作的正常與否和對其進行配置。如:中斷號和I/O地址。

2.1 CAN卡寄存器讀寫函數

CAN卡的通信是通過操作CAN卡上的CAN控制器進行的。在CAN控制器中有很多寄存器,如控制寄存器、命令寄存器、狀態寄存器、中斷寄存器等,通過讀寫這些寄存器中的命令狀態字可以檢測和控制CAN卡的行為。在Windows CE.NET下,通過調用DOK中的API函數HalTranslateBusAddress,將CAN卡分配的物理地址映射為邏輯地址。這樣各個寄存器對應的就是CAN卡基地址的偏移地址,因此,對寄存器的讀寫就轉化為對內存地址的讀寫。下面是CAN卡寄存器的讀寫函數:

*在偏移量為off的地址讀取一個字節的數據inline BYTE CANR(LPCAN_HW_OPEN_INFO hCan,DWORD off)

{

return hCan->lpCanHWInfo->lpCanObj->lpMappedBaseAddr[off];

*將一個字節數據寫到偏移量為off的地址中inline VOID CANW(LPCAN_HW_OPEN_INFO hCan,DWORD off,BYTE val)

{

hCan->lpCanHWInfo->lpCanObj->lpMappedBaseAddr[off]=val;

}

參數LPCAN_HW_OPEN_INFO定義的是CAN卡的數據結構,其中成員lpMappeBaseAddr[0]表示的是映射后基地址,lpMappedBaseAddr[1]就是基地址+1的地址,對應CAN卡的寄存器是命令寄存器。通過上述兩個函數可操作CAN卡上的所有寄存器。

2.2 CAN卡初始化

CAN卡的控制器比較復雜,在通信前必須確認硬件信息正確性、初始化各寄存器。初始化函數的基本流程如圖3所示。

第一步,檢查端口號和硬件信息的正確性,主要是CAN卡中斷號是否有效。

第二卡,設置CAN卡默認參數:

CanCardConfigInfo CAN_DEFAULT_SETTING=

{0X00,0XFF,0X03,0X1C};/*設置默認波特率為125Kbps*/

DWORD dwThreadID =0;

PHYSICAL_ADDRESS phyAddr={hwInfo->dwIOBaseAddr *16,0 };

第三卡,用WinCE API函數LocalAlloc為CAN卡驅動中用到的數據結構分配緩沖區;通過HalTranslateBusAddress和MmMapIoSpace函數映射I/O地址,提供直接訪問設備的虛擬地址:

if(!HalTranslateBusAddress(Isa,0,phyAddr,0,&phyAddr))

goto _ExitInit;

hCan->lpCanHWInfo->lpCanObj->lpMappedBaseAddr=

(LPBYTE)MmMapIoSpace(phyAddr,CANCARDADDRLEN,FALSE);

if(!hCan->lpCanHWInfo->lpCanObj->lpMappedBaseAddr)

goto _ExitInit;

如果分配內存或映射邏輯地址失敗,則退出初始化程序,CAN卡初始化失敗。

第四步,初始化讀寫屬性、共享模式、讀超時時間和第二個CAN口的基地址。

第五步,創建CAN卡事件和數據接收事件:hCan->lpCanHWInfo->hCanEvent=CreateEvent(NULL,FALSE,FALSE,NULL);

hCan->lpCanHWInfo->hRecvMsgEvent=CreateEvent(NULL,FALSE,FALSE,NULL);

第六步,初始化中斷,如果CAN卡有復位請求就退出初始化程序。設置好中斷后啟動數據接收線程,設置線程優先級繼續線程處理;最后配置CAN卡參數,進入正常運行狀態。

2.3 CAN卡信息發送

CAN卡的信息發送分為兩個步驟。在對CAN卡基本信息進行檢查后,首先設置發送緩沖的ID號。CAN標準模式的ID號為11位,偏移地址10中存放的是ID號的高8位,偏移地址11的高3位存放的是ID號的低3位,剩下5位分別是RTR位(遠程傳送請求位)和數據長度。通過CANW函數將處理后的數據寫入到相應的偏移地址,設置完相應的地址數據后,通過循環將偏移地址12~19的數據采集回來存到數組中。然后,設置CAN卡的傳輸請求為允許并不斷偵測狀態寄存器的變化,當傳輸緩沖滿標志或傳輸結束標志為1時通出程序,完成一次數據采集。傳輸緩沖區的寄存器如表1所列。

表1

ID號 10 ID.10 ID.9 ID.8 ID.7 ID.6 ID.5 ID.4 ID.3
RTR,數據長度碼 11 ID.2 ID.1 ID.0 RTR DLC.3 DLC.2 DLC.1 DLC.0
數據1~8 12~19 數據 數據 數據 數據 數據 數據 數據 數據

表2

ID號 20 ID.10 ID.9 ID.8 ID.7 ID.6 ID.5 ID.4 ID.3
RTR,數據長度碼 21 ID.2 ID.1 ID.0 RTR DLC.3 DLC.2 DLC.1 DLC.0
數據1~8 22~29 數據 數據 數據 數據 數據 數據 數據 數據

CAN消息發送函數的實現如下:

BOOL CAN_SendMessage(LPCAN_HW_OPEN_INFO hCan,LPCanCardMessageBuflpMsg)

{

BOOL bSuc=FALSE;

ASSERT(hCan && lpMsg && lpMsg->dwMessageLen <=8); /*防錯處理*/

if(0= =(hCan->dwAccessCode & GENERIC_WRITE))

return FALSE;

:: EnterCriticalSection(&hCan->lpCanHWInfo->

TransmitCritSec); /*進入臨界區*/

BYTE byV=static_cast<BYTE>(1pMsg->dwMsgID>>3);

CANW(hCan,10,byV); /*設置ID值高8位*/

byV=static_cast<BYTE>=((lpMsg->dwMsgID & 7)<<5);

if(lpMsg->bRTR) byV|=0x10;

byV+=static_cast<BYTE>(lpMsg->dwMessageLen);

CANW(hCan,11,byV);/*設置ID值低3位、RTR及數據長度*/

for(UINT i=0;<lpMsg->dwMessageLen;++i)

{

CANW(hCan,12+i,lpMsg->byMsg[i]);

} /*采集數據*/

CANW(hCan,1,1);/*重置傳輸請求*/

while(TRUE)

{byV=CANR(hCan,2);

if(byV & 0X40) /*傳輸緩沖區滿,退出*/

{break;}

if(byV & 0X8){ /*傳輸結束,正確返回退出*/

bSuc = TRUE;

break;}

}

::LeaveCriticalSection(&hCan->lpCanHWInfo->TransmitCritSec); /*離開臨界區*/

return bSuc;

}

2.4 CAN卡信息接收

CAN卡的信息接收是發送的逆過程,當接收緩沖區標志為1時,表示緩沖區已滿可以接收數據,將數據接收到數組后釋放接收緩沖區,然后對接收到的數據進行分解并存儲到CAN卡信息緩沖區的結構體。接收緩沖區的寄存器結構如表2所列。

CAN消息接收函數的實現如下:

BOOL CAN_RecvRecvMessage(LPCAN_HW_OPEN_INFO

HCan,OUT LPCanCardMessageBuflpMsg)

{……

if(CANR(hCan,2)&1){ /*判斷接收緩沖區是否已滿*/

for(UINT i=0;i<10;++i)

recvBuf[i]=CANR(hCan,20+i);/*將數據暫存到臨時緩沖區*/

CANW(hCan,1,4); /*釋放接收緩沖區*/

LpMsg->dwMsgID=recvBuf[0]<<3; /*取出ID的高8位*/

BYTE byV =recvBuf[1];

LpMsg->dwMsgID+=byV >>5;/*取出ID低3位,然后和高8位合并*/

LpMsg->bRTR =byV &0x10?TRUE:/*返回RTR狀態*/

LpMsg->dwMessageLen = byV &0XF; /*返回數據長度*/

……

}

else

{++hCan->lpCanHWInfo->dwErrorMsgCount;}/*沒有收到數據,錯誤計數加1*/

::LeaveCriticalSection(&hCan->lpCanHWInfo->

ReceiveCritSec); /*離開臨界區*/

Return bSuc;

}

2.5 CAN卡事件處理

CAN卡事件處理函數是CAN卡驅動程序中很重要的部分。驅動設計要求具有消息通知的功能,當事件發生時及時捕獲事件并進行消息處理。

下面是事件處理函數的實現:

staric DWORD WINAPI CAN_EventHanle(LPVOID lpParam)

{

ASSERT(lpParam);

LPCAN_HW_OPEN_INFO hCan=(LPCAN_HW_OPEN_INFO)lpParam;

CanCardMessageBuf bufMsg;

while(TEUE)

{ /*循環等待CAN卡消息產生,然后進行處理*/

::WaitForSingleObject(hCan->lpCanHWInfo->hCanEvent,0XFFFFFFFF);

if(hCan->lpCanHWInfo->bKillCanThread) break; /*若CAN線程已關閉則中斷*/

if(CAN_RecvMessage(hCan,&hufMsg)){ /*正確接收數據后*/

CAN_RecvBufPush(hCan,&bufMsg);} /*將數據壓入緩沖*/

BYTE byV=CANR(hCan,3); /*將3號寄存器讀出然后立即寫入*/

CANW(hCan,3,byV);/*能夠獲取每次中斷*/

InterruptDone(hCan->lpCanHWInfo->lpCanObj->dwSysIrqt);

} /*本次中斷結束,等待下次中斷*/

return 0;

}

2.6 其它函數

為了提供更多的功能和更方便地使用CAN卡進行通信,在CAN卡驅動程序中還設計了一些函數如CAN_Config用CAN卡信息配置、CAN_RecvBufPop用于處理接收緩沖區、CAN_Reset用于復位CAN卡、CheckHWInfo用于硬件信息檢查等。這些函數提供了對CAN通信卡的設置、檢查等功能,在這里不再詳述了。

3 CAN卡驅動封裝設計

CAN卡底層驅動函數雖然功能完整,但是對于用戶使用比較復雜并且一般用戶不需要了解底層實現的機制。為了便于使用,最后對CAN卡的驅動進行了封裝,提供CanOpenFile、CanSendMsg等五個函數用于CAN總線的通信,以動態連接庫(DLL)的形式提供給用戶調用。封裝函數及功能如下:

*CanOpenFile;初始化并打開CAN卡的一個端口。

*CanCloseFile;關閉由CanOpenFile打開的CAN卡端口。

*CanRecvMsg;接收CAN卡數據,打開CAN卡時必須具有GENERIC_READ權限。

*CanSendMsg;通過CAN卡發送數據。打開CAN卡時必須具有GENERIC_WRITE權限。

*CanIOControl;設置或獲取CAN卡I/O參數支持的I/O控制包括:IOCTL_CAN_CONFIG,IOCTL_CAN_RESET,IOCTL_CAN_TIMEOUT,IOCTL_CAN_SENDREADY,IOCTL_CAN_RECVREADY。

下面是CanSendMsg函數實現的代碼:

BOOL CanSendMSg(

HANDLE hCan,

LPCanCardMessageBuflpMsg)

{

if(!hCan||INVALID_HANDLE_VALUE= =hCan||

!lpMsg||lpMsg->dwMessageLen>8)return FALSE;

return CAN_SendMessage(LPCAN_HW_OPEN_INFO)

hCan,lpMsg);

該函數就是通過封裝CAN卡的底層驅動函數SendMessage來實現的,這樣將功能集中的五個函數更方便了用戶使用。

結語

程序開發的上位機是普通的PC機,軟件環境是:Windows2000 Professional、Embedded Visual C++4.0、與下位機中WinCE.NET對應的SDK,該SDK是在用Platform Builder 4.0定制WinCE時編譯生成的。下位機使用的硬件是研華的嵌入式PC104主板PCM3346N,操作系統為WinCE.ENT。

本文設計開發的驅動已經在北京懷柔的變電站項目中得到成功的應用,CAN卡通信穩定,系統在WINCE.NET下運行可靠,保證了項目的順利實施。

]]>
Windows CE是什么?http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1391&Page=1wangxinxin2010-11-16 14:29:49理由一 支持廣泛的網絡通訊 因為不同的應用程序和設備在通訊方面的要求不同,所以Windows CE提供了支持廣泛的硬件和通訊技術。 Windows CE支持網絡通訊所用的各種硬件設備包括: 串行電纜; 紅外傳送器; 廣播傳送器; 局域網絡; 調制解調器。 理由二 提供高水平的API Windows CE也提供的API可以簡化在一個應用程序中包含網絡通過的過程。兩種高水平的API令網絡通訊中的一些更普通的應用變得簡單。 WinInet API支持HTTP 1.0和FTP Internet瀏覽協議。它大大地簡化了編寫一個Internet客戶應用程序的過程。WinInet也支持安全通訊。有三種安全協議:Secure Sockets層(SSL)2.0版和3.0版,以及私有通訊技術(PCT)1.0版。 理由三 支持遠程訪問 Windows CE支持遠程訪問服務器(RAS)的客戶,RAS是一個用于連接遠程設備的多協議規則。Windows CE RAS客戶支持實際上和標準的Windows工具是完全相同的,但是一次只支持一個點對點的連接。理由四 支持多種處理器 Windows CE是一個可移植的操作系統,支持:
圖片點擊可在新窗口打開查看 附件: 您所在的用戶組無法下載或查看附件   理由五 通用開發工具 Windows CE Embedded Toolkit for Visual C++; Windows CE Toolkit for Visual J++; Windows CE Toolkit for Visual Basic; 理由六 可再用資源 Windows CE支持COM的進程內函數、部件化的Java VM和Visual Basic腳本,并提供豐富的、經常在嵌入式應用中使用的部件化的軟件,包括通信、數學or統計、圖形or圖像、數字信號處理、用戶界面等。據統計目前,已有超過1.7萬種Win32應用作為巨大的代碼庫,OEM廠商可以從中獲得適當的技術許可,同時,軟件開發商們可將其現有的資源快速移植到Windows CE平臺上。 理由七 強穩定性 Windows CE一旦開始運行就不需要用戶過多的干預,這就要負責系統管理的EOS具有較強的穩定性。其用戶接口一般不提供操作命令,它通過系統的調用命令向用戶程序提供服務。 理由八 優秀的線程響應 對高級別IST(中斷服務線程)的響應時間上限的要求更加嚴格,在線程響應能力方面的改進,幫助開發人員掌握線程轉換的具體時間,并通過增強的監控能力和對硬件的控制能力幫助他們創建新的嵌入式應用程序。 理由九 支持嵌套中斷 允許更高優先級別的中斷首先得到響應,而不是等待低級別的ISR完成。這使得該操作系統具有嵌入式操作系統所要求的實時性。 理由十 開放源代碼 微軟發布了自己的新系統,還宣布向消費者和BSquare、Centrality、Micros Systems等嵌入式廠商完全開放CE 6.0的核心源代碼,并提供Visual Studio 2005 Professional的免費拷貝,并使現有的Platform Builder集成開發環境(IDE)成為VS2005的一個插件。 100%源碼開放的創舉對于微軟來說是個相當大的突破,這樣的結果,帶給開發伙伴的好處也遠大于過去采用封閉模式的流程,通過獲得Windows Embedded CE源代碼的某些部分,比如:文件系統、設備驅動程序和其他核心組件,嵌入式開發者可以選擇他們所需的源代碼,然后編譯并構建自己的代碼和獨特的操作系統,迅速將他們的設備推向市場。]]>
WinCE 5.0 WIFI 無線網卡的配置和建立連接http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1390&Page=1wangxinxin2010-11-16 14:27:46一、枚舉系統中可用的無線網絡設備
                下面的函數可以枚舉出系統中所有可用的無線網卡設備的guid,為了簡化,我選擇第一塊可用的無線網卡來操作      
bool getfirstwirelesscard(ptchar pcard)
{
    if (!pcard)
    {
        return false;
    }

    intfs_key_table intfstable;
    intfstable.dwnumintfs = 0;
    intfstable.pintfs = null;
    _tcscpy(pcard, text(""));
    // 枚舉系統中可用的無線網卡
    dword dwstatus = wzcenuminterfaces(null, &intfstable);
    if (dwstatus != error_success)
    {
        retailmsg(dbg_msg, (text("wzcenuminterfaces() error 0x%08x\n"),dwstatus));
        return false;
    }
    // 判斷無線網卡的數量,可以根據無線網卡數量來枚舉出所有可用的無線網卡
    if (!intfstable.dwnumintfs)
    {
        retailmsg(dbg_msg, (text("system has no wireless card.\n")));
        return false;
    }
    _tcscpy(pcard, intfstable.pintfs[0].wszguid);
    localfree(intfstable.pintfs);
    return true;
}
        二、獲取無線網絡信息
        獲取到了系統可用的無線網卡后,我們就可以利用它的 guid 號來進行進一步的操作了,首先要做的事情就是得到該無線網卡的信息以及該無線網卡掃描到的 wifi 網關信息。
        以下函數可以獲取到該無線網卡及掃描的到的無線 ap 信息
//////////////////////////////////////////////////////////////////////////
// pcard: 無線網卡 guid
// pintf: 無線網卡配置信息結果體
// poutflags: 網卡配置信息掩碼標志
//////////////////////////////////////////////////////////////////////////
bool getwirelesscardinfo(ptchar pcard, pintf_entry_ex pintf, pdword poutflags)
{
    tchar *szwificard = null;
    // 參數校驗
    if (!pcard || !pintf || !poutflags)
    {
        retailmsg(dbg_msg, (text("param error.\n")));
        return false;
    }      
    szwificard = pcard;
     
    *poutflags = 0;
     
    // 初始化無線網卡信息
    zeromemory(pintf, sizeof(intf_entry_ex));
     
    // 設置 guid 號
    pintf->wszguid = szwificard;
    // 查詢無線網卡信息
    dword dwstatus = wzcqueryinterfaceex(null, intf_all, pintf, poutflags);
    if (dwstatus != error_success)
    {
        retailmsg(dbg_msg, (text("wzcqueryinterfaceex() error 0x%08x\n"), dwstatus));
        return false;
    }
     
    return true;
}
        三、判斷連接狀態
        我們可以通過無線網卡的狀態來判斷當前無線網卡是否已經和無線ap建立了連接
bool isassociated(const intf_entry_ex intf, const dword dwoutflags)
{   
    if (dwoutflags & intf_bssid)
    {
        praw_data prdmac = (praw_data)(&intf.rdbssid);
         
        // 判斷 bssid 的 mac 地址是否有效來判斷是否和無線ap建立了連接
        if (prdmac == null || prdmac->dwdatalen == 0 ||
            (!prdmac->pdata[0] && !prdmac->pdata[1] && !prdmac->pdata[2] &
            !prdmac->pdata[3] && !prdmac->pdata[4] && !prdmac->pdata[5]))
        {
            retailmsg(dbg_msg, (text("(this wifi card is not associated to any)\n")));
            return false;
        }
        else
        {
            retailmsg(dbg_msg, (text("(this wifi card is associated state)\n")));
            return true;
        }
    }
    else
    {
        return false;
    }   
}
        四、獲取無線ap信息
        獲取了無線網卡的信息后,可以通過無線網卡枚舉出當前所有可用的無線ap的ssid名稱以及加密模式等等所有可用信息,一下函數可以實現該功能
void getwirelseelistssid(const praw_data prdbssidlist, hwnd hlistctlwnd)
{
    if (prdbssidlist == null || prdbssidlist->dwdatalen == 0)
    {
        retailmsg(dbg_msg, (text("<null> entry.\n")));
    }
    else
    {
        pwzc_802_11_config_list pconfiglist = (pwzc_802_11_config_list)prdbssidlist->pdata;
        //retailmsg(dbg_msg, (text("[%d] entries.\n"), pconfiglist->numberofitems));
        uint i;
         
        // 枚舉所有無線ap
        for (i = 0; i < pconfiglist->numberofitems; i++)
        {
            pwzc_wlan_config pconfig = &(pconfiglist->config[i]);
            
            raw_data rdbuffer;
            rdbuffer.dwdatalen = pconfig->ssid.ssidlength;
            rdbuffer.pdata = pconfig->ssid.ssid;
            tchar tssid[max_path];
            
            // 將 ssid 的 ascii 碼轉化成字符串
            printssid(&rdbuffer, tssid);
            if (hlistctlwnd)
            {                    
                if (listbox_findstring(hlistctlwnd, 0, tssid) == lb_err)
                {
                    listbox_addstring(hlistctlwnd, tssid);
                }               
            }
            //retailmsg(dbg_msg, (text("\n")));
        }
    }
}

]]>
三星為WinCE推出的45nm ARM11處理器http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1389&Page=1wangxinxin2010-11-16 14:19:10
以下內容含腳本,或可能導致頁面不正常的代碼
說明:上面顯示的是代碼內容。您可以先檢查過代碼沒問題,或修改之后再運行.
]]>
ok6410 sd卡一鍵燒錄問題http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1388&Page=1wangxinxin2010-11-16 14:14:42SD卡遇到問題如下:
1:啟動開關設置:1,2,3 為0;4,5,6,7,8 為1;
2:按一鍵燒錄說明燒好SD卡(4G),插入開發板;
3:接上串行線,USB
4:開啟dnw;
5:接通開發板電源;
電腦提示:無法識別USB設備。試圖安裝,找遍飛凌公司提供的盤片資料(包括dnw下載驅動),沒有合適的驅動可安裝。。
dnw信息區顯示:
=============== USB Receive Test ==============
Error: can't receive data from the USBD
===============================================

Welcome! This tool just for TE/OK6410
+OALArgsInit()
SocID:0x36410101
Arguments area is initialized
-OALArgsInit()
INFO: (unsigned)C_IsrHandler : 0x8006684C
INFO: (unsigned)ASM_IsrHandler : 0x8006861C
INFO: (unsigned)pISR : 0xEA01A17F
HSMMC init
[HSMMC1] Setting registers for the EPLL (for SDCLK) : SYSCon.
[HSMMC0] Setting registers for the GPIO.
[HSMMC1] Setting registers for the EPLL : HSMMCCon.
#### this SD card is made on SPEC 2.0
This SD card is made on SPEC 2.0
This SD card is High Capacity

CardSize: 7729152 sector
[HSMMCLIB:INF] ClockConfig() Card Working Frequency = 24MHz
BP_Init
[FMD] ++FMD_Init() ****
[FMD:INF] FMD_Init() : Read ID = 0x0000ecd3
[FMD] FMD_Init() : NUM_OF_BLOCKS = 4096
[FMD] FMD_Init() : PAGES_PER_BLOCK = 128
[FMD] FMD_Init() : SECTORS_PER_PAGE = 4
[FMD] --FMD_Init()
[FMD] FMD_GetInfo() : NUMBLOCKS = 4096(0x1000), SECTORSPERBLOCK = 128(0x80), BYTESPERSECTOR = 2048(0x800)
[FMD] FMD_GetInfo() : NUMBLOCKS = 4096(0x1000), SECTORSPERBLOCK = 128(0x80), BYTESPERSECTOR = 2048(0x800)
wNUM_BLOCKS : 4096(0x1000)
[Eboot] ++InitializeDisplay()
[Eboot] --InitializeDisplay()
Press [ENTER] to launch image stored on boot media, or [SPACE] to enter boot monitor.

Initiating image launch in 3 seconds.

Starting auto-download ...
Erase  the block '0..3'
System ready!
Preparing for download...
IsCardInserted
g_pDownPt = 0xA300211B

BL_IMAGE_TYPE_MANIFEST


BL_IMAGE_TYPE_UNKNOWN


Download BIN file information:
-----------------------------------------------------
[0]: Base Address=0x0  Length=0x2000
-----------------------------------------------------
----------------------------------------------(文件較大,省略一部分)
chainInfo.dwLoadAddress: 0X00000000
chainInfo.dwFlashAddress: 0X00000000
chainInfo.dwLength: 0X00000000
}
waitforconnect
INFO: using TOC[1] dwJumpAddress: 0x80157734
INFO: OEMLaunch: Jumping to Physical Address 0x50157734h (Virtual Address 0x80157734h)...

鼿Windows CE Kernel for ARM (Thumb Enabled) Built on Sep 25 2009 at 11:04:23
[OAL] ++OEMInit()
[OAL] S3C6410_APLL_CLK   : 532000000
[OAL] ARMCLK : 532000000
[OAL] HCLK   : 133000000
[OAL] PCLK   : 66500000
[OAL] InitializeGPIO()
[OAL] InitializeCLKSource()
[OAL] InitializeCLKGating()
[OAL] InitializeBlockPower()
DCache: 128 sets, 4 ways, 32 line size, 16384 size
ICache: 128 sets, 4 ways, 32 line size, 16384 size
+OALArgsInit()
Arguments area has some values
-OALArgsInit()
+OALTimerInit( 1, 33249, 0 )
-OALIntrRequestSysIntr(irq = 38, sysIntr = 16)
[OAL] --OEMInit()                                                 //停在此處


開發板液晶顯示花屏。
注:在Nand 上啟動WINCE  正常。ActiveSync 工作正常。

請教飛凌公司工程師
1 我的操作正確嗎?
2 SD卡,讀卡會有問題?
3 4G以上SD卡燒錄軟件是否成熟?
]]>
基于WinCE的ARM視頻監控系統解析(圖)http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1387&Page=1wangxinxin2010-11-16 11:53:35
關鍵字:視頻 [7654篇]

  數字視頻監控系統是以計算機或嵌入式系統為中心、視頻處理技術為基礎組建的的一種新型監控系統,系統采用符合圖像數據壓縮的國際標準,綜合利用圖像傳感器、計算機網絡、自動控制和人工智能等技術。由于數字視頻監控系統對視頻圖像進行了數字化,所以與傳統的模擬監控系統相比,數字監控具有許多優點。數字化的視頻系統可以充分利用計算機的快速處理能力,對其進行壓縮、分析、存儲和顯示。數字化視頻處理技術提高了圖像的質量與監控效率,使系統易于管理和維護。整個系統是模塊化結構,體積小,易于安裝、使用和維護。正是由于數字視頻監控技術具有傳統模擬監控技術無法比擬的優點,而且符合當前信息社會中數字化、網絡化和智能化的發展趨勢,所以數字視頻監控技術正在逐步取代模擬監控技術,廣泛應用于各行各業。嵌入式系統以體積小、實時性強、性價比高、穩定性好等特點在社會的各個領域中得到了廣泛應用。筆者設計的一種嵌入式系統,以WinCE操作系統和ARM硬件平臺為核心實現了對現場的實時監控,并通過無線網絡把視頻圖像傳輸到主機端,以實現分析、存儲和顯示等功能。
  
  1系統設計
  
  本系統主要由操作系統定制、視頻圖像采集、視頻圖像無線傳輸三部分組成。系統的核心芯片選用基于ARM920T內核的S3C2410嵌入式微處理器,軟件環境選用MicrosoftWindowsCE操作系統。系統首先通過USB攝像頭采集現場實時視頻信息,并對其進行壓縮。然后,使用兩塊無線網卡在ARM開發板與上位機之間構建一個無線局域網絡,從而將壓縮的視頻數據傳輸到主機端,終端用戶即可在主機端通過流媒體播放程序查看遠程視頻影像。視頻監控系統總體結構框圖如圖l所示。

圖片點擊可在新窗口打開查看


  
圖l、視頻監控系統總體結構框圖


  
  2操作系統的定制
  
  系統硬件平臺的核心芯片選用了S3C2410處理器,最高頻率可達203MHz。S3C2410處理器是Samsung公司基于ARM公司的ARM920T處理器核,采用O.18μm制造工藝的32位微控制器。該處理器具有較高的集成度,簡化了應用系統的硬件設計,提高了系統的可靠性。開發扳上還擴展了4MB的NORFlash、64MB的NANDFlash和64MB的DRAM。
  
  系統選用了MicrosoftWilldowsCE(簡稱“WinCE”)操作系統。WinCE是一個緊湊的、高效且可擴展的32位操作系統,適用于各種嵌入式系統和產品。它擁有多線程、多任務和確定性的實時、完全搶占式優先級的操作系統環境,專門面向只有有限資源的硬件系統;同時,它的模塊化設計方式使得系統開發人員和應用開發人員能夠為多種多樣的產品來定制它,可以選擇、組合和配置WinCE的模塊和組件來創建用戶版的操作系統。
  
  在WinCE產品開發中,主要有內核定制和應用程序開發兩項非常重要的工作。微軟在兩方面都提供了良好的開發工具,即內核定制工具PlatformBuilder(簡稱“PB”)和應用程序開發工具EmbeddedVisualC++(簡稱“EVC”)。
  
  在系統定制過程中,各部分的關系如圖2所示。

圖片點擊可在新窗口打開查看


  
  3視頻圖像采集
  
  3.1攝像頭驅動
  
  圖像采集模塊的硬件資源選用了當前市面上應用最廣泛的USB接口的中星微攝像頭。該款攝像頭造價低廉,成像效果好,用于本系統中體現出了較高的性價比。系統在進行視頻采集前,首先要檢測設定視頻源。系統啟動后,WinCE操作系統會自動檢測攝像頭是否連接好。本系統在定制WinCE操作系統時,通過修改操作系統配置和注冊表。可以使系統自動加載攝像頭在WinCE下的驅動程序ZC030x.dll。
  
  系統自動加載驅動程序時,首先要將驅動程序復制到\WINDOWS文件夾下,然后向注冊表中寫入攝像頭的驅動信息:
  
  其中,prefix為設備文件名,D11為驅動的文件名,Order為設備文件名索引。硬件配置完成后啟動操作系統,就可以自動加載驅動,運行應用程序進行圖像采集了。
  
  3.2圖像采集程序
  
  中星微攝像頭采用了中星微301PLUS快速主控芯片。該芯片是一款高性能圖像壓縮芯片,輸出MIPEG視頻流數據。MIPEG(MotionJPEG)主要是基于靜態視頻壓縮發展起來的技術,特點是基本不考慮視頻流中不同幀之間的變化,只單獨對某一幀進行壓縮,通常可達到6:1的壓縮率。它的誤差穩定性非常好,可以獲取清晰度很高的視頻圖像,而且還可以靈活設置各路視頻清晰度,壓縮幀數。
  
  本系統直接從攝像頭驅動中獲取MJPEG視頻流數據,圖像采集流程如圖3所示。

圖片點擊可在新窗口打開查看


  
  圖像采集模塊用到的主要函數有:
  
  capInitCamera()用來初始化視頻設備,并獲取當前可用的視頻設備數目;
  
  capSetVideoFormat()設置視頻格式和分辨率。本系統使用的視頻格式為RGB24,分辨率為320×240像素;
  
  capGrabFrsme()從驅動中抓取1幀圖像,并存儲在緩存lpFrameBuffer中;
  
  capGetLastJpeg()將抓取的MJPEG格式的圖像轉換成JPEG格式,送到無線發送模塊。
  
  capCloseCamera()關閉視頻設備;
  
  視頻采集部分還有查詢視頻采集格式、設置明暗度、設置對比度等相關函數,不再詳述。
  
  4視頻傳輸部分
  
  4.1配置無線網卡
  
  圖像傳輸模塊主要是通過USB接口的無線網卡來實現的。該無線網卡可與S3C2410集成的USB主機接口直接相連,工作在2.4GHz的ISM頻段,采用直接序列擴頻通信方式,遵從802.11g協議,傳輸速度可達54Mbps,室內有效距離為100m,能夠滿足局域網內視頻傳輸的要求。本系統通過開發板和主機之間的無線網卡構建無線局域網絡,能夠實現點對點的無縫連接,用戶通過此無線網絡可以實現文件傳輸、視頻通信等應用。
  
  開發板端的無線網卡也需要加載驅動才能運行。本系統在定制WinCE操作系統時,首先將無線網卡的驅動程序復制到\WINDOWS文件夾下,然后向注冊表中寫入無線網卡的驅動信息。WinCE操作系統啟動后會自動檢測無線網卡是否連接好,并加載驅動程序,此時,就可以通過應用程序調用此無線網卡了。在無線傳輸時,注意要把開發板和主機設置在同一IP網段。
  
  4.2傳輸視頻數據
  
  實時傳輸協議RTP(RealtimeTransportProtocol)是一種實時流式傳輸協議,能夠保證媒體信號帶寬與當前網絡狀況相匹配,在一對一(umcast,單播)或者一對多(multicast,多播)的網絡環境中實現流媒體數據的實時傳輸。RTP通常使用UDP來進行多媒體數據的傳輸。整個RTP協議由兩個密切相關的部分組成:RTP數據協議和RTCP控制協議。

]]>
基于WinCE的視頻采集應用方案http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1386&Page=1wangxinxin2010-11-16 11:51:31   嵌入式系統是一種以應用為中心,以計算機技術為基礎,其軟硬件可配置、可裁減,對功能、可靠性、成本、體積、功耗有嚴格約束的專用計算機系統。它結合了先進的計算機技術、半導體技術、電子技術以及各個行業的具體應用,被看作技術密集、不斷創新的知識集成系統。近幾年來以軟硬件相結合為顯著特征、以消費電子類為主導的智能設備以超乎人們想象的速度獲得了前所未有的發展,與此同時,在工控領域也得到快速發展,在這個過程中,微軟公司也是首當其沖,其推出的Microsoft Windows CE是一個開放的、可裁減的、32位的實時操作系統和其他桌面版窗口操作系統相比,具有可靠性好、實時性高、內核體積小的特點,所以被廣泛用于各種嵌入式智能設備的開發,如工業控制、信息家電、移動通信、個人電子消費品等各個領域,是當今應用最多、增長最快的嵌入式操作系統。

      EM9000 ARM嵌入式主板采用高端的ARM9芯片EP9315,特別針對工控系統中TFT彩色顯示智能終端的應用需求進行了精心的優化設計(同時支持觸摸屏)。作為一款已加載了WinCE工控主板,EM9000嵌入式主板可以支持客戶在其上采用通用的微軟開發工具,如eVC、VS2005,直接進行應用程序的開發,從而以更快的速度把產品推向市場。另一方面,EM9000嵌入式主板的所有通訊接口均配置了標準的WinCE驅動程序,客戶在應用程序開發中并不需要了解EM9000嵌入式主板內部的詳細技術情況,而直接調用WinCE的標準API函數,就可高效快速的操作EM9000的各個通訊接口,有效降低了客戶進行嵌入式系統產品開發的門檻和風險。同時,EM9000作為一款EP9315開發板,內置了協處理器,可以進行復雜的浮點運算,可以運用在需要進行高速復雜運算的特殊場合。

      攝像頭(CAMERA)又稱為電腦相機、電腦眼等,它作為一種視頻輸入設備,被廣泛的運用于個人電腦視頻和實時監控等方面。然而,作為嵌入式的WinCE操作系統卻因為缺少攝像頭的驅動而不能采用這種視頻采集方案。為了更好的服務英創的客戶,經過公司團隊的努力,解決了這個難題,可以為貴公司提供低成本的攝像頭解決方案。

      我們為攝像頭訂制了專門的API函數,提供了使用例程。你可以參照英創提供的例程,迅速編寫出適合自己領域的產品。

      如果有需求,可以來電垂詢,我們將根據你的需求,提供最佳的解決方案。

      表中列出了攝像頭的主要API函數。根據這些API函數就可以很方便的完成視頻采集程序設計。下面列出了主要的API函數和參數說明。

// Name : capInitCamera
// Initialize driver and get current available cameras number.
//Return : The number, of the available cameras, indicates success.
int capInitCamera(void);

// Name : capGetCurrentVersion
// Get the current driver version information.
// Return : The length, in characters, of the copied string,
// not including the terminating null character, indicates success.
int capGetCurrentVersion(
                                          int index,    //[IN] Camera index, 0 - first
                                          insigned char *pBufOut, // [OUT] Long pointer to the buffer that
                                                                                // will receive the text
                                          int lenOut  // [IN] Specifies the maximum number of characters
                                                            //to copy to the buffer,  including the NULL character.
                                                            // If the text exceeds this limit, it is truncated.
                                          );   

//Name : capGetVideoFormat
// Get the current video format.
//Return : Zero indicates success.
int capGetVideoFormat(
                                      int index,    // [IN] Camera index
                                      int *pFormat,  // [OUT] Long pointer to the buffer that will receive
                                                              //the video format, VIDEO_PALETTE_RGB565 -
                                                              //VIDEO_PALETTE_JPEG
                                      int *pSizeMode //[OUT] Long pointer to the buffer that will receive
                                                              // the size mode, VIDEO_SIZE_VGA - VIDEO_SIZE_SIF
                                      );

// Name : capSetVideoFormat
//Set video format.
//Return : Zero indicates success.
int capSetVideoFormat(
                                    int index, // [IN] Camera index
                                    int format,  // [IN] Video format, VIDEO_PALETTE_RGB565 -
                                                      //VIDEO_PALETTE_JPEG
                                    int sizeMode // [IN] Size mode, VIDEO_SIZE_VGA - VIDEO_SIZE_SIF
                                    );

// Name : capGrabFrame
// Grab a frame from driver.
//Return : The length, in bytes, of the copied video frame data, indicates success.
int capGrabFrame(
                            int index,    // [IN] Camera index
                            unsigned char *pFrameBuf, // [OUT] Long pointer to the buffer that will
                                                                        //receive the video frame
                            unsigned int bufferLen  // [IN] Specifies the maximum number of bytes
                                                                  //to copy to the buffer
                            );

// Name : capGetLastJpeg
//Get a last JPEG frame from driver.
// Return : The length, in bytes, of the copied JPEG frame data, indicates success.
int capGetLastJpeg(
                              int index,    // [IN] Camera index
                              unsigned char *pFrameBuf, // [OUT] Long pointer to the buffer that will
                                                                          //receive the video frame
                              unsigned int bufferLen  // [IN] Specifies the maximum number of bytes
                                                                    //to copy to the buffer
                              );

// Name : capStartCamera
// Start camera to capture video.
// Return : Zero indicates success.
int capStartCamera(
                                int index  //[IN] Camera index
                                );

// Name : capStopCamera
// Stop camera to capture video.
// Return : Zero indicates success.
int capStopCamera(
                                int index    // [IN] Camera index
                                );

// Name : capCloseCamera
// Close all available camera.
// Return : Void.
void capCloseCamera(void);

// Name : capGetPciture
// Get a last bitmap and jpeg from driver
// Return : Zero indicates success.
int capGetPicture(
                            int index,      // [IN] Camera index
                            unsigned char *pFrameBuf, //[OUT] Long pointer to the buffer that
                                                                        //will receive the video frame
                            unsigned int bufferLen,    //[IN] Size, in bytes, of the buffer pointed
                                                                    //to by pFrameBuf
                            unsigned char *pJpgBuf,    //[OUT] Long pointer to the buffer that
                                                                      //will receive the jpeg picture
                            unsigned int jpgLen,  //[IN] Size, in bytes, of the buffer pointed to
                                                              //by pJpgBuf
                            PDWORD pdwActualOut //[OUT] Pointer to an array of the return lengths
                            );

]]>
分析評價Linux和WinCE的優缺點http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1385&Page=1wangxinxin2010-11-16 11:42:551.支持多種硬件平臺
由于嵌入式設備硬件平臺的多樣性,CPU芯片的快速更新,嵌入式操作系統要求支持常用的嵌入式CPU,如X86, ARM, MIPS, POWERPC等,并具有良好的可移植性。另外還需要支持種類繁多的外部設備。Linux支持以上幾乎所有的主流芯片,并且還在不斷的被移植到新的芯片上。而在這方面,WinCE顯然差得很遠。
2.占有較少的硬件資源
由于多數嵌入式系統具有成本敏感性,處理器速度較低 ,存儲器空間較少,這要求嵌入式OS體積小,速度快。Linux體系結構比較靈活,易于裁減,可以小到2M flash,4M RAM。而WinCE對資源的要求更高。
3.高可定制性
由于不同的嵌入式應用對系統要求各不相同,這要求嵌入式OS具備高可定制性,能夠根據需要方便的增加和減少各項功能模塊。這一點對于嵌入式領域至關重要,而Linux由于圖形系統不在內核中,且支持模塊機制,內核可根據需要加入或去掉功能。其外圍工具擁有眾多選擇,更由于可以自由修改源代碼,具有極強的可定制性。而WinCE/Windows根本無法做到這一點。
4.具有實時處理能力
實時應用分為硬實時和軟實時兩大類,嵌入式OS需要明確是否支持實時和支持哪一類實時應用,需要提供最壞情況響應時間為多長。Linux和WinCE/Windows最初設計時都沒有考慮實時應用,但眾多的實時Linux項目已使Linux具備了硬實時和軟實時處理能力,硬實時有RT-Linux和RTAI,而2.6中加入了可搶占核心,使得Linux具備了軟實時處理能力,此外還有Timsys和Montavista等實時Linux實現。Linux自由開發模式的優點得到了充分的體現。Windows雖然也有第三方提供類似于RT-linux的實時功能,但由于微軟未提供這方面的支持,也由于Windows可靠性不能滿足要求,很少有人在實時領域使用Windows。但RT-linux已經在美國航天部門,印度軍方等得到了廣泛應用。還有Montavista,Timsys的實時Linux都有很多成功案例。
5.具備強大的網絡功能
現在,越來越多的嵌入式設備需要具備網絡功能。這要求嵌入式OS支持常用的網絡協議和可靠的網絡功能。Linux的網絡功能經過幾次改進,其效率,功能都很突出。且具有眾多的網絡工具,支持幾乎所有常見的網絡協議。這些使得Linux在網絡設備中倍受青睞,很多防火墻,低端路由器等中使用的都是Linux。而未聞WinCE/windows在這方面有什么應用。
6.高安全性和高可靠性
嵌入式設備往往對安全性和可靠性要求很高,這要求作為基礎軟件的嵌入式OS具有高安全性和高可靠性。如骨干網的路由器,交換機等。Linux的可靠性是經過實踐檢驗的,并進一步向高端發展,沖擊Vxworks, Unix的市場。安全性方面Linux病毒極少,并擁有眾多安全增強,有的安全增強Linux達到了B1級別(紅旗RFSOS通過了國家GB17859第三級,等同于TCSEC B1級)。而Windows病毒眾多,漏洞不斷,雖然微軟大力宣傳其通過了CC標準EAL4級,但是需要說明的是,EAL4僅僅說明Windows在多大程度上滿足了它的安全目標,顯然更為重要的是這個目標是什么,事實上,它通過的是CAPP的EAL4級,仍然相當于TCSEC C2級,Win2000的可靠性比起98等來說有了明顯提高,但尚不足以向高端沖擊,其安全性問題也會大大影響它的可靠性,這二者是緊密聯系的,不能孤立討論。
7.具有完善的嵌入式GUI和嵌入式瀏覽器
面向用戶的嵌入式終端設備如Smart Phone等,都要求嵌入式OS具有功能完善,控件豐富的嵌入式GUI,并支持功能強大的嵌入式瀏覽器。在這方面WinCE有完善的解決方案,Linux也有QT/Embedded等GUI,Opera等嵌入式瀏覽器,擁有眾多的選擇。
8.實現嵌入式日志文件系統,具備斷電保護能力。
這些功能Linux和Windows都能達到。
9.能夠提供完善的開發工具集。
Linux下的開發工具眾多,但不如Windows開發工具易用。不過Windows的開發工具不是為嵌入式領域設計的,功能也不完善。
10.能夠快速啟動
啟動速度二者差不多,但很多嵌入式設備并不需要圖形界面,且由于Linux有源代碼,在硬件固定的情況下可以加速啟動,這時Linux就比WinCE/Windows啟動快多了。
通過以上分析,可以很清楚地看到,總體比較而言,在嵌入式領域Linux比WinCE/Windows具有明顯優勢。正因為如此,嵌入式Linux比WinCE/Windows應用領域要廣泛的多。WinCE的優勢在于PC衍生產品,如Pocket PC,高端PDA等。但在其他眾多的嵌入式領域中,WinCE就并不適合了。
如果是為了學習,好玩,我選擇linux。如果我周圍有一個開發團隊,選擇linux。
如果我是單槍匹馬或是人員有限,能盡快地開發產品,選擇winCE。]]>
嵌入式開發流程http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1384&Page=1wangxinxin2010-11-16 11:40:20
  嵌入式開發主要分為三個比較大的部分:
  1、驅動程序開發
  這部分開發是從硬件設計開始的,硬件工程師會設計PCB板,為我們提供標準開發板(SDB,standard development board)。當我們拿到開發板之后的第一件事情就是編寫boot-loader,讓開發板啟動起來,一般是通過JTAG將boot-loader燒錄到開發板中的。我們可以將boot-loader看作PC中的BIOS,負責硬件設備的初始化工作,并且將操作系統運行起來。在此之后,我們需要根據開發板上的硬件開發各種驅動程序,比如串口、USB、鼠標、視頻輸入等。最后將這些驅動程序和boot-loader打包,稱為一個板級支持包(BSP)。BSP是和開發板的具體硬件緊密相關的。
  所以從事這方面開發的工程師往往具有比較強的硬件知識水平。
  2、平臺定制
  我們可以將Windows CE想象為一盒積木,根據不同的應用場景和設備要求,我們要對這盒積木進行定制,堆積出不同形狀的城堡、動物和生活用品。這個過程稱為“平臺定制”,定制產生的平臺往往和具體的硬件設備相關,直接將平臺下載到硬件設備上就可以運行了。整個開發過程,需要選擇不同的組件來搭配出最適合當前硬件的軟件平臺。所以要對Windows CE的組件,也就是Catalog Item,有相當程度的了解。
  3、應用程序開發
  嵌入式設備上的應用程序開發與傳統應用程序開發類似,只是要借助于硬件模擬器或者實際設備對程序進行調試。最常見的嵌入式設備應用程序開發,就是Windows Mobile的移動應用開發。平臺定制工程師會在硬件出廠之前先提供平臺相關的SDK,SDK中會包括模擬器。應用開發者可以首先使用模擬器對程序進行開發和調試。等實際硬件出來之后,再將程序轉移到實際硬件中。因為Windows CE采用了很多措施,這種“轉移”幾乎是無縫的,所以我們并沒有使用“移植”這個詞。
  嵌入式領域的應用開發其實是普通軟件工程師就可以進行的。
]]>
WinCE開發概述http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1383&Page=1wangxinxin2010-11-16 11:39:44
這篇文章的目的并不是介紹Windows Embedded CE開發的方方面面,只是用一個初涉嵌入式領域的軟件開發者的視角來介紹Windows CE開發中最常用的概念和知識,解決大家會在實際開發中碰到的一些小問題,讓大家了解嵌入式開發與應用程序開發,到底有哪些不同。
Windows CE概述
  從6.0版本開始,Windows CE的名字改為Windows Embedded CE,當然這也是為了結合Windows Embedded品牌作出的改變。CE經過了十年的風風雨雨之后,終于在CE 6.0這個版本上再次浴火重生了。CE 6.0經歷了CE歷史上第二次內核重寫,使CE操作系統更加符合當今嵌入式開發的方向。
  CE 6.0在內核方面的改變主要是為了適應嵌入式設備硬件發展的要求,在進程數量方面,從過去最多運行32個進程,改變為最多運行3萬2千個進程,內存方面從每個進程最多擁有32M虛擬內存空間改為最多擁有2G虛擬內存空間。在OS布局方面,將關鍵的驅動程序、文件系統和圖形界面管理器(GWES)移到了內核中,這樣可以更好解決因為CPU在內核態和用戶態間切換造成的性能損失。
  當然,從以上的改變,我們可以看到CE 6.0較之前版本更加“重量級”了。操作系統領域關于“微內核”的爭論已經持續了很多年,CE的改變也許會為某個學派的觀點提供支持。但我們必須指出的是,正因為目前的嵌入式設備硬件已經可以支持比較“重量級”的操作系統了,所以CE 6.0才會做出如此改變。
  CE針對開發者的另一個轉變開始自CE 5.0,將開發環境Platform Builder整合到Visual Studio中,這種做法無疑減輕了微軟維護兩套IDE的負擔,從另外一個方面來看,CE的開發者也可以享受到更好的開發體驗了。
]]>
測試微軟Wince的拷屏代碼Code :)http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1382&Page=1wangxinxin2010-11-16 11:38:43#region By v-gayang for VisualDiff
        /// <summary>
        /// Alert This folder already contain a folder called folder name
        /// Clew InformationDo: you really want to replace the older folder with the new folder?
        /// </summary>
        /// <returns>LogResult.Pass on success</returns>
        [TestCaseAttribute("Verify the Beam and Send Menu items are enabled when a file is selected", Type = TestType.VisualDiff)]
        [MobileDevicesDescriptor ( Product = Products.SmartPhone) ]    
        public Log.LogResult VerifyFolderAndReplaceFolder()
        {
              Log.LogResult result = Log.LogResult.Pass;        

              Utils.GlobalLogger.AddComment("Go to my documents");
              FEAreaLib.Instance.GoToMyDocuments();

              //Navigate to the root directory
              Utils.GlobalLogger.AddComment("Go to the root directory");    
              FEAreaLib.Instance.GoUpOneDirectory();        

              // Add a new name "abc" folder
              this.GoToFolder(true);
              this.CreateNewFileFolder();

              //Navigate to the \temp
              Utils.GlobalLogger.AddComment("Go to the root temp directory");    
              FEAreaLib.Instance.GoToMyDocuments();
              FEAreaLib.Instance.GoUpOneDirectory();
              FEAreaLib.Instance.ClickOn(tempPath);
             

              // Add a new name "abc" folder
              this.OpinionRepeatFolder(true);
              this.CreateNewFileFolder();

              // Copy one Folder
              string abc="abc";
              this.CopyFileOrFolder(abc);

              // Paste one Folder
              FEAreaLib.Instance.GoToMyDocuments();
              FEAreaLib.Instance.GoUpOneDirectory();
              this.PasteFileOrFolder();

              //snap for the Alert
              Utils.GlobalLogger.AddComment("snap for Register: Do you really want to replace the older folder with the new folder?");
              this.ssc.Capture("FileExplorer_PasteFolder_already_contain_Alert");
       
              return result;
        }
       
        /// <summary>
        /// Alert A File name "<name>" already exist.
        /// Replace the exiting file "date" and "time" with this one .
        /// </summary>
        /// <returns>LogResult.Pass on success</returns>
        [TestCaseAttribute("Verify Alert A File name 'name' already exist.", Type = TestType.VisualDiff)]
        [MobileDevicesDescriptor ( Product = Products.SmartPhone) ]    
        public Log.LogResult VerifyFileAndReplaceFile()
        {
              Log.LogResult result = Log.LogResult.Pass;        

              Utils.GlobalLogger.AddComment("Go to my documents");
              FEAreaLib.Instance.GoToMyDocuments();

              //Navigate to the My Picture folder
              Utils.GlobalLogger.AddComment("Go to the My Picture folder");    
              FEAreaLib.Instance.GoToMyPictures();
             
   
              //Highlight the "flower" file
              Utils.GlobalLogger.AddComment("highlight the waterfall");
              FEAreaLib.Instance.KBNavigateTo("flower.jpg");

              // Copy a name "picture" file
              this.GoToFile(true);
              this.CopyFileOrFolder(this.picturePath + @"\flower.jpg");

              // A layer of catalogues on carriage return
              Utils.GlobalLogger.AddComment("A layer of catalogues on carriage return ");    
              FEAreaLib.Instance.GoUpOneDirectory();
             

              // Paste a File
              Utils.GlobalLogger.AddComment("Paste a file");
              this.PasteFileOrFolder();
             

              //snap for the Alert or the first time
              Utils.GlobalLogger.AddComment("snap for Register: Paste a flower file Replace the exiting file <date> and <time>");    
              this.ssc.Capture("FileExplorer_PasteFile_or_the_first_time_Alert");


              // Paste a File
              Utils.GlobalLogger.AddComment("Paste an existing file ");
              this.PasteFileOrFolder();
             

              //snap for the Alert
              Utils.GlobalLogger.AddComment("snap for Register: Do you really want to replace the older file with the new file?");    
              this.ssc.Capture("FileExplorer_PasteFile_already_contain_date_and_time_Alert");    

              return result;
        }
        #endregion
        #endregion

    #region Private Data
    // Add any private data/vars used by your tests here.
        private VisualDiff.SnapShotCreator ssc=null;
    #endregion

    #region Utility Functions
    private void CleanFolder(string dir)
    {
        if(Directory.Exists(dir))
        {        
          Directory.Delete(dir, true);
        }    
        Directory.CreateDirectory(dir);
    }

    private void GoToTestFolder(bool clean)
    {
        if(clean)
        {
          CleanFolder(this.testPath);
        }
        FEAreaLib.Instance.GoToMyDocuments();
        FEAreaLib.Instance.ClickOn(testDirectory);
    }

        private void GoToFolder(bool clean)
        {
              if(clean)
              {
                  CleanFolder(this.folderPath);
              }
              FEAreaLib.Instance.GoToMyDocuments();
              FEAreaLib.Instance.GoUpOneDirectory();
//               FEAreaLib.Instance.ClickOn(abcDirectory);
        }
        private void OpinionRepeatFolder(bool clean)
        {
              if(clean)
              {
                  CleanFolder(this.tempPath);
              }
        }

        private void GoToFile(bool awardentityfile )
        {
              if(awardentityfile)
              {
                  this.CopyFileOrFolder(this.picturePath + @"\flower.jpg");
              }
              else
              {
                  FileStream fs = System.IO.File.Create(this.picturePath + @"\flower.jpg");
                  fs.Close();
                  this.CopyFileOrFolder(this.picturePath + @"\flower.jpg");
              }
        }
        #region Create NewFile Folder
        /// <summary>
        /// Create NewFile Folder
        /// </summary>
        private void CreateNewFileFolder()
        {
              try
              {
                  //press sk2.menu
                  Utils.GlobalLogger.AddComment("Press SK2 Menu");
                  Mtk.Softkeys.Current.PressSoftKey(Mtk.Softkeys.SoftKey.Right);
             
                  // press 3 for edit
                  Utils.GlobalLogger.AddComment("press 3 for edit");
                  Mtk.Smartphone.KeyPad.Press(3);
                 
                  //press 6 for new folder
                  Utils.GlobalLogger.AddComment("press 6 for new folder");
                  Mtk.Smartphone.KeyPad.Press(6);
                 
                  //Press action button : Create New FileFolder
                  Utils.GlobalLogger.AddComment("Press action button Create New FileFolder");
                  Mtk.Smartphone.KeyPad.Press(Mtk.KeyPad.Key.Action);
       
                  //rename to New Folder
                  Utils.GlobalLogger.AddComment("rename to abc");
                  FEAreaLib.Instance.Rename("abc");
                 
                  //Press Action Button
                  Utils.GlobalLogger.AddComment("Press Action Button");
                  Mtk.Smartphone.KeyPad.Press(Mtk.KeyPad.Key.Action);
              }
              catch
              {
                  Utils.GlobalLogger.AddComment("Fail: Folder Create");
              }
              finally
              {
                  GC.Collect();
                  GC.WaitForPendingFinalizers();
              }
        }
        #endregion
        #region Copy a File or Folder
        /// <summary>
        /// Copy one Folder
        /// </summary>
        private void CopyFileOrFolder(string abc)
        {
              try
              {
                  //press sk2.menu
                  FEAreaLib.Instance.ClickOn(abc);
                  Utils.GlobalLogger.AddComment("Press SK2 Menu");
                  Mtk.Softkeys.Current.PressSoftKey(Mtk.Softkeys.SoftKey.Right);
             
                  // press 3 for edit
                  Utils.GlobalLogger.AddComment("press 3 for edit");
                  Mtk.Smartphone.KeyPad.Press(3);
                 
                  //press 2 for copy folder
                  Utils.GlobalLogger.AddComment("press 2 for new copy ");
                  Mtk.Smartphone.KeyPad.Press(Mtk.KeyPad.Key.D2);
        ]]>
使用WinCE CAB Manager制作CAB安裝文http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1381&Page=1wangxinxin2010-11-16 11:30:49]]>WinCE中的Touch Panel驅動介紹http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1380&Page=1wangxinxin2010-11-16 11:29:14WinCE中的Touch Panel驅動是由GWES模塊來管理的,Touch Panel驅動接收用戶的觸摸信息,并將其轉換為屏幕上的坐標信息,傳給GWES模塊。在WinCE中,Touch Panel驅動是分層的,分為MDD層和PDD層,這和其他WinCE設備驅動是一樣的。MDD層由微軟提供,用戶只需要實現MDD和PDD層間的DDSI函數就可以了。如圖


        WinCE中的GWES模塊負責加載和管理Touch Panel驅動,Touch Panel的MDD層向上提供DDI接口,PDD層是針對硬件的實現,對MDD層提供DDSI接口。


1 Touch Panel驅動中的數據結構

(1) TOUCH_PANEL_SAMPLE_FLAGS

用于描述一個采樣點的信息,這些信息被定義在一個枚舉結構中:

               enum enumTouchPanelSampleFlags {

                 TouchSampleValidFlag = 0x01,

                 TouchSampleDownFlag = 0x02,

                 TouchSampleIsCalibratedFlag = 0x04,

                 TouchSamplePreviousDownFlag = 0x08,

                 TouchSampleIgnore = 0x10,

                 TouchSampleMouse = 0x40000000

               };

               TouchSampleValidFlag:一個有效的采樣值

               TouchSampleDownFlag:第一次按觸摸屏時,返回該flag

               TouchSampleIsCalibratedFlag:采樣的x和y坐標值不需要再被校驗了

               TouchSamplePreviousDownFlag:表示上一次采樣狀態是按在觸摸屏上

               TouchSampleIgnore:忽略這次采樣值

               TouchSampleMouse:預留


(2) TPDC_CALIBRATION_POINT

用于描述一個校驗點的相關信息,結構如下:

               struct TPDC_CALIBRATION_POINT {

                 INT PointNumber;

                 INT cDisplayWidth;

                 INT cDisplayHeight;

                 INT CalibrationX;

                 INT CalibrationY;

               };

               PointNumber:校驗點索引值,用于描述校驗點在LCD上的位置

                                                0:中間

                                                1:左上

                                                2:左下

                                                3:右下

                                                4:右上

               cDisplayWidth:顯示的寬度

               cDisplayHeight:顯示的高度

               CalibrationX:校驗點的x坐標值

               CalibrationY:校驗點的y坐標值


(3) TPDC_CALIBRATION_POINT_COUNT

用于描述需要校驗的點的個數,結構如下:

               struct TPDC_CALIBRATION_POINT_COUNT {

                  DDI_TOUCH_PANEL_CALIBRATION_FLAGS flags;

                  INT cCalibrationPoints;

               };

               flags:一般為0

               cCalibrationPoints:需要校驗的點的個數,一般是5


(4) gIntrTouch和gIntrTouchChanged

這是兩個被MDD層用到的中斷,需要在PDD層中定義,如下:

                        DWORD gIntrTouch        = SYSINTR_NOP;

DWORD gIntrTouchChanged = SYSINTR_NOP;

gIntrTouch用于描述觸摸屏中斷,要和硬件的觸摸屏中斷相關聯。

gIntrTouchChanged用于在觸摸屏按下后,每隔一段時間進行一次采樣,應該和硬件的一個定時器中斷相關聯。

這兩個值應該在DdsiTouchPanelEnable(..)函數中和硬件中斷關聯,并在函數DdsiTouchPanelGetPoint(..)中根據情況清除相應的中斷。


2 MDD層API

        MDD為上層導出所需的Touch Panel驅動接口函數,上層通過這些函數可以完成對Touch Panel的操作,下面會介紹這些函數的功能。

(1) BOOL TouchPanelEnable(PFN_TOUCH_PANEL_CALLBACK pfnCallback):

使能Touch Panel設備,用于初始化Touch Panel。

       pfnCallback:指向處理Touch Panel事件的回調函數


(2) Void TouchPanelDisable(void):

禁用Touch Panel設備。


(3) BOOL TouchPanelGetDeviceCaps(INT iIndex, LPVOID lpOutput ):

獲得Touch Panel設備的相關信息。

       iIndex:索引值

                        TPDC_SAMPLE_RATE_ID:采樣率信息

                        TPDC_CALIBRATION_POINT_COUNT_ID:采樣點個數信息

                        TPDC_CALIBRATION_POINT_ID:采樣點坐標信息

            lpOutput:指向一個內存區域,用于存放獲得的相關信息


(4) VOID TouchPanelCalibrateAPoint(INT32 UncalX, INT32 UncalY, INT32* pCalX, INT32* pCalY):

將輸入的未經過校驗的坐標信息轉換成校驗后的坐標信息。

       UncalX:輸入的X坐標

               UncalY:輸入的Y坐標

       pCalX:校驗后的X坐標

       pCalY: 校驗后的Y坐標


(5) VOID TouchPanelPowerHandler(BOOL bOff):

Touch Panel的電源控制函數。

       bOff:TRUE表示關閉電源,FALSE表示打開電源


(6) BOOL TouchPanelReadCalibrationPoint(INT* pRawX, INT* pRawY):

獲得Touch Panel的坐標。

       pRawX:觸摸屏的X坐標

       PRawY:觸摸屏的Y坐標


(7) VOID TouchPanelReadCalibrationAbort(void):

終止當前的校驗。


(8) VOID TouchPanelSetCalibration(INT32 cCalibrationPoints, INT32* pScreenXBuffer, INT32* pScreenYBuffer, INT32* pUncalXBuffer, INT32* pUncalYBuffer):

]]>
分析評價Linux和WinCE/Windows的優缺點http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1379&Page=1wangxinxin2010-11-16 11:27:46正文:

           1.支持多種硬件平臺

      由于嵌入式設備硬件平臺的多樣性,CPU芯片的快速更新,嵌入式操作系統要求支持常用的嵌入式CPU,如X86, ARM, MIPS, POWERPC等,并具有良好的可移植性。另外還需要支持種類繁多的外部設備。Linux支持以上幾乎所有的主流芯片,并且還在不斷的被移植到新的芯片上。而在這方面,WinCE顯然差得很遠。

       2.占有較少的硬件資源

       由于多數嵌入式系統具有成本敏感性,處理器速度較低 ,存儲器空間較少,這要求嵌入式OS體積小,速度快。Linux體系結構比較靈活,易于裁減,可以小到2M flash,4M RAM。而WinCE對資源的要求更高。

       3.高可定制性

       由于不同的嵌入式應用對系統要求各不相同,這要求嵌入式OS具備高可定制性,能夠根據需要方便的增加和減少各項功能模塊。這一點對于嵌入式領域至關重要,而Linux由于圖形系統不在內核中,且支持模塊機制,內核可根據需要加入或去掉功能。其外圍工具擁有眾多選擇,更由于可以自由修改源代碼,具有極強的可定制性。而WinCE/Windows根本無法做到這一點。

       4.具有實時處理能力

]]>
欣賞一下WINCE6.0http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1378&Page=1wangxinxin2010-11-16 11:26:38微軟新版嵌入式操作系統Windows Embedded CE(WinCE)6.0將完全分享核心(kernel)源代碼。

  在事隔Windows Embedded CE 5.0推出兩年后,微軟新版Windows Embedded CE 6.0反應這個嵌入式操作系統后起之秀加緊腳步的決心。 其一的最大作為就是迎擊Linux、Wind River陣營長期以來對其定制化不足的攻擊。

  微軟臺灣營銷經理許妙華表示,Win CE 6.0的核心源代碼將悉數開放予硬件合作伙伴,供其修改源代碼開發客制化的文件系統、設備驅動程序與其他元件,而不需分享他們的最終設計給微軟或第三方。

  另外,加快產品開發時程也是Win CE 6.0的一大躍進。許妙華指出,Visual Studio Visual Studio 2005專業版將包含在Win CE 6.0的開發工具中。

  而Platform Builder成為Visual Studio 2005專業版的外掛程序(plug-in),協助設計人員完成從嵌入式操作系統客制化到應用程序開發等所有工作,縮短產品開發的上市時程。

  WinCE 6.0現已開始提供合作伙伴下載。根據微軟所述,許多廠商將在本季推出基于新的WinCE 6.0的應用產品,臺灣地區的合作伙伴包括了精技電腦、研華科技、威盛電子等。產品內容則涵蓋了便攜式導航設備、媒體播放器、遠端監視設備、IP網絡電話與游戲機等。

  WinCE是微軟針對嵌入式系統產品開發的精簡型操作系統。微軟約在十年前進入這個領域。所謂的嵌入式產品包括了智能手機、PDA、機頂盒(Set- top-box)等具有運算能力的設備。

  在智能手機領域里,微軟的競爭對手包含了Symbian和Linux;在其他嵌入式設備市場,Linux亦和微軟有所角力。

  雖然微軟穩坐桌面操作系統龍頭寶座,但是相較其在嵌入式系統市場所遭遇到的對手——Linux和Wind River,微軟一直到前年才終于超越Linux成為第一大的嵌入式操作系統廠商;惟在針對手持設備所推出的Windows Mobile操作系統,微軟在這塊市場的占有比例還甚小。

  此次微軟宣布源代碼開放并非首樁,不過確是微軟難得的大動作。該公司在WinCE 4.2版時,也曾提供開放源代碼,不過只針對研究單位,而源代碼較少,為200萬行。

  在兩年前推出WinCE 5.0時,則開放250萬行源代碼程序作為評估套件(evaluation kit),凡是個人、廠商都可以下載這些源代碼加以修改使用。

  “分享的源代碼比前一版本的Windows Embedded CE大幅增加56%,”許妙華說。

  雖然開放分享源代碼,可望提高微軟OEM客戶定制化的能力,但是微軟長期以來另一被詬病之處——授權費過高的問題仍未獲解決。對此微軟仍重提時間就是成本的優勢。

  微軟亞洲區嵌入式系統事業部暨全球ODM Ecosystems資深副總經理吳勝雄指出,WinCE嵌入式系統產品平均開發時間為8個月,若以Linux開發則平均得拉長至14個月。

  此外WinCE具有各式各樣的模組,在Linux上可能得自行開發或另外授權,事實上Linux不見得免費或比較便宜,嵌入式系統廠商必須以上市時間等整體開發成本為考慮。

  除源代碼全數開放、與Visual Studio開發工具整合外,許妙華表示,WinCE 6.0可同時支持32,000個程序和每個程序高達2GB的虛擬內存定址空間,且保有軟件的實時(real-time)功能。讓開發人員可將更多應用程序加入更復雜的設備

]]>
基于CoolPad,VS2005開發WinCE指南,及相關API(C#)http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=9&ID=1377&Page=1wangxinxin2010-11-16 11:24:26 基于CoolPad,VS2005開發WinCE指南(1)


開發硬件平臺:CoolPad系列手機
開發軟件平臺:Visual Studio .Net 2005
開發語言:C#

注意事項:先要安裝Visual Studio .Net 2005,然后安裝CoolPad手機開發包(以DEV_768_SDK1.00.9.msi為例)。若Visual Studio .Net 2005是在CoolPad手機開發包之后安裝的,請再安裝一次CoolPad手機開發包,使之集成在Visual Studio .Net 2005中。

環境搭建好后,請按如下步驟進行:

1.        運行Visual Studio .Net 2005,如下圖所示
本帖隱藏的內容需要回復才可以瀏覽


2.        點擊File菜單下的Project菜單,如下圖所示:
本帖隱藏的內容需要回復才可以瀏覽


3.        在彈出的New Project對話框中選中Visual C# -->SmartDevice目錄下的Windows CE 5.0選項,然后在右邊的Templates窗口中選中Device Application選項。最后在窗口的Name和Location標簽后的TextBox文本框中填入項目名稱和指定位置,完成后點擊OK
本帖隱藏的內容需要回復才可以瀏覽

4.        點擊Start Debugging按鈕,即下圖所示的綠色三角形按鈕
本帖隱藏的內容需要回復才可以瀏覽


5.        在彈出的Deploy菜單中選中YULONG CoolPAD768:ARMV4I_Release選項,然后點擊Deploy按鈕。此時程序會自動部署到手機上運行。
本帖隱藏的內容需要回復才可以瀏覽


注意:第一次運行會比較慢,而且可能出現內存不足的情況,請將手機中的存儲內存調大,然后運行即可。(手機中的內存調整在“本機設置”中的“系統”選項中)
本帖隱藏的內容需要回復才可以瀏覽
附件: 您需要登錄才可以下載或查看附件。沒有帳號?注冊
]]>
主站蜘蛛池模板: 亚洲rct中文字幕在线 | 99re久久资源最新地址 | 91精品国产91久久久久青草 | 精品成人免费一区二区在线播放 | 亚洲成人精品 | 久久99久久精品视频 | 特级做a爰片毛片免费看一区 | 久久久久久91香蕉国产 | 91精品欧美综合在线观看 | 一区二区三区免费高清视频 | 久久久毛片免费全部播放 | 初爱视频教程在线观看高清 | 久草经典视频 | 日韩在线视频观看 | 久久久久琪琪去精品色村长 | 97在线播放 | 精品综合久久久久久98 | 久久久久无码国产精品一区 | 性a视频| 麻豆理论片 | 97国产精品视频观看一 | 好吊色37pao在线观看 | 特黄特黄aaaa级毛片免费看 | 成 人 亚洲 综合天堂 | 美国三级网站 | 久久黄色影院 | 韩国毛片免费 | 欧美日韩精品免费一区二区三区 | 在线视频免费观看a毛片 | 高清国产亚洲va精品 | 理伦毛片| 中国精品视频一区二区三区 | 欧美日韩高清不卡一区二区三区 | 精品国产呦系列在线看 | 欧美成年人网站 | 日韩精品麻豆 | 久久精品亚洲综合一品 | 免费国产成人高清在线观看视频 | 日韩欧美一区二区三区免费看 | 久草视频在 | 91精品视频在线播放 |