在wince oal中的電源管理主要由oemidle和oempoweroff兩個函式實現。應該說oemidle實現的是處理器級的電源管理,而oempoweroff實現的是板級的電源管理。
在wince系統執行的時候,如果沒有任何執行緒可以執行,那麼核心就會呼叫oemidle函式。一般在oemidle中,處理器都會進入sleep模式或者idle模式,這取決於處理器本身所能支援的低功耗模式。應該說,這個時候系統中的各個裝置還是正常工作的,只是處理器進入了一種低功耗模式。oemidle函式是oal中必須實現的,微軟也提供了乙個例子,在%_winceroot%\platform\common\src\common\timer\idle路徑下,下面就這個例子簡單分析一下:
void oemidle(dword idleparam)
uint32 basemsec, idlemsec, idlesysticks;
int32 usedcounts, idlecounts;
ularge_integer idle;
//儲存當前系統的毫秒數
basemsec = curmsec;
//根據下一次排程的時間計算出當前空閒的時間
idlemsec = dwreschedtime - basemsec;
//如果沒有空閒時間,直接返回
if ((int32)idlemsec <= 0) return;
//如果空閒時間超過了硬體timer的最大技術,則以硬體timer的最大計數為準
if (idlemsec > g_oaltimer.maxperiodmsec) else {
if (curmsec == basemsec) {
// 不是系統timer中斷,只更新idlecounts
idlecounts = oaltimercountssincesystick();
// 獲得實際的空閒的count值
idlecounts -= usedcounts;
if (idlecounts < 0) idlecounts = 0;
// 更新64位計數器的計數值
idle.lowpart = curridlelow;
idle.highpart = curridlehigh;
idle.quadpart += idlecounts;
curridlelow = idle.lowpart;
curridlehigh = idle.highpart;
在該函式中呼叫了兩個重要的函式,以前沒有提到,這裡說一下:
uint32 oaltimerupdate(uint32 period, uint32 margin)
period:要更新的計數值
margin:硬體timer被改變所需的count數
該函式主要用於更新硬體timer的計數值,實際上就改變了硬體timer產生中斷的頻率。
void oalcpuidle()
該函式主要實現了硬體處理器進入idle模式,進入idle模式後,處理器會停止執行在該函式中,直到中斷產生後,處理器從idle模式恢復到正常模式,然後從該函式中返回。
該blog主要介紹了一種實現oemidle的思想。oemidle函式的實現依賴於處理器所支援的低功耗模式。有些處理器支援多種低功耗模式,根據需要可以在oemidle中實現。但是要知道進入低功耗後恢復到正常模式下所花費的時間會影響到整個系統的實時性,所以有時候要根據自己的產品需求,在省電和實時性之間做乙個取捨。
在oal中還有乙個重要的函式oempoweroff。當系統進入suspend的時候,首先所有的驅動的powerdown函式會被呼叫,然後就會呼叫oempoweroff函式。在該函式中,處理器會進入深度休眠,直到中斷產生後,處理器恢復到正常工作模式,從該函式中返回,接下來所有驅動的powerup函式會被呼叫,然後系統恢復正常工作模式。
void oempoweroff (void)
該函式的實現流程如下:
如果支援kitl,呼叫oalkitlpoweroff關閉kitl功能
呼叫bsppoweroff函式關閉板級的相關電源
儲存所有暫存器的值
關閉所有中斷,清除所有中斷標記位
開啟能夠喚醒處理器的中斷
sdram進入自重新整理模式
處理器進入深度休眠模式,停止執行,等待中斷喚醒
中斷產生後,處理器被喚醒,並恢復到正常模式
sdram進入正常工作模式
開啟並配置系統的相關中斷
恢復所有暫存器得值
呼叫bsppoweron函式開啟板級的相關電源
如果支援kitl,呼叫oalkitlpoweron重新初始化kitl
WinCE OAL中的中斷處理
這張圖想必很多人都見過,主要這張圖太經典了,所以還是貼出來嘮叨幾句,硬體中斷產生以後,會導致核心isr的執行,然後由oal中的isr來處理相應的中斷,最後導致相對應的ist執行完成真正的中斷處理。所以在wince中,中斷處理由isr和ist共同完成。isr主要完成中斷源的確定,遮蔽該中斷並返回給核心...
WinCE OAL中的Memory函式介紹
在bsp開發中經常會用到實體地址與虛擬位址的轉換,一般都是基於實體地址獲得相應的虛擬位址來訪問硬體。在wince6.0中,可以在wince600 platform common src inc oal memory.h檔案中找到相關的操作函式,這些函式用來虛擬位址與實體地址之間的轉換,它們都是基於o...
WinCE OAL中的Memory函式介紹
在 bsp開發中經常會用到實體地址與虛擬位址的轉換,一般都是基於實體地址獲得相應的虛擬位址來訪問硬體。在 wince6.0 中,可以在 wince600 platform common src inc oal memory.h 檔案中找到相關的操作函式,這些函式用來虛擬位址與實體地址之間的轉換,它們...