新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 中斷代碼結構比較之WinCE4.2 VS WinCE5.0

        中斷代碼結構比較之WinCE4.2 VS WinCE5.0

        作者: 時間:2011-02-24 來源:網絡 收藏
        現在項目要從wince4.2下port到wince5.0下,今天將sd卡的驅動加到wince5下。用的是現有的也就是wince4.2下的驅動程序,幾個dll文件:SDBusDriver.dll;SDCSDCard.dll;SDMemory.dll。這個工作主要就是將相應的中斷加上就好了。
        下面進入正題。4.2下的中斷:InterruptInitialize(具體的驅動中注冊中斷與事件)->SC_InterruptInitialize(系統的函數,可以根據privatewinceoscoreosnkkernelkwin32.c中的const PFNVOID Win32Methods[]數組得知這是一個系統函數。這一步為猜測,該函數在privatewinceoscoreosnkkernelintrapi.c中實現。enable中斷-通過調用下面的函數,之后將相應的事件放入中斷事件隊列)->DoInterruptEnable(在privatewinceoscoreosnkkernelintrapi.c中實現,先調用pfnOEMTranslateSysIntr映射一下,不過我沒有找到這個函數指針的原型。之后才是OEMInterruptEnable)->OEMInterruptEnable(在platformxxxkernelhalcfw.c中,地球人都知道。在這個文件中有個static void OEMInitInterrupts(void),是在oeminit中被調用的,差點被忽悠了。)這只是enable(也包含初始化),相應的disable和done也在相應的文件中實現。可能用4.2用多了,感覺這些中斷的處理一氣呵成,很容易理解,就是修改或者增加比較麻煩。要分別處理OEMInterruptXXX中相應的各個中斷。
        5.0下的中斷:感覺上就一個字“亂”,主要是這些代碼分別放在不同的地方,或許這樣更合理化吧,誰知道MS怎么想的。主要分布在以下幾個地方:(A1)platformcommonsrccommonintr;(A2)platformcommonsrcxxx(type of cpu)yyy(intel or samsung or ...)zzzintr;(A3)platformzzzsrckerneloalintr.c。
        5.0下中斷初始化流程:從時間上來看先是OEMInit(oalinit.c)->OALIntrInit(A2中實現)->BSPIntrInit(A3中實現,這個地方比較關鍵了,因為要添加或修改中斷就要在這里來做,主要實現SYSINTR_XXX與IRQ_XXX的映射)。OK中斷初始化完畢。
        5.0下中斷的enable流程:在5.0下面沒有找到SC_InterruptInitialize,或者類似的實現,不過我想5.0下面的應該和4.2下面的一樣。由驅動的InterruptInitialize最終調用到OEMInterruptEnable(在A1commonoem.c中實現)->OALIntrEnableIrqs(在A3中實現)->BSPIntrEnableIrq(在A3中實現)。至此enable完成。對應的disbale和done也是在相應的文件中實現。
        從名字上也可以看出來A1提供了一個對內核開放的中斷層,由它再去調用對應的oal層的代碼A2,A2再在其中調用A3中的代碼;則A3中最主要的就是提供一個給程序員注冊的一個接口BSPIntrInit。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 衡东县| 大安市| 阿鲁科尔沁旗| 贵南县| 琼海市| 清水河县| 仁怀市| 北辰区| 黄骅市| 古交市| 图们市| 通许县| 沂水县| 苏尼特左旗| 青冈县| 伊宁县| 昆明市| 庆元县| 邮箱| 荆州市| 新绛县| 夹江县| 绥棱县| 洱源县| 锡林郭勒盟| 潍坊市| 遂宁市| 澜沧| 兰西县| 平舆县| 阿坝县| 东乡族自治县| 新乡市| 彭山县| 双柏县| 湟中县| 石泉县| 东乌| 民乐县| 二连浩特市| 延津县|