香蕉视频久久,亚洲免费高清视频,亚洲一区二区欧美http://www.bjzhda.cnzh-cn曙海教育集團(tuán)論壇http://www.bjzhda.cnRss Generator By Dvbbs.Netofficeoffice@126.comimages/logo.gif曙海教育集團(tuán)論壇wince驅(qū)動(dòng)開發(fā)學(xué)習(xí)筆記http://www.bgl88.cn/bbs/dispbbs.asp?BoardID=9&ID=1396&Page=1wangxinxin2010-11-16 14:53:22嵌入式開發(fā)技術(shù):wince驅(qū)動(dòng)開發(fā)學(xué)習(xí)筆記

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

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

嵌入式 嵌入式開發(fā) 嵌入式系統(tǒng) wince驅(qū)動(dòng)開發(fā)

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

所以,一個(gè)驅(qū)動(dòng)程序可以是單體的流式驅(qū)動(dòng),例如:ATADISK.也可以是分層的流式: 如OHCI ”

       按照我的理解,單體和分層是驅(qū)動(dòng)實(shí)現(xiàn)方式上的分類,而本地和流式則是驅(qū)動(dòng)模型上的分類,所謂本地驅(qū)動(dòng)就是操作系統(tǒng)有保留專門的接口,所謂流式是指編寫的DLL文件里可以導(dǎo)出各種流式接口函數(shù)。

         第二點(diǎn):驅(qū)動(dòng)的功能屬性。設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和硬件的接口,操作系統(tǒng)定義了一組標(biāo)準(zhǔn)的接口,編寫驅(qū)動(dòng)的過程也就是實(shí)現(xiàn)這些接口。從應(yīng)用程序到具體硬件間有如下這些環(huán)節(jié)起作用:應(yīng)用程序-調(diào)用OS函數(shù)-操作系統(tǒng)-驅(qū)動(dòng)接口-驅(qū)動(dòng)程序-硬件操作函數(shù)-硬件。在wince里驅(qū)動(dòng)都以用戶態(tài)的DLL存在,需要通過進(jìn)程加載到slot里。共有三類系統(tǒng)進(jìn)程用來加載:Device.exe,GWES.exe,FileSys.exe.絕大多數(shù)設(shè)備驅(qū)動(dòng)都是通過Device.exe加載的。需要注意的是,不同的OS保留的設(shè)備驅(qū)動(dòng)接口是不一樣的,如桌面windows和wince就不同。

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

     第四點(diǎn):流接口驅(qū)動(dòng)的概念。暴露流式接口函數(shù)的驅(qū)動(dòng)即是流驅(qū)動(dòng),它把外設(shè)抽象成一個(gè)文件。過程是:應(yīng)用程序使用文件API對設(shè)備進(jìn)行訪問,OS接受API調(diào)用FileSys.exe,轉(zhuǎn)到device.exe,調(diào)用流接口,與硬件交互。所謂流接口函數(shù)有十個(gè),包括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.而我們在應(yīng)用程序里對應(yīng)的文件API有CreateFile、DeviceIoControl、 ReadFile、 WriteFile,CloseHandle,SetFilePointer. 

      第五點(diǎn):編寫流驅(qū)動(dòng)的步驟。有兩種實(shí)現(xiàn)途徑:1。寫DLL,做成Project,加入到OS里。2。改BSP,把驅(qū)動(dòng)寫在BSP里,再選擇那個(gè)BSP做OS。第一種方法步驟是在PB中新建一個(gè)DLL項(xiàng)目,編寫一些輸入函數(shù),寄存器,外設(shè)的聲明,寫DLLENTRY函數(shù);實(shí)現(xiàn)流接口函數(shù);編寫DLL的導(dǎo)出函數(shù)文件.DEF;為驅(qū)動(dòng)程序?qū)懭胱员眄?xiàng),還需要修改bib文件。 第二種方法就是在platform/BSP/drivers下新建一個(gè)目錄,然后在drivers目錄中的dirs文件中加入新建的目錄名。在新建的目錄下,新建你的源代碼文件,在其中實(shí)現(xiàn)DLL函數(shù)。新建名稱分別為sources, makefile, ***.def的文件;修改platform.reg和platform.bib文件

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

1、 對象存儲(object store)
  對象存儲是Windows CE默認(rèn)的數(shù)據(jù)存儲機(jī)制。任何新創(chuàng)建的內(nèi)核中都默認(rèn)包含對象存儲器。對象存儲的實(shí)質(zhì)是在RAM中創(chuàng)建一個(gè)文件系統(tǒng),將文件保存在RAM中,這些文件來源于ROM。當(dāng)設(shè)備啟動(dòng)時(shí),引導(dǎo)程序?qū)OM中的內(nèi)核文件解壓并存放在RAM中。"\windows"目錄就是基于對象存儲的。對象存儲的特點(diǎn)是文件可以壓縮、支持事務(wù)機(jī)制(和數(shù)據(jù)庫中的事務(wù)機(jī)制相似)、數(shù)據(jù)I/O相對較快。

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

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

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

 

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

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

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

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

////////導(dǎo)出。在系統(tǒng)關(guān)閉前。 
if(! RegCopyFile(strTmp))     ///導(dǎo)出注冊表,用temp.reg做緩沖用。
{
 return FALSE; 
}

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

/////////導(dǎo)入。在系統(tǒng)啟動(dòng)時(shí)。
if(! CopyFile(strRegBackup, strTmp, FALSE))
{
 return  FALSE;
}

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

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


本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/ymzhou117/archive/2009/11/11/4799873.aspx

]]>
支持wince5.0的6串口單板電腦http://www.bgl88.cn/bbs/dispbbs.asp?BoardID=9&ID=1394&Page=1wangxinxin2010-11-16 14:38:53
以下內(nèi)容含腳本,或可能導(dǎo)致頁面不正常的代碼
說明:上面顯示的是代碼內(nèi)容。您可以先檢查過代碼沒問題,或修改之后再運(yùn)行.
]]>
DC平臺 WINCE下開發(fā)DVD播放器http://www.bgl88.cn/bbs/dispbbs.asp?BoardID=9&ID=1393&Page=1wangxinxin2010-11-16 14:37:38想在Dreamcast上的WinCE&DirectX6.1 SDK 開發(fā)DVD播放器
目前網(wǎng)上找了個(gè)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);
本文轉(zhuǎn)貼自 【 浮游城 - Castle in the Sky | 開放邀請注冊,PS|SS|WII|DC下載研究中心 】 ,原文地址:http://bbs.chinaemu.org/read-htm-tid-93244.html

]]>
主要討論在WinCE設(shè)計(jì)和開發(fā)C...WindowsCE.Net下CAN卡的驅(qū)動(dòng)程序設(shè)計(jì)31028http://www.bgl88.cn/bbs/dispbbs.asp?BoardID=9&ID=1392&Page=1wangxinxin2010-11-16 14:31:362 CAN卡驅(qū)動(dòng)底層函數(shù)設(shè)計(jì)

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

2.1 CAN卡寄存器讀寫函數(shù)

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

*在偏移量為off的地址讀取一個(gè)字節(jié)的數(shù)據(jù)inline BYTE CANR(LPCAN_HW_OPEN_INFO hCan,DWORD off)

{

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

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

{

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

}

參數(shù)LPCAN_HW_OPEN_INFO定義的是CAN卡的數(shù)據(jù)結(jié)構(gòu),其中成員lpMappeBaseAddr[0]表示的是映射后基地址,lpMappedBaseAddr[1]就是基地址+1的地址,對應(yīng)CAN卡的寄存器是命令寄存器。通過上述兩個(gè)函數(shù)可操作CAN卡上的所有寄存器。

2.2 CAN卡初始化

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

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

第二卡,設(shè)置CAN卡默認(rèn)參數(shù):

CanCardConfigInfo CAN_DEFAULT_SETTING=

{0X00,0XFF,0X03,0X1C};/*設(shè)置默認(rèn)波特率為125Kbps*/

DWORD dwThreadID =0;

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

第三卡,用WinCE API函數(shù)LocalAlloc為CAN卡驅(qū)動(dòng)中用到的數(shù)據(jù)結(jié)構(gòu)分配緩沖區(qū);通過HalTranslateBusAddress和MmMapIoSpace函數(shù)映射I/O地址,提供直接訪問設(shè)備的虛擬地址:

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;

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

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

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

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

第六步,初始化中斷,如果CAN卡有復(fù)位請求就退出初始化程序。設(shè)置好中斷后啟動(dòng)數(shù)據(jù)接收線程,設(shè)置線程優(yōu)先級繼續(xù)線程處理;最后配置CAN卡參數(shù),進(jìn)入正常運(yùn)行狀態(tài)。

2.3 CAN卡信息發(fā)送

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

表1

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

表2

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

CAN消息發(fā)送函數(shù)的實(shí)現(xiàn)如下:

BOOL CAN_SendMessage(LPCAN_HW_OPEN_INFO hCan,LPCanCardMessageBuflpMsg)

{

BOOL bSuc=FALSE;

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

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

return FALSE;

:: EnterCriticalSection(&hCan->lpCanHWInfo->

TransmitCritSec); /*進(jìn)入臨界區(qū)*/

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

CANW(hCan,10,byV); /*設(shè)置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);/*設(shè)置ID值低3位、RTR及數(shù)據(jù)長度*/

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

{

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

} /*采集數(shù)據(jù)*/

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

while(TRUE)

{byV=CANR(hCan,2);

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

{break;}

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

bSuc = TRUE;

break;}

}

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

return bSuc;

}

2.4 CAN卡信息接收

CAN卡的信息接收是發(fā)送的逆過程,當(dāng)接收緩沖區(qū)標(biāo)志為1時(shí),表示緩沖區(qū)已滿可以接收數(shù)據(jù),將數(shù)據(jù)接收到數(shù)組后釋放接收緩沖區(qū),然后對接收到的數(shù)據(jù)進(jìn)行分解并存儲到CAN卡信息緩沖區(qū)的結(jié)構(gòu)體。接收緩沖區(qū)的寄存器結(jié)構(gòu)如表2所列。

CAN消息接收函數(shù)的實(shí)現(xiàn)如下:

BOOL CAN_RecvRecvMessage(LPCAN_HW_OPEN_INFO

HCan,OUT LPCanCardMessageBuflpMsg)

{……

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

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

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

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

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

BYTE byV =recvBuf[1];

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

LpMsg->bRTR =byV &0x10?TRUE:/*返回RTR狀態(tài)*/

LpMsg->dwMessageLen = byV &0XF; /*返回?cái)?shù)據(jù)長度*/

……

}

else

{++hCan->lpCanHWInfo->dwErrorMsgCount;}/*沒有收到數(shù)據(jù),錯(cuò)誤計(jì)數(shù)加1*/

::LeaveCriticalSection(&hCan->lpCanHWInfo->

ReceiveCritSec); /*離開臨界區(qū)*/

Return bSuc;

}

2.5 CAN卡事件處理

CAN卡事件處理函數(shù)是CAN卡驅(qū)動(dòng)程序中很重要的部分。驅(qū)動(dòng)設(shè)計(jì)要求具有消息通知的功能,當(dāng)事件發(fā)生時(shí)及時(shí)捕獲事件并進(jìn)行消息處理。

下面是事件處理函數(shù)的實(shí)現(xiàn):

staric DWORD WINAPI CAN_EventHanle(LPVOID lpParam)

{

ASSERT(lpParam);

LPCAN_HW_OPEN_INFO hCan=(LPCAN_HW_OPEN_INFO)lpParam;

CanCardMessageBuf bufMsg;

while(TEUE)

{ /*循環(huán)等待CAN卡消息產(chǎn)生,然后進(jìn)行處理*/

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

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

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

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

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

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

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

} /*本次中斷結(jié)束,等待下次中斷*/

return 0;

}

2.6 其它函數(shù)

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

3 CAN卡驅(qū)動(dòng)封裝設(shè)計(jì)

CAN卡底層驅(qū)動(dòng)函數(shù)雖然功能完整,但是對于用戶使用比較復(fù)雜并且一般用戶不需要了解底層實(shí)現(xiàn)的機(jī)制。為了便于使用,最后對CAN卡的驅(qū)動(dòng)進(jìn)行了封裝,提供CanOpenFile、CanSendMsg等五個(gè)函數(shù)用于CAN總線的通信,以動(dòng)態(tài)連接庫(DLL)的形式提供給用戶調(diào)用。封裝函數(shù)及功能如下:

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

*CanCloseFile;關(guān)閉由CanOpenFile打開的CAN卡端口。

*CanRecvMsg;接收CAN卡數(shù)據(jù),打開CAN卡時(shí)必須具有GENERIC_READ權(quán)限。

*CanSendMsg;通過CAN卡發(fā)送數(shù)據(jù)。打開CAN卡時(shí)必須具有GENERIC_WRITE權(quán)限。

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

下面是CanSendMsg函數(shù)實(shí)現(xiàn)的代碼:

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);

該函數(shù)就是通過封裝CAN卡的底層驅(qū)動(dòng)函數(shù)SendMessage來實(shí)現(xiàn)的,這樣將功能集中的五個(gè)函數(shù)更方便了用戶使用。

結(jié)語

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

本文設(shè)計(jì)開發(fā)的驅(qū)動(dòng)已經(jīng)在北京懷柔的變電站項(xiàng)目中得到成功的應(yīng)用,CAN卡通信穩(wěn)定,系統(tǒng)在WINCE.NET下運(yùn)行可靠,保證了項(xiàng)目的順利實(shí)施。

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

    intfs_key_table intfstable;
    intfstable.dwnumintfs = 0;
    intfstable.pintfs = null;
    _tcscpy(pcard, text(""));
    // 枚舉系統(tǒng)中可用的無線網(wǎng)卡
    dword dwstatus = wzcenuminterfaces(null, &intfstable);
    if (dwstatus != error_success)
    {
        retailmsg(dbg_msg, (text("wzcenuminterfaces() error 0x%08x\n"),dwstatus));
        return false;
    }
    // 判斷無線網(wǎng)卡的數(shù)量,可以根據(jù)無線網(wǎng)卡數(shù)量來枚舉出所有可用的無線網(wǎng)卡
    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;
}
        二、獲取無線網(wǎng)絡(luò)信息
        獲取到了系統(tǒng)可用的無線網(wǎng)卡后,我們就可以利用它的 guid 號來進(jìn)行進(jìn)一步的操作了,首先要做的事情就是得到該無線網(wǎng)卡的信息以及該無線網(wǎng)卡掃描到的 wifi 網(wǎng)關(guān)信息。
        以下函數(shù)可以獲取到該無線網(wǎng)卡及掃描的到的無線 ap 信息
//////////////////////////////////////////////////////////////////////////
// pcard: 無線網(wǎng)卡 guid
// pintf: 無線網(wǎng)卡配置信息結(jié)果體
// poutflags: 網(wǎng)卡配置信息掩碼標(biāo)志
//////////////////////////////////////////////////////////////////////////
bool getwirelesscardinfo(ptchar pcard, pintf_entry_ex pintf, pdword poutflags)
{
    tchar *szwificard = null;
    // 參數(shù)校驗(yàn)
    if (!pcard || !pintf || !poutflags)
    {
        retailmsg(dbg_msg, (text("param error.\n")));
        return false;
    }      
    szwificard = pcard;
     
    *poutflags = 0;
     
    // 初始化無線網(wǎng)卡信息
    zeromemory(pintf, sizeof(intf_entry_ex));
     
    // 設(shè)置 guid 號
    pintf->wszguid = szwificard;
    // 查詢無線網(wǎng)卡信息
    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;
}
        三、判斷連接狀態(tài)
        我們可以通過無線網(wǎng)卡的狀態(tài)來判斷當(dāng)前無線網(wǎng)卡是否已經(jīng)和無線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信息
        獲取了無線網(wǎng)卡的信息后,可以通過無線網(wǎng)卡枚舉出當(dāng)前所有可用的無線ap的ssid名稱以及加密模式等等所有可用信息,一下函數(shù)可以實(shí)現(xiàn)該功能
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 碼轉(zhuǎn)化成字符串
            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.bgl88.cn/bbs/dispbbs.asp?BoardID=9&ID=1389&Page=1wangxinxin2010-11-16 14:19:10
以下內(nèi)容含腳本,或可能導(dǎo)致頁面不正常的代碼
說明:上面顯示的是代碼內(nèi)容。您可以先檢查過代碼沒問題,或修改之后再運(yùn)行.
]]>
ok6410 sd卡一鍵燒錄問題http://www.bgl88.cn/bbs/dispbbs.asp?BoardID=9&ID=1388&Page=1wangxinxin2010-11-16 14:14:42SD卡遇到問題如下:
1:啟動(dòng)開關(guān)設(shè)置:1,2,3 為0;4,5,6,7,8 為1;
2:按一鍵燒錄說明燒好SD卡(4G),插入開發(fā)板;
3:接上串行線,USB
4:開啟dnw;
5:接通開發(fā)板電源;
電腦提示:無法識別USB設(shè)備。試圖安裝,找遍飛凌公司提供的盤片資料(包括dnw下載驅(qū)動(dòng)),沒有合適的驅(qū)動(dòng)可安裝。。
dnw信息區(qū)顯示:
=============== 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()                                                 //停在此處


開發(fā)板液晶顯示花屏。
注:在Nand 上啟動(dòng)WINCE  正常。ActiveSync 工作正常。

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

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

圖片點(diǎn)擊可在新窗口打開查看


  
圖l、視頻監(jiān)控系統(tǒng)總體結(jié)構(gòu)框圖


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

圖片點(diǎn)擊可在新窗口打開查看


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

圖片點(diǎn)擊可在新窗口打開查看


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

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

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

      攝像頭(CAMERA)又稱為電腦相機(jī)、電腦眼等,它作為一種視頻輸入設(shè)備,被廣泛的運(yùn)用于個(gè)人電腦視頻和實(shí)時(shí)監(jiān)控等方面。然而,作為嵌入式的WinCE操作系統(tǒng)卻因?yàn)槿鄙贁z像頭的驅(qū)動(dòng)而不能采用這種視頻采集方案。為了更好的服務(wù)英創(chuàng)的客戶,經(jīng)過公司團(tuán)隊(duì)的努力,解決了這個(gè)難題,可以為貴公司提供低成本的攝像頭解決方案。

      我們?yōu)閿z像頭訂制了專門的API函數(shù),提供了使用例程。你可以參照英創(chuàng)提供的例程,迅速編寫出適合自己領(lǐng)域的產(chǎn)品。

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

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

// 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
                            );

]]>
分析評價(jià)Linux和WinCE的優(yōu)缺點(diǎn)http://www.bgl88.cn/bbs/dispbbs.asp?BoardID=9&ID=1385&Page=1wangxinxin2010-11-16 11:42:551.支持多種硬件平臺
由于嵌入式設(shè)備硬件平臺的多樣性,CPU芯片的快速更新,嵌入式操作系統(tǒng)要求支持常用的嵌入式CPU,如X86, ARM, MIPS, POWERPC等,并具有良好的可移植性。另外還需要支持種類繁多的外部設(shè)備。Linux支持以上幾乎所有的主流芯片,并且還在不斷的被移植到新的芯片上。而在這方面,WinCE顯然差得很遠(yuǎn)。
2.占有較少的硬件資源
由于多數(shù)嵌入式系統(tǒng)具有成本敏感性,處理器速度較低 ,存儲器空間較少,這要求嵌入式OS體積小,速度快。Linux體系結(jié)構(gòu)比較靈活,易于裁減,可以小到2M flash,4M RAM。而WinCE對資源的要求更高。
3.高可定制性
由于不同的嵌入式應(yīng)用對系統(tǒng)要求各不相同,這要求嵌入式OS具備高可定制性,能夠根據(jù)需要方便的增加和減少各項(xiàng)功能模塊。這一點(diǎn)對于嵌入式領(lǐng)域至關(guān)重要,而Linux由于圖形系統(tǒng)不在內(nèi)核中,且支持模塊機(jī)制,內(nèi)核可根據(jù)需要加入或去掉功能。其外圍工具擁有眾多選擇,更由于可以自由修改源代碼,具有極強(qiáng)的可定制性。而WinCE/Windows根本無法做到這一點(diǎn)。
4.具有實(shí)時(shí)處理能力
實(shí)時(shí)應(yīng)用分為硬實(shí)時(shí)和軟實(shí)時(shí)兩大類,嵌入式OS需要明確是否支持實(shí)時(shí)和支持哪一類實(shí)時(shí)應(yīng)用,需要提供最壞情況響應(yīng)時(shí)間為多長。Linux和WinCE/Windows最初設(shè)計(jì)時(shí)都沒有考慮實(shí)時(shí)應(yīng)用,但眾多的實(shí)時(shí)Linux項(xiàng)目已使Linux具備了硬實(shí)時(shí)和軟實(shí)時(shí)處理能力,硬實(shí)時(shí)有RT-Linux和RTAI,而2.6中加入了可搶占核心,使得Linux具備了軟實(shí)時(shí)處理能力,此外還有Timsys和Montavista等實(shí)時(shí)Linux實(shí)現(xiàn)。Linux自由開發(fā)模式的優(yōu)點(diǎn)得到了充分的體現(xiàn)。Windows雖然也有第三方提供類似于RT-linux的實(shí)時(shí)功能,但由于微軟未提供這方面的支持,也由于Windows可靠性不能滿足要求,很少有人在實(shí)時(shí)領(lǐng)域使用Windows。但RT-linux已經(jīng)在美國航天部門,印度軍方等得到了廣泛應(yīng)用。還有Montavista,Timsys的實(shí)時(shí)Linux都有很多成功案例。
5.具備強(qiáng)大的網(wǎng)絡(luò)功能
現(xiàn)在,越來越多的嵌入式設(shè)備需要具備網(wǎng)絡(luò)功能。這要求嵌入式OS支持常用的網(wǎng)絡(luò)協(xié)議和可靠的網(wǎng)絡(luò)功能。Linux的網(wǎng)絡(luò)功能經(jīng)過幾次改進(jìn),其效率,功能都很突出。且具有眾多的網(wǎng)絡(luò)工具,支持幾乎所有常見的網(wǎng)絡(luò)協(xié)議。這些使得Linux在網(wǎng)絡(luò)設(shè)備中倍受青睞,很多防火墻,低端路由器等中使用的都是Linux。而未聞WinCE/windows在這方面有什么應(yīng)用。
6.高安全性和高可靠性
嵌入式設(shè)備往往對安全性和可靠性要求很高,這要求作為基礎(chǔ)軟件的嵌入式OS具有高安全性和高可靠性。如骨干網(wǎng)的路由器,交換機(jī)等。Linux的可靠性是經(jīng)過實(shí)踐檢驗(yàn)的,并進(jìn)一步向高端發(fā)展,沖擊Vxworks, Unix的市場。安全性方面Linux病毒極少,并擁有眾多安全增強(qiáng),有的安全增強(qiáng)Linux達(dá)到了B1級別(紅旗RFSOS通過了國家GB17859第三級,等同于TCSEC B1級)。而Windows病毒眾多,漏洞不斷,雖然微軟大力宣傳其通過了CC標(biāo)準(zhǔn)EAL4級,但是需要說明的是,EAL4僅僅說明Windows在多大程度上滿足了它的安全目標(biāo),顯然更為重要的是這個(gè)目標(biāo)是什么,事實(shí)上,它通過的是CAPP的EAL4級,仍然相當(dāng)于TCSEC C2級,Win2000的可靠性比起98等來說有了明顯提高,但尚不足以向高端沖擊,其安全性問題也會大大影響它的可靠性,這二者是緊密聯(lián)系的,不能孤立討論。
7.具有完善的嵌入式GUI和嵌入式瀏覽器
面向用戶的嵌入式終端設(shè)備如Smart Phone等,都要求嵌入式OS具有功能完善,控件豐富的嵌入式GUI,并支持功能強(qiáng)大的嵌入式瀏覽器。在這方面WinCE有完善的解決方案,Linux也有QT/Embedded等GUI,Opera等嵌入式瀏覽器,擁有眾多的選擇。
8.實(shí)現(xiàn)嵌入式日志文件系統(tǒng),具備斷電保護(hù)能力。
這些功能Linux和Windows都能達(dá)到。
9.能夠提供完善的開發(fā)工具集。
Linux下的開發(fā)工具眾多,但不如Windows開發(fā)工具易用。不過Windows的開發(fā)工具不是為嵌入式領(lǐng)域設(shè)計(jì)的,功能也不完善。
10.能夠快速啟動(dòng)
啟動(dòng)速度二者差不多,但很多嵌入式設(shè)備并不需要圖形界面,且由于Linux有源代碼,在硬件固定的情況下可以加速啟動(dòng),這時(shí)Linux就比WinCE/Windows啟動(dòng)快多了。
通過以上分析,可以很清楚地看到,總體比較而言,在嵌入式領(lǐng)域Linux比WinCE/Windows具有明顯優(yōu)勢。正因?yàn)槿绱耍度胧絃inux比WinCE/Windows應(yīng)用領(lǐng)域要廣泛的多。WinCE的優(yōu)勢在于PC衍生產(chǎn)品,如Pocket PC,高端PDA等。但在其他眾多的嵌入式領(lǐng)域中,WinCE就并不適合了。
如果是為了學(xué)習(xí),好玩,我選擇linux。如果我周圍有一個(gè)開發(fā)團(tuán)隊(duì),選擇linux。
如果我是單槍匹馬或是人員有限,能盡快地開發(fā)產(chǎn)品,選擇winCE。]]>
嵌入式開發(fā)流程http://www.bgl88.cn/bbs/dispbbs.asp?BoardID=9&ID=1384&Page=1wangxinxin2010-11-16 11:40:20
  嵌入式開發(fā)主要分為三個(gè)比較大的部分:
  1、驅(qū)動(dòng)程序開發(fā)
  這部分開發(fā)是從硬件設(shè)計(jì)開始的,硬件工程師會設(shè)計(jì)PCB板,為我們提供標(biāo)準(zhǔn)開發(fā)板(SDB,standard development board)。當(dāng)我們拿到開發(fā)板之后的第一件事情就是編寫boot-loader,讓開發(fā)板啟動(dòng)起來,一般是通過JTAG將boot-loader燒錄到開發(fā)板中的。我們可以將boot-loader看作PC中的BIOS,負(fù)責(zé)硬件設(shè)備的初始化工作,并且將操作系統(tǒng)運(yùn)行起來。在此之后,我們需要根據(jù)開發(fā)板上的硬件開發(fā)各種驅(qū)動(dòng)程序,比如串口、USB、鼠標(biāo)、視頻輸入等。最后將這些驅(qū)動(dòng)程序和boot-loader打包,稱為一個(gè)板級支持包(BSP)。BSP是和開發(fā)板的具體硬件緊密相關(guān)的。
  所以從事這方面開發(fā)的工程師往往具有比較強(qiáng)的硬件知識水平。
  2、平臺定制
  我們可以將Windows CE想象為一盒積木,根據(jù)不同的應(yīng)用場景和設(shè)備要求,我們要對這盒積木進(jìn)行定制,堆積出不同形狀的城堡、動(dòng)物和生活用品。這個(gè)過程稱為“平臺定制”,定制產(chǎn)生的平臺往往和具體的硬件設(shè)備相關(guān),直接將平臺下載到硬件設(shè)備上就可以運(yùn)行了。整個(gè)開發(fā)過程,需要選擇不同的組件來搭配出最適合當(dāng)前硬件的軟件平臺。所以要對Windows CE的組件,也就是Catalog Item,有相當(dāng)程度的了解。
  3、應(yīng)用程序開發(fā)
  嵌入式設(shè)備上的應(yīng)用程序開發(fā)與傳統(tǒng)應(yīng)用程序開發(fā)類似,只是要借助于硬件模擬器或者實(shí)際設(shè)備對程序進(jìn)行調(diào)試。最常見的嵌入式設(shè)備應(yīng)用程序開發(fā),就是Windows Mobile的移動(dòng)應(yīng)用開發(fā)。平臺定制工程師會在硬件出廠之前先提供平臺相關(guān)的SDK,SDK中會包括模擬器。應(yīng)用開發(fā)者可以首先使用模擬器對程序進(jìn)行開發(fā)和調(diào)試。等實(shí)際硬件出來之后,再將程序轉(zhuǎn)移到實(shí)際硬件中。因?yàn)閃indows CE采用了很多措施,這種“轉(zhuǎn)移”幾乎是無縫的,所以我們并沒有使用“移植”這個(gè)詞。
  嵌入式領(lǐng)域的應(yīng)用開發(fā)其實(shí)是普通軟件工程師就可以進(jìn)行的。
]]>
WinCE開發(fā)概述http://www.bgl88.cn/bbs/dispbbs.asp?BoardID=9&ID=1383&Page=1wangxinxin2010-11-16 11:39:44
這篇文章的目的并不是介紹Windows Embedded CE開發(fā)的方方面面,只是用一個(gè)初涉嵌入式領(lǐng)域的軟件開發(fā)者的視角來介紹Windows CE開發(fā)中最常用的概念和知識,解決大家會在實(shí)際開發(fā)中碰到的一些小問題,讓大家了解嵌入式開發(fā)與應(yīng)用程序開發(fā),到底有哪些不同。
Windows CE概述
  從6.0版本開始,Windows CE的名字改為Windows Embedded CE,當(dāng)然這也是為了結(jié)合Windows Embedded品牌作出的改變。CE經(jīng)過了十年的風(fēng)風(fēng)雨雨之后,終于在CE 6.0這個(gè)版本上再次浴火重生了。CE 6.0經(jīng)歷了CE歷史上第二次內(nèi)核重寫,使CE操作系統(tǒng)更加符合當(dāng)今嵌入式開發(fā)的方向。
  CE 6.0在內(nèi)核方面的改變主要是為了適應(yīng)嵌入式設(shè)備硬件發(fā)展的要求,在進(jìn)程數(shù)量方面,從過去最多運(yùn)行32個(gè)進(jìn)程,改變?yōu)樽疃噙\(yùn)行3萬2千個(gè)進(jìn)程,內(nèi)存方面從每個(gè)進(jìn)程最多擁有32M虛擬內(nèi)存空間改為最多擁有2G虛擬內(nèi)存空間。在OS布局方面,將關(guān)鍵的驅(qū)動(dòng)程序、文件系統(tǒng)和圖形界面管理器(GWES)移到了內(nèi)核中,這樣可以更好解決因?yàn)镃PU在內(nèi)核態(tài)和用戶態(tài)間切換造成的性能損失。
  當(dāng)然,從以上的改變,我們可以看到CE 6.0較之前版本更加“重量級”了。操作系統(tǒng)領(lǐng)域關(guān)于“微內(nèi)核”的爭論已經(jīng)持續(xù)了很多年,CE的改變也許會為某個(gè)學(xué)派的觀點(diǎn)提供支持。但我們必須指出的是,正因?yàn)槟壳暗那度胧皆O(shè)備硬件已經(jīng)可以支持比較“重量級”的操作系統(tǒng)了,所以CE 6.0才會做出如此改變。
  CE針對開發(fā)者的另一個(gè)轉(zhuǎn)變開始自CE 5.0,將開發(fā)環(huán)境Platform Builder整合到Visual Studio中,這種做法無疑減輕了微軟維護(hù)兩套IDE的負(fù)擔(dān),從另外一個(gè)方面來看,CE的開發(fā)者也可以享受到更好的開發(fā)體驗(yàn)了。
]]>
測試微軟Wince的拷屏代碼Code :)http://www.bgl88.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.bgl88.cn/bbs/dispbbs.asp?BoardID=9&ID=1381&Page=1wangxinxin2010-11-16 11:30:49]]>WinCE中的Touch Panel驅(qū)動(dòng)介紹http://www.bgl88.cn/bbs/dispbbs.asp?BoardID=9&ID=1380&Page=1wangxinxin2010-11-16 11:29:14WinCE中的Touch Panel驅(qū)動(dòng)是由GWES模塊來管理的,Touch Panel驅(qū)動(dòng)接收用戶的觸摸信息,并將其轉(zhuǎn)換為屏幕上的坐標(biāo)信息,傳給GWES模塊。在WinCE中,Touch Panel驅(qū)動(dòng)是分層的,分為MDD層和PDD層,這和其他WinCE設(shè)備驅(qū)動(dòng)是一樣的。MDD層由微軟提供,用戶只需要實(shí)現(xiàn)MDD和PDD層間的DDSI函數(shù)就可以了。如圖


        WinCE中的GWES模塊負(fù)責(zé)加載和管理Touch Panel驅(qū)動(dòng),Touch Panel的MDD層向上提供DDI接口,PDD層是針對硬件的實(shí)現(xiàn),對MDD層提供DDSI接口。


1 Touch Panel驅(qū)動(dòng)中的數(shù)據(jù)結(jié)構(gòu)

(1) TOUCH_PANEL_SAMPLE_FLAGS

用于描述一個(gè)采樣點(diǎn)的信息,這些信息被定義在一個(gè)枚舉結(jié)構(gòu)中:

               enum enumTouchPanelSampleFlags {

                 TouchSampleValidFlag = 0x01,

                 TouchSampleDownFlag = 0x02,

                 TouchSampleIsCalibratedFlag = 0x04,

                 TouchSamplePreviousDownFlag = 0x08,

                 TouchSampleIgnore = 0x10,

                 TouchSampleMouse = 0x40000000

               };

               TouchSampleValidFlag:一個(gè)有效的采樣值

               TouchSampleDownFlag:第一次按觸摸屏?xí)r,返回該flag

               TouchSampleIsCalibratedFlag:采樣的x和y坐標(biāo)值不需要再被校驗(yàn)了

               TouchSamplePreviousDownFlag:表示上一次采樣狀態(tài)是按在觸摸屏上

               TouchSampleIgnore:忽略這次采樣值

               TouchSampleMouse:預(yù)留


(2) TPDC_CALIBRATION_POINT

用于描述一個(gè)校驗(yàn)點(diǎn)的相關(guān)信息,結(jié)構(gòu)如下:

               struct TPDC_CALIBRATION_POINT {

                 INT PointNumber;

                 INT cDisplayWidth;

                 INT cDisplayHeight;

                 INT CalibrationX;

                 INT CalibrationY;

               };

               PointNumber:校驗(yàn)點(diǎn)索引值,用于描述校驗(yàn)點(diǎn)在LCD上的位置

                                                0:中間

                                                1:左上

                                                2:左下

                                                3:右下

                                                4:右上

               cDisplayWidth:顯示的寬度

               cDisplayHeight:顯示的高度

               CalibrationX:校驗(yàn)點(diǎn)的x坐標(biāo)值

               CalibrationY:校驗(yàn)點(diǎn)的y坐標(biāo)值


(3) TPDC_CALIBRATION_POINT_COUNT

用于描述需要校驗(yàn)的點(diǎn)的個(gè)數(shù),結(jié)構(gòu)如下:

               struct TPDC_CALIBRATION_POINT_COUNT {

                  DDI_TOUCH_PANEL_CALIBRATION_FLAGS flags;

                  INT cCalibrationPoints;

               };

               flags:一般為0

               cCalibrationPoints:需要校驗(yàn)的點(diǎn)的個(gè)數(shù),一般是5


(4) gIntrTouch和gIntrTouchChanged

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

                        DWORD gIntrTouch        = SYSINTR_NOP;

DWORD gIntrTouchChanged = SYSINTR_NOP;

gIntrTouch用于描述觸摸屏中斷,要和硬件的觸摸屏中斷相關(guān)聯(lián)。

gIntrTouchChanged用于在觸摸屏按下后,每隔一段時(shí)間進(jìn)行一次采樣,應(yīng)該和硬件的一個(gè)定時(shí)器中斷相關(guān)聯(lián)。

這兩個(gè)值應(yīng)該在DdsiTouchPanelEnable(..)函數(shù)中和硬件中斷關(guān)聯(lián),并在函數(shù)DdsiTouchPanelGetPoint(..)中根據(jù)情況清除相應(yīng)的中斷。


2 MDD層API

        MDD為上層導(dǎo)出所需的Touch Panel驅(qū)動(dòng)接口函數(shù),上層通過這些函數(shù)可以完成對Touch Panel的操作,下面會介紹這些函數(shù)的功能。

(1) BOOL TouchPanelEnable(PFN_TOUCH_PANEL_CALLBACK pfnCallback):

使能Touch Panel設(shè)備,用于初始化Touch Panel。

       pfnCallback:指向處理Touch Panel事件的回調(diào)函數(shù)


(2) Void TouchPanelDisable(void):

禁用Touch Panel設(shè)備。


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

獲得Touch Panel設(shè)備的相關(guān)信息。

       iIndex:索引值

                        TPDC_SAMPLE_RATE_ID:采樣率信息

                        TPDC_CALIBRATION_POINT_COUNT_ID:采樣點(diǎn)個(gè)數(shù)信息

                        TPDC_CALIBRATION_POINT_ID:采樣點(diǎn)坐標(biāo)信息

            lpOutput:指向一個(gè)內(nèi)存區(qū)域,用于存放獲得的相關(guān)信息


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

將輸入的未經(jīng)過校驗(yàn)的坐標(biāo)信息轉(zhuǎn)換成校驗(yàn)后的坐標(biāo)信息。

       UncalX:輸入的X坐標(biāo)

               UncalY:輸入的Y坐標(biāo)

       pCalX:校驗(yàn)后的X坐標(biāo)

       pCalY: 校驗(yàn)后的Y坐標(biāo)


(5) VOID TouchPanelPowerHandler(BOOL bOff):

Touch Panel的電源控制函數(shù)。

       bOff:TRUE表示關(guān)閉電源,F(xiàn)ALSE表示打開電源


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

獲得Touch Panel的坐標(biāo)。

       pRawX:觸摸屏的X坐標(biāo)

       PRawY:觸摸屏的Y坐標(biāo)


(7) VOID TouchPanelReadCalibrationAbort(void):

終止當(dāng)前的校驗(yàn)。


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

]]>
分析評價(jià)Linux和WinCE/Windows的優(yōu)缺點(diǎn)http://www.bgl88.cn/bbs/dispbbs.asp?BoardID=9&ID=1379&Page=1wangxinxin2010-11-16 11:27:46正文:

           1.支持多種硬件平臺

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

       2.占有較少的硬件資源

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

       3.高可定制性

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

       4.具有實(shí)時(shí)處理能力

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

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

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

  另外,加快產(chǎn)品開發(fā)時(shí)程也是Win CE 6.0的一大躍進(jìn)。許妙華指出,Visual Studio Visual Studio 2005專業(yè)版將包含在Win CE 6.0的開發(fā)工具中。

  而Platform Builder成為Visual Studio 2005專業(yè)版的外掛程序(plug-in),協(xié)助設(shè)計(jì)人員完成從嵌入式操作系統(tǒng)客制化到應(yīng)用程序開發(fā)等所有工作,縮短產(chǎn)品開發(fā)的上市時(shí)程。

  WinCE 6.0現(xiàn)已開始提供合作伙伴下載。根據(jù)微軟所述,許多廠商將在本季推出基于新的WinCE 6.0的應(yīng)用產(chǎn)品,臺灣地區(qū)的合作伙伴包括了精技電腦、研華科技、威盛電子等。產(chǎn)品內(nèi)容則涵蓋了便攜式導(dǎo)航設(shè)備、媒體播放器、遠(yuǎn)端監(jiān)視設(shè)備、IP網(wǎng)絡(luò)電話與游戲機(jī)等。

  WinCE是微軟針對嵌入式系統(tǒng)產(chǎn)品開發(fā)的精簡型操作系統(tǒng)。微軟約在十年前進(jìn)入這個(gè)領(lǐng)域。所謂的嵌入式產(chǎn)品包括了智能手機(jī)、PDA、機(jī)頂盒(Set- top-box)等具有運(yùn)算能力的設(shè)備。

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

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

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

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

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

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

  微軟亞洲區(qū)嵌入式系統(tǒng)事業(yè)部暨全球ODM Ecosystems資深副總經(jīng)理吳勝雄指出,WinCE嵌入式系統(tǒng)產(chǎn)品平均開發(fā)時(shí)間為8個(gè)月,若以Linux開發(fā)則平均得拉長至14個(gè)月。

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

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

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


開發(fā)硬件平臺:CoolPad系列手機(jī)
開發(fā)軟件平臺:Visual Studio .Net 2005
開發(fā)語言:C#

注意事項(xiàng):先要安裝Visual Studio .Net 2005,然后安裝CoolPad手機(jī)開發(fā)包(以DEV_768_SDK1.00.9.msi為例)。若Visual Studio .Net 2005是在CoolPad手機(jī)開發(fā)包之后安裝的,請?jiān)侔惭b一次CoolPad手機(jī)開發(fā)包,使之集成在Visual Studio .Net 2005中。

環(huán)境搭建好后,請按如下步驟進(jìn)行:

1.        運(yùn)行Visual Studio .Net 2005,如下圖所示
本帖隱藏的內(nèi)容需要回復(fù)才可以瀏覽


2.        點(diǎn)擊File菜單下的Project菜單,如下圖所示:
本帖隱藏的內(nèi)容需要回復(fù)才可以瀏覽


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

4.        點(diǎn)擊Start Debugging按鈕,即下圖所示的綠色三角形按鈕
本帖隱藏的內(nèi)容需要回復(fù)才可以瀏覽


5.        在彈出的Deploy菜單中選中YULONG CoolPAD768:ARMV4I_Release選項(xiàng),然后點(diǎn)擊Deploy按鈕。此時(shí)程序會自動(dòng)部署到手機(jī)上運(yùn)行。
本帖隱藏的內(nèi)容需要回復(fù)才可以瀏覽


注意:第一次運(yùn)行會比較慢,而且可能出現(xiàn)內(nèi)存不足的情況,請將手機(jī)中的存儲內(nèi)存調(diào)大,然后運(yùn)行即可。(手機(jī)中的內(nèi)存調(diào)整在“本機(jī)設(shè)置”中的“系統(tǒng)”選項(xiàng)中)
本帖隱藏的內(nèi)容需要回復(fù)才可以瀏覽
附件: 您需要登錄才可以下載或查看附件。沒有帳號?注冊
]]>
主站蜘蛛池模板: 久久婷婷五月综合色丁香 | 国语黄色片 | 影电影在线观看免费高清完整版 | 香蕉视频网站在线播放 | 久久国产精品999 | 亚洲精美视频 | 亚洲日韩欧美一区二区在线 | 国产欧美自拍 | 欧洲欧美人成免费观看 | 香蕉视频网站在线 | 午夜色婷婷 | 中文字幕一区二区三区四区五区人 | 深爱激动网婷婷狠狠五月 | 中文字幕在线观看亚洲 | 精品视频久久久久 | 国产区精品福利在线观看精品 | 伊人网视频在线观看 | 国产精品成人观看视频国产 | 国内久久 | 午夜日韩视频 | 日本免费二区三区久久 | 在线色网站 | 五月婷婷激情四射 | 一区二区三区高清不卡 | 美女隐私羞羞视频在线观看 | 天堂男人2021av| 羞羞视频入口网站 | 四虎影视最新网站在线播放 | 亚洲国产精品成人久久 | 久久精品免费一区二区视 | 激情综合小说 | 日本欧美视频在线 | 欧美综合第一页 | 亚洲欧洲日本国产 | 婷婷六月久久综合丁香一二 | 不卡久久 | 久久免费高清视频 | 久久久国产精品视频 | 中文字幕99在线精品视频免费看 | 一区二区三区免费在线 | 亚州免费视频 |