<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>

    曙海教育集團(tuán)論壇Win CE 專區(qū)WinCE系統(tǒng)定制與驅(qū)動(dòng)開(kāi)發(fā) → wince驅(qū)動(dòng)開(kāi)發(fā)3


      共有7795人關(guān)注過(guò)本帖樹(shù)形打印

    主題:wince驅(qū)動(dòng)開(kāi)發(fā)3

    美女呀,離線,留言給我吧!
    wangxinxin
      1樓 個(gè)性首頁(yè) | 博客 | 信息 | 搜索 | 郵箱 | 主頁(yè) | UC


    加好友 發(fā)短信
    等級(jí):青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊(cè):2010-11-12 11:08:23
    wince驅(qū)動(dòng)開(kāi)發(fā)3  發(fā)帖心情 Post By:2010-11-26 11:16:35

    6、驅(qū)動(dòng)中注意的要點(diǎn)

    1:CE下同名設(shè)備不能大于10

    CE5.0中已經(jīng)沒(méi)有這個(gè)問(wèn)題了,以前的版本可以這樣做:只給上層輸出一個(gè)設(shè)備,然后用一個(gè)IOCTL去打開(kāi)一個(gè)個(gè)的物理設(shè)備這樣就可以做到不受任何限制了。

     

    2:MDD與PDD
    一個(gè)驅(qū)動(dòng)程序通常會(huì)被分成硬件相關(guān)(PDD)與硬件無(wú)關(guān)(MDD)層兩部分。
    當(dāng)然,這種分層不是必須的,只是采用這種分層以后可以少寫很多代碼,因?yàn)槲④浱峁┝撕芏囹?qū)動(dòng)程序的MDD。即使CE中沒(méi)有我們所寫的驅(qū)動(dòng)程序的樣例,采用這種結(jié)構(gòu)以后,當(dāng)需要寫第二個(gè)程序時(shí),就可以重用它的代碼,就可以提高開(kāi)發(fā)效率。

     

    MDD是提供同類型的設(shè)備(比如串口)都會(huì)有的功能,這樣PDD基本上就只有寄存器操作了。

    像串口的中斷處理,Read/Write函數(shù),其大部分代碼都是在MDD中實(shí)現(xiàn)的,不同的串口實(shí)現(xiàn)中只需要提供一些實(shí)際操作寄存器的函數(shù)。不同的驅(qū)動(dòng)程序,其MDD與PDD的接口不盡相同,

     

    3:XXX_Init函數(shù)的返回句柄
    通常,這個(gè)句柄是驅(qū)動(dòng)程序自己保存數(shù)據(jù)的一個(gè)指針,我們?cè)贗nit返回時(shí)告訴上層程序,以后上層調(diào)用其它函數(shù)(例如Open)時(shí),會(huì)將這個(gè)值傳入,這樣,我們就可以訪問(wèn)自己的一些私有數(shù)據(jù)。

    當(dāng)然,也可以返回一個(gè)任意的非0值對(duì)于一個(gè)設(shè)備驅(qū)動(dòng)程序,系統(tǒng)不用的層會(huì)有不同的句柄。我們?cè)赬XX_Init中返回的句柄保存在設(shè)備管理器中,別的程序中應(yīng)該是看不到的,而用CreateFile也會(huì)得到一個(gè)文件句柄,這個(gè)保存在哪我不知道,但和前者是不一樣的。也就是說(shuō)不同層的軟件所關(guān)心的句柄也會(huì)不一樣

    4:DEBUGMSG與RETAILMSG的區(qū)別
    它們都是輸出調(diào)試信息用的,區(qū)別是:
    DEBUGMSG只在DEBUG版中有效,RELEASE版中它被定義成了NULL
    RETAILMSG在DEBUG和RELEASE版中都可以輸出,
    而且DEBUGMSG可以在運(yùn)行時(shí)刻用DEBUZONE控制要不要輸出信息。

     

    在ship build 時(shí),RETAILMSG 和DEBUGMSG都無(wú)效。

     

    5調(diào)試區(qū)與dpCurSettings

    我們都是利用OutpubDebugString函數(shù)來(lái)實(shí)現(xiàn)調(diào)試信息的輸出的,但是由于系統(tǒng)底層的調(diào)試信息非常繁多,如果這樣大量的調(diào)試信息用于實(shí)時(shí)輸出的話一定會(huì)影響到系統(tǒng)的性能和實(shí)時(shí)性,也就影響到了系統(tǒng)的運(yùn)行。如果有一種方式能允許開(kāi)發(fā)人員自己選擇輸出哪些調(diào)試信息,不輸出哪些調(diào)試信息的話,那么就可以讓開(kāi)發(fā)人員只看到關(guān)心的調(diào)試信息,而把諸如鍵盤按鍵、鼠標(biāo)移動(dòng)等無(wú)用的調(diào)試信息隱去,則可以更好的提高開(kāi)發(fā)效率。

     

    調(diào)試區(qū)就是為了解決以上提出的問(wèn)題的,對(duì)某一個(gè)驅(qū)動(dòng)程序,它規(guī)定好自己向外輸出的調(diào)試信息的分類,比如初始化時(shí)的信息,出錯(cuò)時(shí)的信息,釋放時(shí)的信息,激活時(shí)的信息等,然后分成幾個(gè)調(diào)試區(qū),在現(xiàn)有的CE版本中最多允許16個(gè)調(diào)試區(qū)。

     

    開(kāi)發(fā)人員通過(guò)Platform Builder中Target菜單下的CE Debug Zones命令來(lái)決定想要得到哪一個(gè)或哪幾個(gè)調(diào)試區(qū)的信息,在驅(qū)動(dòng)程序中則可以根據(jù)開(kāi)發(fā)人員的選擇來(lái)輸出指定調(diào)試區(qū)的信息。這就是調(diào)試區(qū)大體上的工作原理。

     

    調(diào)試區(qū)的定義,聲明,注冊(cè)及使用。
    在程序中使用調(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,以供集成開(kāi)發(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)被開(kāi)發(fā)人員選中的調(diào)試區(qū)。
    要想使用調(diào)試區(qū),還需要做的最后一件準(zhǔn)備的事情就是在程序中進(jìn)行注冊(cè),也就是在程序啟動(dòng)時(shí)通知集成開(kāi)發(fā)環(huán)境本程序中要使用調(diào)試區(qū),這個(gè)注冊(cè)很簡(jiǎn)單,只要在程序的入口處使用DEBUGREGISTER宏即可,樣例如下:
    DllEntry (
    HANDLE hinstDLL,
    DWORD Op,
    LPVOID lpvReserved
    )
    {
    switch (Op) {

    case DLL_PROCESS_ATTACH :
    DEBUGREGISTER((HINSTANCE)hinstDLL);
    break;
    ……

     


    支持(0中立(0反對(duì)(0單帖管理 | 引用 | 回復(fù) 回到頂部

    返回版面帖子列表

    wince驅(qū)動(dòng)開(kāi)發(fā)3








    簽名
    主站蜘蛛池模板: 中文字幕专区高清在线观看| 四虎影视www四虎免费| 中文字幕中韩乱码亚洲大片 | 天天做人人爱夜夜爽2020毛片 | 色偷偷噜噜噜亚洲男人| 国内精品久久久久久| 久久99精品久久久久久不卡| 樱桃视频直播在线观看免费| 免费黄色毛片视频| 肉伦禁忌小说小可的奶水| 国产精品林美惠子在线观看| 丁香花在线观看免费观看图片| 日本强伦姧人妻一区二区| 亚洲日韩欧洲无码av夜夜摸| 男人的天堂网在线| 国产免费卡一卡三卡乱码| 91精品国产肉丝高跟在线| 女博士梦莹全篇完整小说| 久久午夜夜伦鲁鲁片无码免费| 树林里狠狠地撞击着h| 人妻中文字幕无码专区| 精品久久久久久久久久中文字幕| 国产喷水女王在线播放| 69SEX久久精品国产麻豆| 壮汉紫黑粗大好深用力| 中文字幕免费在线| 日本乱码一卡二卡三卡永久| 亚洲国产综合精品中文字幕 | 自拍偷自拍亚洲精品播放| 国产精品乳摇在线播放| 久久99精品久久久久子伦| 日韩欧美亚洲视频| 免费又黄又爽1000禁片| 草莓视频在线免费 | 99热在线精品国产观看| 娇妻借朋友高h繁交h| 久久精品亚洲视频| 暖暖在线日本免费中文| 亚洲第一黄色网| 狠狠综合久久久久综合小说网 | 最美情侣中文字幕电影|