• <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, 評論 - 26, 引用 - 0
            數據加載中……

            Windows CE 6.0中斷處理過程 by ningling

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

            Kernel代碼工作

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

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

            Mdarm.c:中斷向量加載

            Kdriver.cNKCallIntChain函數:把IRQ轉換為SysIntr,值得留意的是pIntChainTable[],是IRQ所對應的ISR處理程序的入口,其中最主要的是其成員函數pfnHandlerpfnHandler的填充,是在HookIntChain里面,這個函數是ISR在初始化的時候調用的。在這個函數里面,如果pIntChainTable為空,則返回SYSINTR_CHAIN,如果pIntChainTable[]不為空,則調用pfnHandler得到一個sysintr值,然后返回之。

             

            OEM定義工作:Oalintr.cOEMInterruptHandler函數,通過查詢硬件的中斷寄存器,得到硬件IRQ號。對于EINT04-23的中斷,通過EINTMASK寄存器,得到相對應的系統IRQ。注意,這里的IRQCE定義的IRQ,是系統硬件IRQ的擴展。然后調用NKCallIntChain看看這個IRQ是否是一個ChainInterrupt。如果函數返回SYSINTR_CHAIN或者返回一個不合法的sysintr,則通過OALIntrTranslateIrqIRQ轉化為sysintr。如果是一個合法的sysintr,則返回該值。

             

            單一ISRDevice,主要通過OEMInterruptHandler處理,在OEMInterruptHandler沒有定義的IRQ,可以在OAL里面或者驅動的加載里面,通過HookInterrupt函數進行關聯。

            多個ISRDevice,通常這是總線設備的需求,因為總線設備上面通常串有幾個設備。這些總線上的設備,需要有一個ISR判斷究竟是哪個設備發出的中斷。這個ISR,是一個DLL的程序,設備驅動必須在初始化的時候通過LoadIntChainHandler(文件名,函數名,irq)加載這個DLL程序。LoadIntChainHandler的定義在kdriver.cNKLoadIntChainHandler里面。對于大多數的總線設備,可以利用微軟已經寫好的giisr.dll來實現。giisr的實現代碼在Public\common\oak\drivers下面。

             

            對于總線設備,如果利用GIISR的話,原理如下:

            總線設備驅動在初始化的時候,通過LoadIntChainHandler加載GIISR,而加載的時候,LoadIntChainHandler會調用GIISRCreateInstance創建一個實例,GIISR會返回一個index值給LoadIntChainHandler,以標示實例,LoadIntChainHandler則會返回一個Handle給驅動,驅動則根據這個Handle存取GIISR。得到這個handle之后,初始化還需要包括從reg表里面讀出相關的初始化參數,對GIISR進行賦值,譬如Port AddressMask AddressSysIntr等。

             

            驅動程序在初始化的時候:

            1、創建一個EventCreateEvent

            2、然后用InterruptInitialize函數把sysintr和這個Event相關聯

            3Kick-off一個ThreadIST

            4、這個Thread最終是WaitForSingleObjectEventID

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

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

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

            久久精品国产亚洲一区二区三区| 久久久久国色AV免费看图片| 久久综合九色综合网站| 亚洲精品乱码久久久久久按摩| 国内精品久久国产| 久久久久国产精品熟女影院 | 色欲综合久久躁天天躁蜜桃| 国产成年无码久久久久毛片| 狠狠精品干练久久久无码中文字幕 | 狠狠88综合久久久久综合网| 久久国产精品二国产精品| 色综合久久综合中文综合网| 久久精品无码专区免费 | 国产成人无码精品久久久久免费| 久久夜色精品国产噜噜亚洲a| 97久久香蕉国产线看观看| AV无码久久久久不卡蜜桃| 午夜精品久久影院蜜桃| 久久久久亚洲精品中文字幕 | 久久精品夜夜夜夜夜久久| 国产免费久久精品99re丫y| 亚洲精品乱码久久久久久不卡| 国产精品日韩欧美久久综合| 国产精品青草久久久久福利99| 2021国产成人精品久久| 久久播电影网| 亚洲人成网亚洲欧洲无码久久| 久久精品国产亚洲AV电影| 久久国产精品成人片免费| 久久ZYZ资源站无码中文动漫| 狠狠色婷婷久久一区二区三区| 久久久精品一区二区三区| 激情久久久久久久久久| 亚洲精品午夜国产VA久久成人| 国内精品伊人久久久久av一坑 | 亚洲欧美久久久久9999| 亚洲va久久久噜噜噜久久男同| 国产精品久久久久久久午夜片| 一97日本道伊人久久综合影院| 韩国免费A级毛片久久| 久久只有这精品99|