日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

WinCE 5.0邊練邊學(xué)(5)(6)

出處:互聯(lián)網(wǎng)    發(fā)布于:2011-09-03 08:14:47

 
   工欲善其事,必先利其器
 
 對(duì)于實(shí)時(shí)系統(tǒng),如何調(diào)試是一個(gè)很難解決的問題,包括對(duì)系統(tǒng)內(nèi)核的調(diào)試,對(duì)驅(qū)動(dòng)程序的調(diào)試,對(duì)應(yīng)用程序的調(diào)試等。對(duì)于應(yīng)用程序,通常各集成開發(fā)環(huán)境都提供了常規(guī)的單步跟蹤等調(diào)試手段。而對(duì)于另兩個(gè)的調(diào)試,Platform Builder除了為我們提供了常規(guī)的斷點(diǎn)跟蹤等手段以外,還和系統(tǒng)的源程序配合使用了一種新的調(diào)試手段——Debug Zones調(diào)試區(qū)。
 
  通常,我們都是利用OutpubDebugString函數(shù)來實(shí)現(xiàn)調(diào)試信息的輸出的,但是由于系統(tǒng)底層的調(diào)試信息非常繁多,如果這樣大量的調(diào)試信息用于實(shí)時(shí)輸出的話一定會(huì)影響到系統(tǒng)的性能和實(shí)時(shí)性,也就影響到了系統(tǒng)的運(yùn)行。如果有一種方式能允許開發(fā)人員自己選擇輸出哪些調(diào)試信息,不輸出哪些調(diào)試信息的話,那么就可以讓開發(fā)人員只看到關(guān)心的調(diào)試信息,而把諸如鍵盤按鍵、鼠標(biāo)移動(dòng)等無用的調(diào)試信息隱去,則可以更好的提高開發(fā)效率,迅速找到問題所在。
 

  在程序中使用調(diào)試區(qū)之前必須先定義它們,一個(gè)程序的16個(gè)調(diào)試區(qū)編號(hào)分別為0-15。代碼樣例如下所示:

  #ifdef DEBUG

  //

  // For debug builds, use the real zones.

  //

  #define ZONE_TEST DEBUGZONE(0)

  #define ZONE_PARAMS DEBUGZONE(1)

  #define ZONE_VERBOSE DEBUGZONE(2)

  ……

  #define ZONE_WARN DEBUGZONE(14)

  #define ZONE_ERROR DEBUGZONE(15)

  #else

  //

  // For retail builds, use forced messages based on the zones turned on below.

  //

  #define ZONE_TEST 0

  #define ZONE_PARAMS 0

  #define ZONE_VERBOSE 0

  ……

  #define ZONE_WARN 0

  #define ZONE_ERROR 0

  #endif

  這樣,就可以程序的DEBUG版本中使用調(diào)試區(qū)了,而在RELEASE版本中則將其全部定義為0,調(diào)試信息即不再輸出。

  在程序中,除了以上的定義以外,還要聲明幾個(gè)專用的調(diào)試信息輸出函數(shù),這些函數(shù)與OutputDebugString函數(shù)的區(qū)別就在于在調(diào)用時(shí)需要指定對(duì)應(yīng)的調(diào)試區(qū),這些函數(shù)以及以上用到的DEBUGZONE宏的定義都在DbgApi.h頭文件中,因此只要在源程序中包含此頭文件即可。除此以外,還需要一個(gè)全局的DEBPARAM類型的變量命名為dpCurSettings,以供集成開發(fā)環(huán)境和調(diào)試信息輸出函數(shù)使用。其代碼樣例如下:

  #ifdef DEBUG

  DBGPARAM dpCurSettings = {

  TEXT("WaveDriver"), {

  TEXT("Test") // 0

  ,TEXT("Params") // 1

  ,TEXT("Verbose") // 2

  ,TEXT("Interrupt") // 3

  ,TEXT("WODM") // 4

  ,TEXT("WIDM") // 5

  ,TEXT("PDD") // 6

  ,TEXT("MDD") // 7

  ,TEXT("Regs") // 8

  ,TEXT("Misc") // 9

  ,TEXT("Init") // 10

  ,TEXT("IOcontrol") // 11

  ,TEXT("Alloc") // 12

  ,TEXT("Function") // 13

  ,TEXT("Warning") // 14

  ,TEXT("Error") // 15

  }

  ,

  (1 《 15) // Errors

  | (1 《 14) // Warnings

  };

  #endif

  此例中還把ERROR和WARN調(diào)試區(qū)作為默認(rèn)被開發(fā)人員選中的調(diào)試區(qū)。

  要想使用調(diào)試區(qū),還需要做的一件準(zhǔn)備的事情就是在程序中進(jìn)行注冊(cè),也就是在程序啟動(dòng)時(shí)通知集成開發(fā)環(huán)境本程序中要使用調(diào)試區(qū),這個(gè)注冊(cè)很簡(jiǎn)單,只要在程序的入口處使用DEBUGREGISTER宏即可,樣例如下:

  DllEntry (

  HANDLE hinstDLL,

  DWORD Op,

  LPVOID lpvReserved

 ?。?/P>

  {

  switch (Op) {

  case DLL_PROCESS_ATTACH :

  DEBUGREGISTER((HINSTANCE)hinstDLL);

  break;

  ……

  至于調(diào)試區(qū)的使用,完全是幾個(gè)宏的使用而已,我想做程序的人都會(huì)用的,常用的宏如下:

  DEBUGMSG(),DEBUGLED(),RETAILMSG(),RETAILLED(),ERRORMSG(),DEBUGCHK()

  好了,調(diào)試區(qū)就概要的說了這么多,如此復(fù)雜的機(jī)制在自己的程序中寫起來是煩瑣了點(diǎn),不過如果你需要的話,可以從CE現(xiàn)有的例程序中復(fù)制過來,這樣就省了很多麻煩事,也不會(huì)出錯(cuò)。下圖是在PB中使用調(diào)試區(qū)的截圖,當(dāng)選中某一個(gè)調(diào)試區(qū)后,如果該調(diào)試區(qū)有調(diào)試信息則會(huì)在DEBUG窗口輸出的。


 

  Windows CE的 中斷響應(yīng)時(shí)間是針對(duì)鎖存在內(nèi)存上的線程 (當(dāng)內(nèi)存響應(yīng)不存在時(shí))。這使得計(jì)算差事件響應(yīng)成為可能——中斷服務(wù)程序(ISR) 開始和中斷服務(wù)線程(IST)開始D的總時(shí)間,直到中斷處理的總時(shí)間能夠通ISR 和 IST 中所需時(shí)間計(jì)算決定。

  中斷測(cè)試應(yīng)用軟件Intrtime.exe,在Windows CE標(biāo)準(zhǔn)版本收集中斷分時(shí)延遲信息,應(yīng)用軟件在測(cè)試中控制系統(tǒng)時(shí)間。因此,當(dāng)系統(tǒng)需要時(shí)間控制器時(shí),是不合適使用的。例如,此應(yīng)用程序不能與內(nèi)核 instrumented版本一起使用,因?yàn)樗残枰獣r(shí)間控制。

   
   

 

    我們分布來解釋上圖中的流程:


  1、硬件設(shè)備向Kernel發(fā)送中斷異常的代碼,如果檢測(cè)到這個(gè)中斷異常,就會(huì)被Kernel層的異常處理所截獲;

  2、中斷服務(wù)調(diào)度程序會(huì)調(diào)用OAL例程中的OEMInterruptDisable函數(shù),這個(gè)函數(shù)會(huì)通知硬件在處理完這一中斷前關(guān)閉特殊的中斷,但其他的中斷仍然處于開放狀態(tài);

  3、中斷服務(wù)例程ISR被調(diào)用以決定如何來處理這一中斷;

  4、Kernel接收到ISR的返回值以得知如何處理這一中斷。它的響應(yīng)結(jié)果之一是忽略掉這一中斷不作處理(SYSINTR_NOP),另一結(jié)果是準(zhǔn)備執(zhí)行IST。

  5、Kernel引發(fā)中斷服務(wù)調(diào)度程序來喚醒中斷服務(wù)線程去工作。IST是常規(guī)的Win32線程,一旦啟動(dòng)后,它會(huì)創(chuàng)建必要的EVENT然后等待該EVENT被激發(fā)。中斷服務(wù)調(diào)度通過調(diào)用PulseEvent函數(shù)來激發(fā)EVENT,從而喚醒IST線程運(yùn)行;

  6、當(dāng)喚醒以后,IST會(huì)對(duì)中斷進(jìn)行必要的處理如將數(shù)據(jù)移動(dòng)到緩沖區(qū)或其他有意義的事;

  7、如果需要的話,IST會(huì)借助于I/O支持例程訪問硬件設(shè)備;

  8、當(dāng)IST處理完成后,它會(huì)調(diào)用InterruptDone函數(shù)通知Kernel;

  9、Kernel調(diào)用OEMInterruptDone函數(shù)完成此次中斷的處理過程,OAL例程通知硬件設(shè)備重新啟用中斷。

  以上就是中斷在CE中簡(jiǎn)要的處理過程。這其中還涉及到幾個(gè)函數(shù)的使用,包括:

  1、供OAL調(diào)用的ISR函數(shù)

  HookInterrupt函數(shù)在OEMInit函數(shù)中被調(diào)用以關(guān)聯(lián)IRQ和ISR;

  UnhookInterrupt函數(shù)用來終止IRQ和ISR的關(guān)聯(lián)。

  2、供驅(qū)動(dòng)程序調(diào)用的IST函數(shù)

  InterruptInitialize函數(shù)用來將EVENT對(duì)象和邏輯中斷號(hào)關(guān)聯(lián)并允許中斷;

  InterruptDone函數(shù)用來通知中斷處理的結(jié)束;

  InterruptDisable函數(shù)被驅(qū)動(dòng)程序調(diào)用以關(guān)閉中斷同時(shí)取消被InterruptInitialize初始化的EVENT對(duì)象。

  下面我們?cè)俜謩e來看一下重要的兩部分,ISR和IST。

  ISR屬于OAL層,通常是用匯編語言編寫的,它可以將CPU寄存器中的數(shù)據(jù)移動(dòng)到內(nèi)存緩沖區(qū)中,但是它不能做更多的工作,其中一個(gè)原因就是它不能訪問到用戶態(tài)的存儲(chǔ)區(qū),它要把這些工作交給IST來完成。它做的另一項(xiàng)工作是進(jìn)行物理中斷號(hào)和邏輯中斷號(hào)的映射。一個(gè)物理設(shè)備比如鍵盤在一種平臺(tái)上可能產(chǎn)生4號(hào)中斷,在另一種平臺(tái)上可能產(chǎn)生15號(hào)中斷,經(jīng)過ISR以后,它就會(huì)把這一物理中斷轉(zhuǎn)換成CE中標(biāo)準(zhǔn)的SYSINTR_KEYBOARD邏輯中斷。Kernel就會(huì)根據(jù)這個(gè)邏輯中斷值找到對(duì)應(yīng)的EVENT從而喚醒IST。

  ISR 響應(yīng)通用公式定義如下:   ISR開始時(shí)間 = value1 + dISR_Current + sum(dISR_Higher)   value1=由內(nèi)核處理過程獲得響應(yīng)值    dISR_Current=中斷到達(dá)時(shí)程序中 ISR 持續(xù)時(shí)間。這個(gè)值范圍由0到系統(tǒng)中長(zhǎng)的 ISR 持續(xù)時(shí)間    sum(dISR_Higher)=所有在 ISR 開始前的較ISRS 持續(xù)時(shí)間總和,即在時(shí)間 vahe1+dISR-cumeneu間到達(dá)的中斷   例如,考慮一個(gè)擁有關(guān)鍵優(yōu)先權(quán) ISR 的嵌入式系統(tǒng),因?yàn)?ISR 被設(shè)成,這有樣 ISRS dISR-Higher 值為0。當(dāng)沒有其它 ISRS 響應(yīng),在程序中,即為value1 響應(yīng)即為value1加系統(tǒng)中長(zhǎng) ISR 周期,當(dāng)中斷到達(dá)時(shí),正是系統(tǒng)中長(zhǎng)的 ISR 開始執(zhí)行。   IST 響應(yīng)周期定義如下:   IST開始時(shí)間 = value2 + sum(dIST) + sum(dISR)    value2=由內(nèi)核處理的響應(yīng)值   sum(dIST)=所有的出現(xiàn)在 ISR 和 IST ,開始的優(yōu)先級(jí) ISTS 和線程上下文轉(zhuǎn)換時(shí)間總和。   sum(dISR)=在中斷(?) ISR 和它的 IST 之間運(yùn)行的其它 ISRS 持續(xù)時(shí)間總和。

  ISR有兩種,一種是單ISR模式, 即全局只有一個(gè)ISR,它適用于不支持多中斷的CPU,在這種情況下,OAL會(huì)提供一個(gè)OEMInterruptHandler的命令I(lǐng)SR。另一種是多ISR模式,即CPU有多個(gè)硬件中斷的情況,OAL通過HookInterrupt函數(shù)為每一個(gè)中斷調(diào)用ISR。

  IST是驅(qū)動(dòng)程序中的用戶態(tài)線程,它來執(zhí)行中斷的處理工作。在啟動(dòng)后它會(huì)空閑等待EVENT的激發(fā)狀態(tài),激發(fā)后處理真正的中斷處理過程,調(diào)用InterruptDone函數(shù)標(biāo)識(shí)中斷處理完成。它通常通過CeSetThreadPriority函數(shù)設(shè)置在較高的優(yōu)先級(jí)狀態(tài)。

  以上是對(duì)中斷的簡(jiǎn)要了解,在WINCE5的驅(qū)動(dòng)程序中,很大的變化就是把很多過程化的東西變成了面向?qū)ο蟮姆绞?,即進(jìn)行了以類為基礎(chǔ)的封裝,這樣代碼變得非常層次化,如果你想了解以上這些中斷在具體驅(qū)動(dòng)程序中的實(shí)現(xiàn),建議還是先來看看CE4中的代碼,似乎更明顯一些。

  KeybdIstLoop(

  PKEYBD_IST pKeybdIst

 ?。?/P>

  {

  SETFNAME(_T("KeybdIstLoop"));

  UINT32 rguiScanCode[16];

  BOOL rgfKeyUp[16];

  UINT cEvents;

  DEBUGCHK(pKeybdIst->hevInterrupt != NULL);

  DEBUGCHK(pKeybdIst->pfnGetKeybdEvent != NULL);

  DEBUGCHK(pKeybdIst->pfnKeybdEvent != NULL);

  SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);

  wait_for_keybd_interrupt:

  if (WaitForSingleObject(pKeybdIst->hevInterrupt, INFINITE) == WAIT_OBJECT_0)

  {

  cEvents = (*pKeybdIst->pfnGetKeybdEvent)

 ?。╬KeybdIst->uiPddId, rguiScanCode, rgfKeyUp);

  for (UINT iEvent = 0; iEvent < cEvents; iEvent) {

 ?。?pKeybdIst->pfnKeybdEvent)(pKeybdIst->uiPddId,

  rguiScanCode[iEvent], rgfKeyUp[iEvent]);

  }

  // cEvents could be 0 if this was a partial scan code, like 0xE0

  InterruptDone(pKeybdIst->dwSysIntr_Keybd);

  }

  goto wait_for_keybd_interrupt;

  ERRORMSG(1, (TEXT("KeybdIstLoop: Keyboard driver thread terminating.\r\n")));

  return TRUE;

  }

    這次我們了解到了內(nèi)置的設(shè)備驅(qū)動(dòng)程序的架構(gòu),因?yàn)楦鞣N不同類別的內(nèi)置驅(qū)動(dòng)程序要實(shí)現(xiàn)不同的接口,因此在實(shí)現(xiàn)起來就非常有針對(duì)性,也不利于演示。

    關(guān)于WinCE 5.0

  Windows CE為微軟針對(duì)個(gè)人電腦以外的電腦產(chǎn)品所研發(fā)的嵌入式操作系統(tǒng),而CE縮寫的來源則有Customer Embedded,Compact Edition, Consumer Electronics等等。  目前的Windows CE為Windows CE 5.0,為微軟的。NET家族成員,除100%兼容于Windows CE外,并強(qiáng)化許多功能;在開發(fā)環(huán)境上,微軟提供兼容于。NET Framework的開發(fā)元件:。NET Compact Framework,讓正在學(xué)習(xí)。NET或已擁有。NET程序開發(fā)技術(shù)的開發(fā)人員能迅速而順利的在搭載Windows CE .NET系統(tǒng)的裝置上開發(fā)應(yīng)用程序?! ∮糜谡粕想娔XPocket PC上的Windows CE系統(tǒng)稱為Windows Mobile,目前的版本為Windows Mobile 5.0,代號(hào)為Magneto。簡(jiǎn)單地說,Windows CE就是基于掌上型電腦類的電子設(shè)備操作系統(tǒng)。其中CE中的C代表袖珍(Compact)、消費(fèi)(Consumer)、通訊能力(Connectivity)和伴侶(Companion);E代表電子產(chǎn)品(Electronics),好了,已經(jīng)寫了不少了,唉,寫這東西真是費(fèi)時(shí)啊,不說了,希望我們能一起獲得更多的知識(shí)。


  

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫電子市場(chǎng)網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號(hào)碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時(shí)間周一至周五
9:00-17:30

關(guān)注官方微信號(hào),
第一時(shí)間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動(dòng)力!意見一經(jīng)采納,將有感恩紅包奉上哦!