基于linux內(nèi)核驅(qū)動(dòng)的Android電源管理淺談-_第1頁(yè)
基于linux內(nèi)核驅(qū)動(dòng)的Android電源管理淺談-_第2頁(yè)
基于linux內(nèi)核驅(qū)動(dòng)的Android電源管理淺談-_第3頁(yè)
基于linux內(nèi)核驅(qū)動(dòng)的Android電源管理淺談-_第4頁(yè)
基于linux內(nèi)核驅(qū)動(dòng)的Android電源管理淺談-_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、如何有效地管理嵌入式系統(tǒng),尤其是移動(dòng)終端的電源功耗,通過(guò)降低設(shè)備電壓、頻率,可以減少能量的消耗,達(dá)到省電的目的,電源管理歷來(lái)為重要的研究課題之一。動(dòng)態(tài)電源管理DPM(Dynamic Power Management技術(shù)提供一種操作系統(tǒng)級(jí)別的電源管理能力,包含CPU工作頻率和電壓,外部總線時(shí)鐘頻率,外部設(shè)備時(shí)鐘、電源等方面的動(dòng)態(tài)調(diào)節(jié)、管理功能。通過(guò)用戶層制定策略與內(nèi)核提供管理功能交互,實(shí)時(shí)調(diào)整電源參數(shù)而同時(shí)滿足系統(tǒng)實(shí)時(shí)應(yīng)用的需求,允許電源管理參數(shù)在短時(shí)間的空閑或任務(wù)運(yùn)行在低電源需求時(shí),可以被頻繁地、低延遲地調(diào)整,從而實(shí)現(xiàn)更精細(xì)、更智能的電源管理。電源管理實(shí)際上是一個(gè)系統(tǒng)工程,從應(yīng)用程序到內(nèi)核框架

2、,再到設(shè)備驅(qū)動(dòng)和硬件設(shè)備,都要參與進(jìn)來(lái),才能達(dá)到電源管理的最優(yōu)化。硬件層:硬件設(shè)備CMOS電路的總功耗是活動(dòng)功耗與靜態(tài)功耗之和。當(dāng)電路工作或邏輯狀態(tài)轉(zhuǎn)換時(shí)會(huì)產(chǎn)生活動(dòng)功耗C L*V2dd*f,未發(fā)生轉(zhuǎn)換時(shí)晶體管漏電流會(huì)造成靜態(tài)功耗V dd*I q。其消耗功率如下: P=r*C L*V2dd*f+V dd*I q其中r為開(kāi)關(guān)活動(dòng)率(Switching Activity,C L為負(fù)載電容,V dd為電源電壓,f為工作頻率,I q 為漏電流。在操作系統(tǒng)級(jí)的電源管理設(shè)計(jì)實(shí)現(xiàn)中,重點(diǎn)是活動(dòng)功耗。我們從中可以得出幾種管理活動(dòng)功耗的方法:1.電壓、時(shí)鐘調(diào)節(jié)。通過(guò)降低電壓和時(shí)鐘來(lái)減少活動(dòng)功耗和靜態(tài)功耗。2.時(shí)鐘

3、選通。停止電路時(shí)鐘,即設(shè)f為0,將時(shí)鐘從不用的電路模塊斷開(kāi),減少活動(dòng)功耗。許多CPU都有“閑置”或“停止”指令,一些處理器還可通過(guò)門(mén)控關(guān)閉非CPU時(shí)鐘模塊,如高速緩存、DMA外設(shè)等。3.電源供應(yīng)選通。斷開(kāi)電路中不使用的模塊電源供應(yīng)。這種方法需要考慮重新恢復(fù)該模塊的代價(jià)。斷開(kāi)不使用的模塊的時(shí)鐘和電源供應(yīng)可以減少電源消耗,但要能夠正確預(yù)測(cè)硬件模塊的空閑時(shí)期。因?yàn)橹匦率鼓苡布K時(shí)鐘和電源會(huì)造成一定延遲,不正確的預(yù)測(cè)將導(dǎo)致性能下降。從上分析可以知道降低電壓對(duì)功耗的貢獻(xiàn)是2次方的;降低時(shí)鐘也可降低功耗,但它同時(shí)也降低性能,延長(zhǎng)同一任務(wù)的執(zhí)行時(shí)間。所以,選擇滿足性能所需的最低時(shí)鐘頻率,在時(shí)鐘頻率和各種系

4、統(tǒng)部件運(yùn)行電壓要求范圍內(nèi),設(shè)定最低的電源電壓,將會(huì)大量減少系統(tǒng)功耗。通過(guò)調(diào)節(jié)電壓、頻率來(lái)減少系統(tǒng)活動(dòng)功耗的動(dòng)態(tài)電源管理需要硬件支持。SoC系統(tǒng)一般有多個(gè)執(zhí)行單元,如PM(電源管理模塊、OSC(片上晶振模塊、PLL(鎖相環(huán)模塊、CPU核以及CPU核中的數(shù)據(jù)緩存和指令緩存,其他模塊統(tǒng)稱為外圍模塊(例如LCD控制器、UART、SDRAM控制器等。CPU 高頻時(shí)鐘主要由PLL提供,同時(shí)PLL也為外圍模塊和SoC總線提供其他頻率時(shí)鐘。一般SoC系統(tǒng)都有一些分頻器和乘法器可以控制這些時(shí)鐘。PM模塊主要是管理系統(tǒng)的電源供應(yīng)狀態(tài)。一般有自己的低頻、高準(zhǔn)確度晶振,用以維持一個(gè)RTC時(shí)鐘、RTC定時(shí)器和中斷控制單

5、元。其中中斷控制單元使RTC定時(shí)器和外部設(shè)備能夠喚醒掛起的SoC系統(tǒng),數(shù)字相控鎖環(huán)(DPLL將外頻或晶振輸入轉(zhuǎn)化為高頻,供給CPU核以及其他片上設(shè)備。操作DPLL控制寄存器就可以設(shè)置DPLL輸出時(shí)鐘,控制MPU和DSP、MMU單元的運(yùn)行頻率,MPU、DSP外設(shè)時(shí)鐘,以及LCD刷新時(shí)鐘。內(nèi)核層:Linux架構(gòu)下實(shí)現(xiàn)電源管理內(nèi)核模塊需要實(shí)現(xiàn)一個(gè)應(yīng)用層和操作系統(tǒng)的接口,一個(gè)為多個(gè)硬件平臺(tái)提供通用電源管理邏輯控制框架的硬件無(wú)關(guān)層,以及一個(gè)管理特定硬件電源控制接口的平臺(tái)相關(guān)電源控制層。其代碼路徑文件在:/kernel/power/main.c/kernel/power/earlysuspend.c/ke

6、rnel/power/wakelock.c/kernel/power/ fbearlysuspend.c/kernel/power/ consoleearlysuspend.crequest_suspend_state(函數(shù)是android 相對(duì)標(biāo)準(zhǔn)linux內(nèi)核改動(dòng)的地方,它實(shí)現(xiàn)在earlysuspend.c中。在標(biāo)準(zhǔn)linux內(nèi)核中,用戶通過(guò)sys寫(xiě)入“mem”和“standby”時(shí),會(huì)直接調(diào)用enter_state(進(jìn)入suspend模式,但在android中則會(huì)調(diào)用request_suspend_state(函數(shù)進(jìn)入early suspend狀態(tài)。該機(jī)制作用在關(guān)閉顯示的時(shí)候,一些和顯示

7、有關(guān)的設(shè)備,比如LCD背光,重力感應(yīng)器,觸摸屏,這些設(shè)備都應(yīng)該關(guān)掉, 但是系統(tǒng)可能還是在運(yùn)行狀態(tài)(這時(shí)候還有wake lock進(jìn)行任務(wù)的處理,例如在掃描SD卡上的文件,后臺(tái)音樂(lè)/FM播放,文件傳輸/下載等。在嵌入式設(shè)備中, 背光是一個(gè)很大的電源消耗,所以android加入這樣一種機(jī)制。接著分析內(nèi)核代碼具體實(shí)現(xiàn)流程,對(duì)于需要注冊(cè)結(jié)構(gòu)early_suspend的handler通過(guò)函數(shù)register_early_suspend注冊(cè),注冊(cè)時(shí)將具體的結(jié)構(gòu)early_suspend掛載在early_suspend_handlers鏈表上。何時(shí)調(diào)用掛載在該鏈表上的handler呢?具體何時(shí)調(diào)用由內(nèi)核調(diào)用機(jī)

8、制決定,其內(nèi)核調(diào)用流程如式中的函數(shù)request_suspend_state所示,該函數(shù)會(huì)通過(guò)工作隊(duì)列的推后執(zhí)行機(jī)制調(diào)用,其中work結(jié)構(gòu)early_suspend_work或late_resume_work掛載在工作隊(duì)列suspend_work_queue上,推后執(zhí)行的具體函數(shù)就是early_suspend或late_resume了。在這2個(gè)函數(shù)中,就是從鏈表early_suspend_handlers上取下先前在函數(shù)register_early_suspend 中注冊(cè)的結(jié)構(gòu)early_suspend的handler。注意其順序,early_suspend中是從鏈表頭開(kāi)始取,與其相反的lat

9、e_resume是從鏈表尾開(kāi)始一個(gè)個(gè)的取,這個(gè)好理解。其中的工作隊(duì)列suspend_work_queue 是在wakelock.c中創(chuàng)建的。md_init(->md_probe(->md_alloc(->md_fops->md_ioctl(->add_new_disk(-> md_import_device(->rdev_ktype->rdev_default_attrs->rdev_state->state_store(->request_suspend_state(->early_suspend(、late_resum

10、e(->early_suspend_handlers <-register_early_suspend(那么內(nèi)核里面為什么要通過(guò)register_early_suspend這種復(fù)雜機(jī)制來(lái)進(jìn)行動(dòng)態(tài)電源的管理,而不是在驅(qū)動(dòng)中對(duì)設(shè)備直接設(shè)置相應(yīng)的狀態(tài)?比如在開(kāi)始要用時(shí)就打開(kāi)設(shè)備,用完了就關(guān)掉設(shè)備。這是因?yàn)殡娫垂芾淼膶?shí)時(shí)性畢竟不需要那么的高,不像觸摸屏采樣數(shù)據(jù)那樣,點(diǎn)擊下去就立即得有采樣數(shù)據(jù)出來(lái)。工作隊(duì)列就是用來(lái)延遲時(shí)間不敏感的任務(wù),以便更迅速處理那些高頻率諸如中斷事件,這樣能夠帶來(lái)性能的優(yōu)化。其由內(nèi)核工作線程events/X (每CPU 一個(gè),X=1,2,3,4來(lái)管理,內(nèi)核線程就從工作隊(duì)

11、列(這里即是suspend_work_queue中抽取任務(wù)并激活一個(gè)bottom-half 處理程序,這里就是上面的那個(gè)early_suspend(或late_resume(函數(shù)。驅(qū)動(dòng)層:在驅(qū)動(dòng)中對(duì)early suspend要做的就相對(duì)較簡(jiǎn)單,固定模式,僅僅是調(diào)用上面討論的接口函數(shù)register_early_suspend去掛載自己的handler到鏈表early_suspend_handlers上,然后主要任務(wù)就是根據(jù)電源管理芯片的SPEC去實(shí)自己的handler結(jié)構(gòu)的suspend、resume成員函數(shù),以便在函數(shù)early_suspend和late_resume中回調(diào)回來(lái)有具體函數(shù)可以

12、調(diào)用。驅(qū)動(dòng)中的fbearlysuspend.c 和consoleearlysuspend.c 這兩個(gè)文件實(shí)現(xiàn)了針對(duì)lcd framebuffer 的earlysuspend 和console 的earlysuspend 支持。實(shí)際上這兩個(gè)文件就是利用上面earlysuspend.c提供的接口注冊(cè)了針對(duì)framebuffer 和console的early suspend handler,并提供相應(yīng)的handler函數(shù)。另外在MTK的驅(qū)動(dòng)中諸如重力傳感器、光感、距離傳感器、鍵盤(pán)、觸摸屏、LCD以及GPIO事件等等都用到了這種early suspend的機(jī)制。Framework層:PowerMana

13、ger.java提供給應(yīng)用層調(diào)用,最終核心在PowerManagerService.java,其提供PowerManager的功能,以及整個(gè)電源管理狀態(tài)機(jī)的運(yùn)行。WindowManagerService會(huì)把用戶的操作作為user Activity事件來(lái)調(diào)用userActivity函數(shù),PowerManagerService就會(huì)在user Activity 里面判斷事件類型作出相應(yīng)的反應(yīng)。核心PowerManagerService.java,Power.java提供底層的函數(shù)接口,與JNI層進(jìn)行交互,JNI層的代碼主要在文件android_os_Power.cpp中,與Linux kernel交

14、互是通過(guò)Power.c來(lái)實(shí)現(xiàn)的, Android跟kernel的交互主要是通過(guò)sys文件的方式來(lái)實(shí)現(xiàn)的。當(dāng)用戶通過(guò)sysfs寫(xiě)入mem 或者standby到/sys/power/state中的時(shí)候, state_store(會(huì)被調(diào)用,然后Android會(huì)在這里調(diào)用request_suspend_state( 而標(biāo)準(zhǔn)的Linux會(huì)在這里進(jìn)入enter_state(這個(gè)函數(shù)。如果請(qǐng)求的是休眠, 那么early_suspend這個(gè)workqueuequeue_work(就會(huì)被調(diào)用,并且進(jìn)入early_suspend狀態(tài)。APP層:上層應(yīng)用暫時(shí)沒(méi)分析,簡(jiǎn)要列出找到的相關(guān)的資料。Android 中定義了幾種低功耗狀態(tài):earlysuspend,suspend,hibernation。1,earlysuspend是一種低功耗的狀態(tài),某些設(shè)備可以選擇進(jìn)入某種功耗較低的狀態(tài),比如LCD可以降低亮度或滅掉;2,suspend是指除電源管理以外的其他外

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論