青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 74, 文章 - 0, 評論 - 26, 引用 - 0
數據加載中……

wince6.0移植之oal 轉

[克隆BSP]

Clone一個BSP.

WinCE6.0安裝armv4i架構后,里面提供了一個名字為DeviceEmulatorBSP. 這個BSPs3c2410BSP.我的是s3c2440a,就克隆這個吧.

 


[移植OAL]

WinCE5.0OAL是編譯成為一個靜態庫oal.lib,然后與內核nk.lib靜態編譯成kernel.exe,也就是nk.exe. WinCE6.0OALkernel中剝離出來單獨編譯成為oal.exe,內核則編譯成了Kernel.dll. 分離的代價是不能再直接使用相互的資源了,即相互間的全局變量和函數不能直接訪問了. OEMGLOBAL NKGLOBAL2個結構體充當了OALKernel的接口橋梁. 分離的好處是更方便內核獨立升級(嗯哼~ 這在將來會發生么?設備的架構可是千差萬別的.我想替內核升級最有可能的還是OEMs,不是MS),不過另外一個好處是接口更清晰了,內核會需要哪些OEM函數顯得更直觀明了.

內核的啟動和原來略有不同了,簡單回顧WinCE5.0的內核啟動過程:

[NK.exe=Kern.exe]

StartUp()                      [ OAL入口點]

     KernelStart()                  [ kernel入口點]

              ArmInit()

                         OEMInitDebugSerial()

                 OEMInit()

           KernelInit()

               HeapInit()

               InitMemoryPool()

               ProcInit()

               SchedInit()

             FirstSchedule()                             

 

 
 

 

 

 

 

 

 

 

 

 

 

 

 


下面是WinCE6.0的內核啟動過程:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


OAL不能調用內核的KernelStart()函數了, 所以自己要實現一個KernelStart() (nkldr.lib替我們完成了這個, nkldr.lib鏈接到OAL),調用nkldr.lib中的KernelStart().然后執行的ARMInit()函數有一個很重要的任務,它將位于OALOEMinitGlobals()函數指針賦值到Kdata, 后面內核需要這個指針.接下來根據Kdata找到并跳轉到內核kernel.dll的入口點NKStartup().

Kernel.dll開始執行NKStartUp(),首先要把和OAL的橋梁打通.也就是把內核的NKGlobal數據結構指針交給OAL,并且獲得OALOEMGlobal的數據結構指針. 怎么實現的? 內核根據Kdata找到OAL中一個函數OEMInitGlobals()  還記得嗎,前面說到OALARMInit()曾經鄭重的把OEMInitGlobals函數指針賦值給了Kdata,就是為了這一天... 然后,NKGlobal指針作為參數執行這個函數, 這個函數返回OALOEMGlobal的指針.(嗯哼~ OAL要實現OEMInitGlobals(), oemmain.lib替我們完成了這個,oemmain.lib鏈接到OAL).

這個Kdata是個什么玩意? 它是內核數據結構, 簡單理解成共享內存好了, oal kernel都可訪問到.再往后沒啥好說了,內核可以訪問OAL,痛快的調用OEM函數,和以前WinCE5.0差不多. 最后調用KernelStart(),這回這個函數可是在內核里面了,WinCE6.0起來了……

這個流程和WinCE5.0有點點差別.都是因為OALkernel分離了.

[編譯OAL]

空談了這么久,來做實質性的工作吧,開始編譯WinCE6.0OAL. 微軟希望它的設計使得移植OAL時候盡可能少工作量,所以oal.exe2個步驟來實現.第一步:編譯oal.lib.第二步:編譯oal.exe. 第一步的oal.lib可以就是原來版本的,你拷貝原來的oal目錄代碼到OALLIB目錄編譯一個oal.lib.關鍵是第二步,原來在WinCE5.0時候,oal.lib+nk.lib編譯成了kern.exe,然后改名成nk.exe.現在,要把oal+nkstub.lib,編譯成oal.exe.nk.lib也不是說不要就可以直接不要的.在編譯oal.lib時候可是大量使用了nk.lib的東東. 你不會想全文重新改變函數和變量的調用形式吧? ok,nkstub.lib鏈接上.這么一來, OALEXE目錄下的SOURCES文件里面,4個庫被添加進來.

  TARGETLIBS= oal.lib oemmain.lib nkldr.lib nkstub.lib ……(路徑省略)

Nkldr.liboemmain.lib是干嗎的?回溯前面的啟動過程吧. nkldr.lib提供了KernelStart()的實現, oemmain.lib提供了OEMInitGlobals()的實現.當然還有更多的,不羅列了.

[定制OAL]

沒有oal.lib咋辦?做一個吧……前面提到OALKernel分離,使得接口更加明顯了,kernel到底需要OEMs提供哪些函數,可以參照著oemglobal.h文件里面OEMGLOBAL結構體來完成.并且在oemglobal.c里面對這個結構體初始化.這個文件位于oemmain.lib.發揚愚公移山的精神,我來抽絲撥繭一下,下面根據我的2440來分析最重要的必須的幾個接口:

[Init相關接口]

要提供OEMInit(), OEMInitDebugSerial(),

OEMInit()函數,建立一個init.c,然后實現這個函數.

OEMInitDebugSerial()放到下面debug.c中實現.

[Debug相關接口]

OEMWriteDebugString

OEMInitDebugSerial

OEMWriteDebugByte

OEMReadDebugByte

OEMWriteDebugLED

PQOALoal_other.lib提供了OEMWriteDebugString(),

OALLIB下創建debug.c ,然后實現OEMInitDebugSerial, OEMWriteDebugByte, OEMReadDebugByte, OEMWriteDebugLED4個函數.

[Cache相關接口]

需要提供OEMCacheRangeFlush, 根據自己的架構去已有的PQOAL找吧,我的是oal_cache_arm920t.lib

[Time相關接口]

需要提供

InitClock

OEMGetRealTime

OEMSetRealTime

OEMSetAlarmTime

OEMQueryPerfCounter

OEMQueryPerfFreq

OEMGetTickCount

 

InitClock,這個功能已經廢除了, 相關功能被移到OEMPowerOff.所以可以實現一個空函數,在初始化OemGlobal時候,把這個指針賦值RetuanFalse()函數也是一樣的效果.OEMGetRealTime ,OEMSetRealTime是設置讀取rtc的日期功能.OEMSetAlarmTime是設置rtc的報警時刻,找到oal_rtc_s3c2440a.lib

OEMQueryPerfCounter,OEMQueryPerfFreq是提供更高精度時間的查詢,

OEMGetTickCount返回當前CurMSec,系統運行了多少毫秒.oal_time.lib中已經有實現.特別強調的是,這個函數在WinCE5.0里面是SC_GetTickCount.需要把名字改了.這個是OAL的一個區別.

[Scheduler相關接口]

       OEMIdle, OEMNotifyThreadExit, OEMNotifyIntrOccurs, OEMUpdateReschedTime, 一個變量DefaultThreadQuantum.

[power相關接口]

OEMPowerOff, 這個還要說啥, 掛起時候會執行這個函數. PQOALoal_power_s3c2440a.lib已經幫忙實現了最基礎的工作,會調用BSPPowerOff來完成平臺相關的動作,建立一個文件power.c來實現這個BSPPowerOff.

                           

[DRAM相關接口]

       OEMGetExtensionDRAM, OEMEnumExtensionDRAM, CalcFSPages, 變量MainMemoryEndAddress

這組函數詢問擴展RAM的情況,如果OEMEnumExtensionDRAM函數提供了, 就執行這個函數,否則執行OEMGetExtensionDRAM, CalcFSPages計算pages, 這個功能內核自己實現了,已經不要了,指向一個空函數即可.

[interrupt相關接口]

OEMInterruptEnable, OEMInterruptDisable, OEMInterruptDone,

OEMIniterruptMask,OEMInterruptHandler

       基本工作PQOAL已經做好了,PQOAL下面幾個接口完成平臺相關工作,BSPIntrInit, BSPIntrRequestIrq, BSPINtrEnableIrq, BSPIntrDisableIrq, BSPIntrDoneIrq, BSPIntrActiveIrq.最后一個OEMInterruptHandler就是系統ISR, 將物理irq轉換成邏輯中斷SYSINTR_XXX.

[other ]

       OEMIoControl .PQOAL里面已經實現了這個功能.如果OEMs要添加新的控制命令, 建立一個ioctl.c,定義一個全局數組g_oalIoCtlTable, 然后往數組里面填入命令字和對應命令執行的函數的名稱.這個對應命令的執行函數當然要自己實現了. 驅動或者應用使用KernelIOControl這個api時候,相應命令的函數就會執行.

[總結]

1.WinCE6.0不只是將OALkernel分離.還將kitl也分離成為了kitl.dll. 所以,OAL也不能直接使用kitl的資源. 首先把kitl.ckitl相關代碼從OAL里面給放到kitl目錄去.然后在OEMInit中不能調用OALKitlStart(),KITLIoctl(IOCTL_KITL_STARTUP, NULL, 0, NULL, 0, NULL);這一句來替代.

2.OAL需要使用的數據結構定義,和外部函數聲明都在頭文件nkexport.h.可以在oal.hinclude這個nkexport.h頭文件.

       3. PQOALoal_log庫有了變化,如果使用了這個庫的要注意,它不在使用g_oalLogMask這個全局變量了.

4. timertimer_dvs目錄下的watchdog.c文件和nkexport.h中重復定義了pfnOEMRefreshWatchDog,dwOemWatchDogPeriod.一個解決辦法是去掉watchdog.c.反正也可以不使用這個接口.默認傳過去的是空接口ReturnFalse()

5. 編譯smflash.dll出錯,需要fal.lib一起編譯成為smflash.dll. fal的源代碼位于private\winceos\driver\msflash\src.這個fal.lib.好像和以前的不一樣.從錯誤信息中觀察,好像多出來2個接口.fmd.cpp里面增加這2個接口:

LPVOID FMDHOOK_HookInterface(PFMDInterface pInterface)

{ return (LPVOID) pInterface;}

Void FMDHOOK_UnhookInterface(LPVOID pContext, FMDInterface *pInterface){}

至此, 在給oal加上一個啟動代碼startup.s. 一個oal.lib就完成了.

posted on 2008-11-12 10:19 井泉 閱讀(1056) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产一区二区三区在线观看免费视频 | 亚洲小说欧美另类社区| 久久午夜激情| 久久综合九色99| 久久婷婷亚洲| 久久久久久久久久久一区| 久久久国产视频91| 欧美sm极限捆绑bd| 亚洲精品久久久久久下一站| 欧美激情四色| 一区二区三区导航| 亚洲伊人伊色伊影伊综合网| 亚洲综合另类| 久久久水蜜桃| 欧美理论在线| 欧美日韩国产在线看| 国产精品igao视频网网址不卡日韩| 欧美三级电影网| 久久精品伊人| 91久久在线| 亚洲天堂免费在线观看视频| 小黄鸭精品密入口导航| 久久亚洲视频| 欧美日韩精品国产| 国产欧美亚洲视频| 99日韩精品| 久久综合国产精品| 亚洲一区二区毛片| 欧美激情女人20p| 国内视频一区| 亚洲欧美春色| 欧美www视频| 欧美日本一区二区三区| 久久精品国产69国产精品亚洲| 模特精品裸拍一区| 国产日韩视频一区二区三区| 99一区二区| 免费成人黄色片| 亚洲欧美国产视频| 欧美日韩一区二区在线播放| 亚洲国产精品一区二区尤物区| 亚洲欧美一级二级三级| 亚洲欧洲一区二区三区| 久久亚洲高清| 国外视频精品毛片| 久久岛国电影| 亚洲欧美日韩精品在线| 欧美日韩你懂的| 亚洲激情视频| 久久久五月天| 性色av一区二区怡红| 国产精品国产自产拍高清av| 亚洲风情亚aⅴ在线发布| 欧美一级播放| 亚洲精品欧美| 久久久综合精品| 国产亚洲欧美激情| 欧美在线观看视频在线| 亚洲日韩中文字幕在线播放| 农村妇女精品| 亚洲电影天堂av| 久久夜色精品国产亚洲aⅴ| 亚洲视频电影图片偷拍一区| 欧美日韩另类一区| 亚洲在线观看免费视频| 亚洲一级在线| 国产日韩欧美亚洲| 久久青草欧美一区二区三区| 亚洲午夜精品久久久久久app| 国产精品国产精品| 亚洲永久在线观看| 亚洲在线日韩| 国产欧美在线播放| 久久久欧美一区二区| 久久久久99精品国产片| 国产日产高清欧美一区二区三区| 午夜精品久久久久久久99热浪潮| 亚洲精品乱码久久久久久| aa国产精品| 欧美日韩一区二区三区在线观看免| 亚洲开发第一视频在线播放| 久久久噜噜噜久噜久久| 欧美一区激情| 亚洲福利小视频| 亚洲日本成人网| 国产欧美日韩亚洲一区二区三区 | 国产麻豆综合| 久久另类ts人妖一区二区| 美女视频一区免费观看| 国产一区视频在线看| 欧美精品一区二| 亚洲激情六月丁香| av成人老司机| 韩国在线一区| 亚洲毛片一区| 国产精品亚洲欧美| 久久中文精品| 欧美午夜精品久久久久免费视| 久久国产日韩欧美| 欧美欧美天天天天操| 久久精品2019中文字幕| 欧美激情a∨在线视频播放| 欧美在线高清视频| 欧美日韩亚洲91| 久久影视精品| 国产精品igao视频网网址不卡日韩| 欧美国产另类| 国产午夜久久| 一区二区日韩欧美| 亚洲清纯自拍| 久久成人免费日本黄色| 一区二区欧美国产| 免费成人性网站| 久久久噜噜噜久久| 国产欧美日本在线| 91久久久久久久久久久久久| 一区久久精品| 欧美一区二区三区四区在线观看 | 欧美日韩一区二区视频在线观看| 99国产精品一区| 亚洲电影第1页| 国产精品入口福利| 免费日韩成人| 国产伦精品一区二区三区视频黑人| 欧美丰满高潮xxxx喷水动漫| 国产偷自视频区视频一区二区| 9l国产精品久久久久麻豆| 亚洲欧洲午夜| 另类专区欧美制服同性| 久久精品国产欧美激情| 国产精品激情电影| 一区二区三区精品视频在线观看| 91久久综合| 久久漫画官网| 久久综合狠狠综合久久激情| 国产自产2019最新不卡| 午夜免费电影一区在线观看| 国产日韩欧美综合在线| 国产精品护士白丝一区av| 欧美成人精精品一区二区频| 久久久久久久高潮| 美脚丝袜一区二区三区在线观看| 麻豆精品传媒视频| 欧美一级在线亚洲天堂| 国产精品捆绑调教| 亚洲人成在线播放| 日韩视频精品在线| 久久久久国产精品www| 久久av一区| 国产日韩欧美成人| 99视频热这里只有精品免费| 好看的日韩av电影| 久久久久一本一区二区青青蜜月| 亚洲特色特黄| 国产精品草莓在线免费观看| 亚洲精品一区二区三区婷婷月 | 亚洲成色777777在线观看影院| 精品99一区二区| 久久亚洲午夜电影| 亚洲欧洲三级电影| 亚洲永久免费精品| 国产亚洲在线观看| 浪潮色综合久久天堂| 蜜桃av一区二区三区| 国产一区二区三区自拍| 久久成人免费电影| 亚洲欧洲另类国产综合| 性欧美video另类hd性玩具| 国产专区欧美精品| 欧美日韩国产首页| 中日韩高清电影网| 欧美一区二区三区日韩视频| 樱桃成人精品视频在线播放| 欧美日韩国产区一| 久久精品国产免费| 99国产成+人+综合+亚洲欧美| 欧美一区国产一区| 久久精品国产久精国产思思| 国内成+人亚洲| 国产午夜精品全部视频在线播放| 亚洲欧美激情视频在线观看一区二区三区 | 伊人久久成人| 欧美偷拍一区二区| 久久av一区二区三区| 亚洲精品一区二区网址 | 亚洲精品小视频| 久久久久久久波多野高潮日日| 亚洲欧洲另类国产综合| 国产欧美日韩一区| 欧美日韩另类视频| 欧美77777| 久久久久在线| 亚洲欧美在线一区二区| 日韩午夜高潮| 亚洲经典视频在线观看| 久久夜精品va视频免费观看| 欧美一区在线视频| 亚洲香蕉网站| 一区二区三区欧美在线观看| 亚洲国产日韩一区|