<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Windows CE內核啟動(dòng)分析

Windows CE內核啟動(dòng)分析

作者: 時(shí)間:2011-02-24 來(lái)源:網(wǎng)絡(luò ) 收藏

Windows CE內核啟動(dòng)分析

移植或者創(chuàng )建一個(gè)BSP,也許需要先熟悉Windows CE的內核啟動(dòng)過(guò)程.

目錄

基于A(yíng)RM的Windows CE內核啟動(dòng)分析1

1.startup.s2

2.KernelStart2

2.1 ARMInit()3

2.1.1 OALIntrInit3

2.1.2 OALTimerInit4

2.1.2.1 Variable Tick Scheduler4

2.2 KernelInit()4

2.3 FirstSchedule5

1.startup.s

內核入口點(diǎn)startup.S,內核從這里啟動(dòng).因為內核經(jīng)過(guò)bootloader加載,內核運行時(shí)候,已經(jīng)由bootloader完成了硬件的基本初始化(關(guān)閉watchdog, pll設置等等)所以,startup.S的任務(wù)比較簡(jiǎn)單,只是將oemaddrtab_cfg.inc里面的g_oalAddressTable數組地址作為參數,傳遞給KernelStart,這個(gè)數組用來(lái)描述和實(shí)現物理地址到虛擬地址的映射.

(. + 8)是流水線(xiàn)處理.KernelStart()位于

PRIVATEWINCEOSCOREOSNKKERNELARMarmtrap.s

2.KernelStart

ARMInit()位于本目錄的mdram.c文件.

KernelInit()位于PRIVATEWINCEOSCOREOSNKKERNELkwin32.c中.

FirstSchedule()位于armtrap.s的一個(gè)label.

主要關(guān)注ARMInit()和KernelInit(),前一個(gè)進(jìn)行目標板的初始化,后一個(gè)負責內核的初始化.FirstSchdule()開(kāi)始調度第一個(gè)程序.

2.1 ARMInit()

先看看ARMInit()它的幾個(gè)關(guān)鍵性動(dòng)作如下:

KernelRelocate()是進(jìn)行重定位.KernelFindMemory()是查找系統可用內存,并分成應用內存和object store兩部分.這2個(gè)函數都已由MS自己實(shí)現.我們需要添加的函數是名字以OEM開(kāi)頭的函數.

OEMInitDebugSerial()初始化一個(gè)調試口,我們一般使用一個(gè)串口來(lái)作為調試口,這個(gè)函數需要自己實(shí)現,在 PLATFORMSMDK2440ASrcKernelOaldebug.c中定義這個(gè)函數.比如可以將串口0設置為調試口,在這個(gè)函數中對串口0進(jìn)行初始化.

OEMInit()是一個(gè)比較重要的函數,

OALCacheGlobalsInit()在PLATFORMCOMMONSRCARMCOMMONCACHEinit.s中實(shí)現,這部分代碼以PQOAL的形式提供.

OALIntrInit()初始化中斷.

OALTimerInit()初始化定時(shí)器TIMER4,作為系統時(shí)鐘(tick),

configGPIO()初始化gpio口,設置相關(guān)寄存器.

InitDisplay()初始化LCD.有時(shí)候,我們希望在oal啟動(dòng)和內核加載期間顯示一副等待圖片或者顯示LOGO,為達到這個(gè)目的,需要先初始化LCD.

OALKitlStart()準備啟動(dòng)KITL.

此外,在A(yíng)RMInit還會(huì )通過(guò)調試口打印一些基本信息,開(kāi)始時(shí)候打印”Windows CE Kernel for ARM….”字樣, 中間打印處理器類(lèi)型等等信息.結束時(shí)候打印” ARMInit done.”

2.1.1 OALIntrInit

調用OALIntrMapInit()初始化2個(gè)數組g_oalSysIntr2Irq,g_oalIrq2SysIntr,這2個(gè)數組表征irq和邏輯中斷SysIntr的映射關(guān)系.

然后初始化中斷寄存器,

最后,留一個(gè)接口給oem: BSPIntrInit(),如果oem需要在這個(gè)階段初始化一些中斷,可以定義這個(gè)函數并實(shí)現.

2.1.2 OALTimerInit

這個(gè)函數比較重要. 都知道所有WinCE系統都需要一個(gè)定時(shí)器來(lái)提供一個(gè)heartbeat,

g_oalTimer包含各種系統時(shí)鐘相關(guān)的變量.

curridlehigh, curridlelow,這2個(gè)32位的DWORD變量合起來(lái)實(shí)現一個(gè)64位的計數器,反映了系統處于空閑模式(Idle mode)的時(shí)間。一般在OEMIdle()函數內更新。用戶(hù)程序通過(guò)調用GetIdleTime()函數可以得到這個(gè)值。

初始化內核函數指針:pQueryPerformanceFrequency, pQueryPerformanceCounter.通過(guò)這兩個(gè)函數實(shí)現高精度的計時(shí)器. 這兩個(gè)函數的原型也已經(jīng)由PQOAL實(shí)現.

初始化TIMER4作為系統時(shí)鐘.TIMER4是一個(gè)16bit的定時(shí)器.此函數將TIMER4設置成為自動(dòng)轉載模式.

2.1.2.1 Variable Tick Scheduler

可變的系統時(shí)鐘節拍,這個(gè)是WinCE5.0中增加的新的性能.

每一次定時(shí)器中斷時(shí)候,內核分析所有線(xiàn)程后決定切換到哪個(gè)線(xiàn)程運行.假如所有線(xiàn)程都在等待狀態(tài),系統將進(jìn)入idle狀態(tài).在這個(gè)狀態(tài)的時(shí)候,任何中斷都會(huì )喚醒系統重新開(kāi)始調度.一般系統大部分時(shí)間是處于idle狀態(tài)的,內核會(huì )調用OEMIdle()進(jìn)入idle狀態(tài),我們已經(jīng)知道這個(gè)狀態(tài)會(huì )被任何中斷喚醒. 在以前的版本中,系統中斷(即上面的TIMER4中斷)每毫秒產(chǎn)生一次,查看系統是否需要重新調度. 為了節電,不希望中斷那么頻繁.于是WinCE5.0中,在調用OEMIdle()之前會(huì )先調用pOEMUpdateRescheduleTime().通過(guò)這個(gè)函數重新設置俠義次系統時(shí)鐘中斷的時(shí)間.

2.2 KernelInit()

再看看KernelInit()函數

不過(guò)多關(guān)注KernelInit().

2.3 FirstSchedule

位于armtrap.s的一個(gè)label.開(kāi)始第一個(gè)線(xiàn)程調度.整個(gè)內核開(kāi)始運行.


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


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>