嵌入式Linux的低功耗策略研究 概要:功耗是嵌入式設(shè)備的一個(gè)十分重要的性能指標(biāo),。在硬件設(shè)計(jì)和選型之后,功耗水平在極大程度上取決于軟件的設(shè)計(jì),。鑒于Linux在嵌入式設(shè)備中的應(yīng)用日益廣泛,,提出在嵌入式Linux下軟件編寫(xiě)的幾種策略。通過(guò)這些軟件編寫(xiě)方式,,能有效降低最終產(chǎn)品的功耗水平,。 0 簡(jiǎn)介 由于Linux系統(tǒng)具有嵌入式操作系統(tǒng)需要的很多特色,如適應(yīng)于多種CPU和多種硬件平臺(tái),、性能穩(wěn)定,、可裁剪性很好、源碼開(kāi)放,、開(kāi)發(fā)和使用簡(jiǎn)單等,。目前,基于Linux應(yīng)用的嵌入式設(shè)備日益增多,,Linux正在嵌入式領(lǐng)域發(fā)揮著越來(lái)越重要的作用,。 對(duì)于嵌入式設(shè)備尤其是移動(dòng)設(shè)備來(lái)說(shuō),功耗是系統(tǒng)的重要指標(biāo),,系統(tǒng)設(shè)計(jì)的重要目標(biāo)之一就是要盡可能地降低功耗,。目前,對(duì)功耗的研究主要集中在硬件解決方案上,,而軟件研究方面很少,。實(shí)踐證明:在硬件設(shè)計(jì)和選型確定后,功耗的高低與軟件設(shè)計(jì)有很大的關(guān)聯(lián)性,。軟件設(shè)計(jì)和編程質(zhì)量的好壞,,極大地影響著最終產(chǎn)品的功耗水平。 因?yàn)樽罱K耗能的是硬件,,所以在考慮采用軟件方法降低功耗的時(shí)候,,要充分考慮硬件的功能和性能,即在保障系統(tǒng)實(shí)現(xiàn)的基礎(chǔ)上怎樣組織硬件運(yùn)作而使功耗降低,。全速執(zhí)行,、待機(jī)和睡眠等行為都是利用CPU的固有能力,透過(guò)降低工作電壓或頻率來(lái)節(jié)省功耗,。此外,,在大多數(shù)用戶察覺(jué)不到的情況下,實(shí)際的電源管理能夠根據(jù)負(fù)載狀況逐漸改變系統(tǒng)的狀態(tài),有時(shí)這種情況在ls之內(nèi)可以產(chǎn)生數(shù)百次,。 另外,,在編寫(xiě)程序時(shí)可能會(huì)遇到這樣的情況,如記錄狀態(tài)寄存器內(nèi)容,,并等待設(shè)定標(biāo)記出現(xiàn),;檢查串口的FIFO狀態(tài)標(biāo)記,看是否收到數(shù)據(jù),;監(jiān)測(cè)一個(gè)雙端口存儲(chǔ)器,,以確定系統(tǒng)中是否有另外CPU寫(xiě)入了一個(gè)變量,以便控制共享資源,。從表面上看,,這樣的代碼沒(méi)有什么問(wèn)題,但在每個(gè)時(shí)鐘周期里不斷記錄寄存器狀態(tài)將無(wú)法有效延長(zhǎng)設(shè)備的電池壽命,。 2 利用Linux內(nèi)核的電源管理 電源管理策略的基礎(chǔ)是調(diào)整處理器內(nèi)核的工作電壓和頻率。不過(guò),,現(xiàn)代的嵌入式CPU具有非常高的電源效率,,以至于CPU并不總是最主要的耗能組件。其他高耗能的組件包括高性能內(nèi)存,、顯示屏和射頻接口等,,因此,如果電源管理系統(tǒng)只能調(diào)節(jié)CPU內(nèi)核的電壓和頻率,,那么它的用途將有限,。一個(gè)真正有效的電源管理方案應(yīng)該可以采用與CPU內(nèi)核執(zhí)行相協(xié)調(diào)或相獨(dú)立的方式,支持對(duì)一系列電壓和頻率的快速調(diào)節(jié),。 Linux支持兩種電源管理標(biāo)準(zhǔn):APM(AdvancedPower Managememt)和ACPI(Advanced Configtlrationand P0wer Interface),。APM是傳統(tǒng)的高級(jí)電源管理方案,目前仍然使用在許多基于Linus便攜式設(shè)備中,;而ACPI則提供了更為靈活的電腦和設(shè)備管理接口,。這兩個(gè)標(biāo)準(zhǔn)不能同時(shí)運(yùn)行。缺省情況下,,Linux運(yùn)行ACPI,。APM可以使機(jī)器處于Suspend(懸掛)或Standby(待機(jī))狀態(tài),以及檢查電池容量,;而ACPI還可以使外設(shè)(如顯示器,、PCI)單獨(dú)斷電,在節(jié)省電能方面有更多的控制,。為了讓電源管理功能生效,,需要在Linux內(nèi)核打開(kāi)它,并且在Linux里加載必需的應(yīng)用軟件。 電源管理活動(dòng)需要對(duì)操作系統(tǒng)內(nèi)核和設(shè)備驅(qū)動(dòng)程序進(jìn)行特殊的干預(yù),。在嵌入式Linux中,,雖然低層電源管理駐留在操作系統(tǒng)內(nèi)核中,但電源管理策略和機(jī)制來(lái)源于中介軟件和用戶應(yīng)用程序代碼,,如圖l所示,。 Linux內(nèi)核中電源管理機(jī)制負(fù)責(zé)維持整個(gè)系統(tǒng)的電源狀態(tài)。它可以看成是為驅(qū)動(dòng)程序,、中介軟件和應(yīng)用程序提供服務(wù)的元素,。 ①使用pm_register對(duì)設(shè)備的每個(gè)實(shí)例(instance)進(jìn)行注冊(cè),; ③用戶自己的pnl_callback函數(shù)在系統(tǒng)進(jìn)入suspend狀態(tài),,或者從suspend狀態(tài)恢復(fù)的時(shí)候會(huì)被調(diào)用; ④當(dāng)設(shè)備不使用時(shí)調(diào)用pm_dev_idle函數(shù)(這個(gè)操作是可選的,,以增強(qiáng)設(shè)備idle狀態(tài)的監(jiān)測(cè)能力),; ⑤當(dāng)被unIoad的時(shí)候,使用pm_unreggister取消設(shè)備的注冊(cè),。 中介程序允許用戶預(yù)先定義某些策略,,然后跟蹤電源狀態(tài),執(zhí)行特定的操作,。 3 在空閑模式下等待事件 很多嵌入式CPU都具有能降低功耗的電源工作模式,,最常用的是空閑模式。此時(shí)CPU內(nèi)核指令執(zhí)行部分關(guān)閉,,而所有外設(shè)和中斷信號(hào)仍處于工作狀態(tài),。由于空閑模式比CPU執(zhí)行指令時(shí)的功耗要小得多,,因而可以在任何時(shí)候,只要Linux檢查到所有線程都處于阻塞狀態(tài)(如等待中斷,、事件或定時(shí)時(shí)間),,它都可以將CPU置于空閑模式。任何中斷(如觸摸屏事件,、按下按鍵事件等)都能把CPU從空閑模式中喚醒,,然后繼續(xù)執(zhí)行后面的代碼。如果事件不能直接連接到外部中斷,,也可以用一個(gè)系統(tǒng)定時(shí)器定期喚醒CPU,。例如在等待一個(gè)事件并且知道只要事件發(fā)生后在10ms內(nèi)能檢測(cè)到,那么可以啟動(dòng)lOms定時(shí)器,,并把CPU置于空閑模式,。每次處理定時(shí)中斷時(shí)都要檢查事件狀態(tài),如果狀態(tài)沒(méi)有變化,,就立刻回到空閑模式,。 4 減少事件 通常CPU的定時(shí)中斷間隔為1ms,Linux會(huì)頻繁使CPU置于空閑模式,,并一直維持到被中斷喚醒,。在這種情況下,最有可能喚醒CPU中斷的是定時(shí)器中斷本身,。即使所有其他線程被阻塞,在其他中斷,、內(nèi)部事件及長(zhǎng)時(shí)間延遲之前,,定時(shí)器中斷也會(huì)以每秒l00次的頻率把CPU從空閑模式中喚醒,以運(yùn)行調(diào)度程序,。就算調(diào)度程序確定所有線路都被阻塞,,并很快將CPU回復(fù)到空閑模式,這樣頻繁操作也會(huì)浪費(fèi)大量電源,。因此,,應(yīng)盡可能長(zhǎng)時(shí)間地將CPU置于空閑模式,而減少事件是解決這個(gè)問(wèn)題的有效途徑,。通過(guò)分析代碼和系統(tǒng)要求,,以決定是否能改變處理中斷的方式實(shí)現(xiàn)。例如,,可以在進(jìn)入空閑模式前關(guān)閉時(shí)隙中斷信號(hào),,只有再次出現(xiàn)中斷信號(hào)時(shí)才被喚醒。不過(guò),,這種做法通常不太合適,。盡管多數(shù)阻塞的線程可以直接或間接等待外部中斷,,有些還依賴于定時(shí)中斷,如一個(gè)驅(qū)動(dòng)器會(huì)在等待外設(shè)時(shí)睡眠500ms,,這時(shí)空閑模式下如果完全關(guān)閉系統(tǒng)定時(shí)器,,可能意味著線路不能按時(shí)恢復(fù)工作。 5 控制CPU的性能 CPU在降低功耗方面的最新進(jìn)展表明,,CPU消耗的能量與驅(qū)動(dòng)CPU的時(shí)鐘頻率以及應(yīng)用其內(nèi)核上的電壓平方成正比,。 CPU允許動(dòng)態(tài)降低時(shí)鐘速度。降低一半時(shí)鐘速度,,功耗將成比例下降,。但是僅采用這種技術(shù)實(shí)現(xiàn)節(jié)能,,還需要一些技巧.因?yàn)閳?zhí)行的代碼可能要兩倍長(zhǎng)的時(shí)間才能完成,即使這樣也不會(huì)省電,。例如,,板上LCD控制器需要使用一個(gè)儲(chǔ)存在片外SDRAM中的幀緩存。當(dāng)LCD控制器工作時(shí),,需要指定足夠高的內(nèi)存總線頻率來(lái)滿足顯示器刷新速率的需要,。在LCD不工作的情況下(例如當(dāng)PDA僅作為MP3播放器使用時(shí)),降低SDRAM總線頻率,,可以節(jié)省整個(gè)系統(tǒng)的功耗,。 動(dòng)態(tài)降低電壓是另一種做法。越來(lái)越多的CPU允許降低電壓,,以適應(yīng)CPU時(shí)鐘速度的下降,,這樣在降低時(shí)鐘速度時(shí)也能省電。事實(shí)上,,只要CPU不飽和,,頻率和電壓就能不斷減少,這樣還是能完成工作,,而消耗的電源總體上卻比較低,。 考慮到并不是所有線程都消耗同樣多CPU帶寬,所以即使這些方法也還是可以改進(jìn)的,。有效應(yīng)用CPU帶寬的線程,,會(huì)隨著CPU時(shí)鐘速度下降而花更長(zhǎng)的時(shí)間才能完成,這些線程使用分配給它們的每一個(gè)周期,。另一方面,,I/O線程采用分配給它的所有CPU周期,即便CPU時(shí)鐘速率下降,,也要用同樣長(zhǎng)的時(shí)間才能完成。例如,,像很多PDA使用的PCMCIA卡接口,,當(dāng)數(shù)據(jù)寫(xiě)人快閃存儲(chǔ)卡時(shí),系統(tǒng)瓶頸不是CPU的速度,,而是物理總線接口以及卡的固件為擦掉和重新編程閃存所花的時(shí)間,。理想情況下,前面討論的等待事件的技術(shù)可在這里應(yīng)用,,以最大程度降低功耗,,但是等待時(shí)間經(jīng)常變化很大,遠(yuǎn)小于操作系統(tǒng)運(yùn)行時(shí)間,,這樣會(huì)影響到性能,。這些驅(qū)動(dòng)程序常常檢測(cè)狀態(tài)寄存器,,此時(shí)降低時(shí)鐘速度將節(jié)省一部分電源,但會(huì)對(duì)數(shù)據(jù)寫(xiě)入卡的時(shí)間產(chǎn)生輕微影響,。 使用控制CPU性能的策略,,要知道何時(shí)能降低時(shí)鐘頻率和電壓而不會(huì)顯著影響性能;考慮什么時(shí)候降低驅(qū)動(dòng)器和應(yīng)用程序的時(shí)鐘速度比較難處理,。這在多任務(wù)處理環(huán)境中更加富有技巧性,。 |
|
來(lái)自: 昵稱3867830 > 《轉(zhuǎn)載》