• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 74, 文章 - 0, 評(píng)論 - 26, 引用 - 0
            數(shù)據(jù)加載中……

            Windows CE 6.0中斷處理過程 by ningling

            這里我們主要討論的是CE的中斷建立和中斷相應(yīng)的大概流程以及所涉及的代碼位置。這里所講述的,是針對(duì)ARM平臺(tái)的。在CE的中斷處理里面,有一部分工作是CE Kernel完成的,有一部分工作是要由OEM完成的。

            Kernel代碼工作

            ExVector.s:中斷向量定義,里面定義的是armtrap.s的函數(shù)地址

            Armtrap.s:中斷處理定義,最重要是里面的IRQHandler函數(shù),而其中最重要的是CALL OEMInterruptHandler

            Mdarm.c:中斷向量加載

            Kdriver.cNKCallIntChain函數(shù):把IRQ轉(zhuǎn)換為SysIntr,值得留意的是pIntChainTable[],是IRQ所對(duì)應(yīng)的ISR處理程序的入口,其中最主要的是其成員函數(shù)pfnHandlerpfnHandler的填充,是在HookIntChain里面,這個(gè)函數(shù)是ISR在初始化的時(shí)候調(diào)用的。在這個(gè)函數(shù)里面,如果pIntChainTable為空,則返回SYSINTR_CHAIN,如果pIntChainTable[]不為空,則調(diào)用pfnHandler得到一個(gè)sysintr值,然后返回之。

             

            OEM定義工作:Oalintr.cOEMInterruptHandler函數(shù),通過查詢硬件的中斷寄存器,得到硬件IRQ號(hào)。對(duì)于EINT04-23的中斷,通過EINTMASK寄存器,得到相對(duì)應(yīng)的系統(tǒng)IRQ。注意,這里的IRQCE定義的IRQ,是系統(tǒng)硬件IRQ的擴(kuò)展。然后調(diào)用NKCallIntChain看看這個(gè)IRQ是否是一個(gè)ChainInterrupt。如果函數(shù)返回SYSINTR_CHAIN或者返回一個(gè)不合法的sysintr,則通過OALIntrTranslateIrqIRQ轉(zhuǎn)化為sysintr。如果是一個(gè)合法的sysintr,則返回該值。

             

            單一ISRDevice,主要通過OEMInterruptHandler處理,在OEMInterruptHandler沒有定義的IRQ,可以在OAL里面或者驅(qū)動(dòng)的加載里面,通過HookInterrupt函數(shù)進(jìn)行關(guān)聯(lián)。

            多個(gè)ISRDevice,通常這是總線設(shè)備的需求,因?yàn)榭偩€設(shè)備上面通常串有幾個(gè)設(shè)備。這些總線上的設(shè)備,需要有一個(gè)ISR判斷究竟是哪個(gè)設(shè)備發(fā)出的中斷。這個(gè)ISR,是一個(gè)DLL的程序,設(shè)備驅(qū)動(dòng)必須在初始化的時(shí)候通過LoadIntChainHandler(文件名,函數(shù)名,irq)加載這個(gè)DLL程序。LoadIntChainHandler的定義在kdriver.cNKLoadIntChainHandler里面。對(duì)于大多數(shù)的總線設(shè)備,可以利用微軟已經(jīng)寫好的giisr.dll來實(shí)現(xiàn)。giisr的實(shí)現(xiàn)代碼在Public\common\oak\drivers下面。

             

            對(duì)于總線設(shè)備,如果利用GIISR的話,原理如下:

            總線設(shè)備驅(qū)動(dòng)在初始化的時(shí)候,通過LoadIntChainHandler加載GIISR,而加載的時(shí)候,LoadIntChainHandler會(huì)調(diào)用GIISRCreateInstance創(chuàng)建一個(gè)實(shí)例,GIISR會(huì)返回一個(gè)index值給LoadIntChainHandler,以標(biāo)示實(shí)例,LoadIntChainHandler則會(huì)返回一個(gè)Handle給驅(qū)動(dòng),驅(qū)動(dòng)則根據(jù)這個(gè)Handle存取GIISR。得到這個(gè)handle之后,初始化還需要包括從reg表里面讀出相關(guān)的初始化參數(shù),對(duì)GIISR進(jìn)行賦值,譬如Port AddressMask AddressSysIntr等。

             

            驅(qū)動(dòng)程序在初始化的時(shí)候:

            1、創(chuàng)建一個(gè)EventCreateEvent

            2、然后用InterruptInitialize函數(shù)把sysintr和這個(gè)Event相關(guān)聯(lián)

            3Kick-off一個(gè)ThreadIST

            4、這個(gè)Thread最終是WaitForSingleObjectEventID

            具體的例子,可以參閱USBFN的例子:sc2410pdd.cpp里面,UfnPdd_Start函數(shù);

            Published Sunday, June 10, 2007 7:13 PM by ningling

            posted on 2008-12-02 17:00 井泉 閱讀(550) 評(píng)論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            日本福利片国产午夜久久| 久久久久国产一级毛片高清版| 99久久夜色精品国产网站 | 亚洲美日韩Av中文字幕无码久久久妻妇| 青草影院天堂男人久久| 色妞色综合久久夜夜| 久久久久久综合一区中文字幕 | 亚洲精品国产美女久久久| 99久久国产热无码精品免费| 久久99国产综合精品| 无码日韩人妻精品久久蜜桃| 三级三级久久三级久久| 嫩草影院久久国产精品| 热久久这里只有精品| 久久精品成人国产午夜| 久久中文字幕精品| 久久亚洲精品视频| 久久亚洲欧美日本精品| 情人伊人久久综合亚洲| 久久精品亚洲欧美日韩久久| 久久精品午夜一区二区福利| 久久久久成人精品无码| 欧洲国产伦久久久久久久| 久久国产精品无码HDAV| 精品999久久久久久中文字幕| 99久久99这里只有免费的精品| 一本色道久久综合狠狠躁篇| 亚洲国产精品成人AV无码久久综合影院| 久久久久亚洲精品天堂久久久久久| 国内精品综合久久久40p| 亚洲av成人无码久久精品| 久久99精品久久久久久hb无码 | 欧美亚洲国产精品久久蜜芽| 久久国产成人午夜aⅴ影院 | 久久99精品国产99久久| 国产精品成人99久久久久| 国产亚洲精品自在久久| 伊人久久免费视频| 人人狠狠综合久久亚洲婷婷| 亚洲国产成人精品无码久久久久久综合| 2020久久精品亚洲热综合一本|