嵌入式Linux的低功耗策略研究
發布時間:2007/8/31 0:00:00 訪問次數:504
作者:國防科技大學 湯順 趙龍
摘 要:功耗是嵌入式設備的一個十分重要的性能指標。在硬件設計和選型之后,功耗水平在極大程度上取決于軟件的設計。鑒于Lioux在嵌入式設備中的應用日益廣泛,提出在嵌入式Linux下軟件編寫的幾種策略。通過這些軟件編寫方式,能有效降低最終產品的功耗水平。
關鍵詞:嵌入式Linux功耗策略
引 言
由于Linux系統具有嵌入式操作系統需要的很多特色,如適應于多種CPU和多種硬件平臺、性能穩定、可裁剪性很好、源碼開放、開發和使用簡單等。目前,基于Linux應用的嵌入式設備日益增多,Linux正在嵌入式領域發揮著越來越重要的作用。
對于嵌入式設備尤其是移動設備來說,功耗是系統的重要指標,系統設計的重要目標之一就是要盡可能地降低功耗。目前,對功耗的研究主要集中在硬件解決方案上,而軟件研究方面很少。實踐證明:在硬件設計和選型確定后,功耗的高低與軟件設計有很大的關聯性。軟件設計和編程質量的好壞,極大地影響著最終產品的功耗水平。據此,為降低功耗,提出在嵌入式Linux下軟件編程的幾種策略。
1 問題分析
因為最終耗能的是硬件,所以在考慮采用軟件方法降低功耗的時候,要充分考慮硬件的功能和性能,即在保障系統實現的基礎上怎樣組織硬件運作而使功耗降低。全速執行、待機和睡眠等行為都是利用CPU的固有能力,透過降低工作電壓或頻率來節省功耗。此外,在大多數用戶察覺不到的情況下,實際的電源管理能夠根據負載狀況逐漸改變系統的狀態,有時這種情況在l s之內可以產生數百次。
另外,在編寫程序時可能會遇到這樣的情況,如記錄狀態寄存器內容,并等待設定標記出現;檢查串口的FIFO狀態標記,看是否收到數據;監測一個雙端口存儲器,以確定系統中是否有另外CPU寫入了一個變量,以便控制共享資源。從表面上看,這樣的代碼沒有什么問題,但在每個時鐘周期里不斷記錄寄存器狀態將無法有效延長設備的電池壽命。
基于這些問題,下面提出幾種策略,以有效降低最終產品的功耗水平。
2 利用Linux內核的電源管理
電源管理策略的基礎是調整處理器內核的工作電壓和頻率。不過,現代的嵌入式CPU具有非常高的電源效率,以至于CPU并不總是最主要的耗能組件。其他高耗能的組件包括高性能內存、顯示屏和射頻接口等,因此,如果電源管理系統只能調節CPU內核的電壓和頻率,那么它的用途將有限。一個真正有效的電源管理方案應該可以采用與CPU內核執行相協調或相獨立的方式,支持對一系列電壓和頻率的快速調節。
Linux支持兩種電源管理標準:APM(AdvancedPower Managememt)和ACPI(Advanced Configtlrationand P0wer Interface)。APM是傳統的高級電源管理方案,目前仍然使用在許多基于Linus便攜式設備中;而ACPI則提供了更為靈活的電腦和設備管理接口。這兩個標準不能同時運行。缺省情況下,Linux運行ACPI。APM可以使機器處于Suspend(懸掛)或Standby(待機)狀態,以及檢查電池容量;而ACPI還可以使外設(如顯示器、PCI)單獨斷電,在節省電能方面有更多的控制。為了讓電源管理功能生效,需要在Linux內核打開它,并且在Linux里加載必需的應用軟件。
電源管理活動需要對操作系統內核和設備驅動程序進行特殊的干預。在嵌入式Linux中,雖然低層電源管理駐留在操作系統內核中,但電源管理策略和機制來源于中介軟件和用戶應用程序代碼,如圖l所示。
Linux內核中電源管理機制負責維持整個系統的電源狀態。它可以看成是為驅動程序、中介軟件和應用程序提供服務的元素。
通過在驅動程序中實現電源管理接口,可以讓驅動程序密切監控系統狀態。它們在外部事件的驅動下,透過設定不同的狀態反映設備的工作情況。為了實現設備電源管理接口,需要實現以下操作:
①使用pm_register對設備的每個實例(instance)進行注冊;
②在對硬件進行操作之前調用pm_access(這樣可保證設備已被喚醒,并處于ready狀態);
③用戶自己的pnl_callback函數在系統進入suspend狀態,或者從suspend狀態恢復的時候會被調用;
④當設備不使用時調用pm_dev_idle函數(這個操作是可選的,以增強設備idle狀態的監測能力);
⑤當被unIoad的時候,使用pm_unreggister取消設備的注冊。
中介程序允許用戶預先定義某些策略,然后跟蹤電源狀態,執行特定的操作。
在應用程序中,利用中介程序提供的API,設立其基本的約束條件,強迫電源管理機制產生與其執行需求相匹配的變化。Linix電源管理的實現機制包括以下API,例如dpm_set_os()(內核)、assert_constraint()、remove_constraint()和set_operatInK—state()(內核和驅動程序)、set_policy()和set_ta
作者:國防科技大學 湯順 趙龍
摘 要:功耗是嵌入式設備的一個十分重要的性能指標。在硬件設計和選型之后,功耗水平在極大程度上取決于軟件的設計。鑒于Lioux在嵌入式設備中的應用日益廣泛,提出在嵌入式Linux下軟件編寫的幾種策略。通過這些軟件編寫方式,能有效降低最終產品的功耗水平。
關鍵詞:嵌入式Linux功耗策略
引 言
由于Linux系統具有嵌入式操作系統需要的很多特色,如適應于多種CPU和多種硬件平臺、性能穩定、可裁剪性很好、源碼開放、開發和使用簡單等。目前,基于Linux應用的嵌入式設備日益增多,Linux正在嵌入式領域發揮著越來越重要的作用。
對于嵌入式設備尤其是移動設備來說,功耗是系統的重要指標,系統設計的重要目標之一就是要盡可能地降低功耗。目前,對功耗的研究主要集中在硬件解決方案上,而軟件研究方面很少。實踐證明:在硬件設計和選型確定后,功耗的高低與軟件設計有很大的關聯性。軟件設計和編程質量的好壞,極大地影響著最終產品的功耗水平。據此,為降低功耗,提出在嵌入式Linux下軟件編程的幾種策略。
1 問題分析
因為最終耗能的是硬件,所以在考慮采用軟件方法降低功耗的時候,要充分考慮硬件的功能和性能,即在保障系統實現的基礎上怎樣組織硬件運作而使功耗降低。全速執行、待機和睡眠等行為都是利用CPU的固有能力,透過降低工作電壓或頻率來節省功耗。此外,在大多數用戶察覺不到的情況下,實際的電源管理能夠根據負載狀況逐漸改變系統的狀態,有時這種情況在l s之內可以產生數百次。
另外,在編寫程序時可能會遇到這樣的情況,如記錄狀態寄存器內容,并等待設定標記出現;檢查串口的FIFO狀態標記,看是否收到數據;監測一個雙端口存儲器,以確定系統中是否有另外CPU寫入了一個變量,以便控制共享資源。從表面上看,這樣的代碼沒有什么問題,但在每個時鐘周期里不斷記錄寄存器狀態將無法有效延長設備的電池壽命。
基于這些問題,下面提出幾種策略,以有效降低最終產品的功耗水平。
2 利用Linux內核的電源管理
電源管理策略的基礎是調整處理器內核的工作電壓和頻率。不過,現代的嵌入式CPU具有非常高的電源效率,以至于CPU并不總是最主要的耗能組件。其他高耗能的組件包括高性能內存、顯示屏和射頻接口等,因此,如果電源管理系統只能調節CPU內核的電壓和頻率,那么它的用途將有限。一個真正有效的電源管理方案應該可以采用與CPU內核執行相協調或相獨立的方式,支持對一系列電壓和頻率的快速調節。
Linux支持兩種電源管理標準:APM(AdvancedPower Managememt)和ACPI(Advanced Configtlrationand P0wer Interface)。APM是傳統的高級電源管理方案,目前仍然使用在許多基于Linus便攜式設備中;而ACPI則提供了更為靈活的電腦和設備管理接口。這兩個標準不能同時運行。缺省情況下,Linux運行ACPI。APM可以使機器處于Suspend(懸掛)或Standby(待機)狀態,以及檢查電池容量;而ACPI還可以使外設(如顯示器、PCI)單獨斷電,在節省電能方面有更多的控制。為了讓電源管理功能生效,需要在Linux內核打開它,并且在Linux里加載必需的應用軟件。
電源管理活動需要對操作系統內核和設備驅動程序進行特殊的干預。在嵌入式Linux中,雖然低層電源管理駐留在操作系統內核中,但電源管理策略和機制來源于中介軟件和用戶應用程序代碼,如圖l所示。
Linux內核中電源管理機制負責維持整個系統的電源狀態。它可以看成是為驅動程序、中介軟件和應用程序提供服務的元素。
通過在驅動程序中實現電源管理接口,可以讓驅動程序密切監控系統狀態。它們在外部事件的驅動下,透過設定不同的狀態反映設備的工作情況。為了實現設備電源管理接口,需要實現以下操作:
①使用pm_register對設備的每個實例(instance)進行注冊;
②在對硬件進行操作之前調用pm_access(這樣可保證設備已被喚醒,并處于ready狀態);
③用戶自己的pnl_callback函數在系統進入suspend狀態,或者從suspend狀態恢復的時候會被調用;
④當設備不使用時調用pm_dev_idle函數(這個操作是可選的,以增強設備idle狀態的監測能力);
⑤當被unIoad的時候,使用pm_unreggister取消設備的注冊。
中介程序允許用戶預先定義某些策略,然后跟蹤電源狀態,執行特定的操作。
在應用程序中,利用中介程序提供的API,設立其基本的約束條件,強迫電源管理機制產生與其執行需求相匹配的變化。Linix電源管理的實現機制包括以下API,例如dpm_set_os()(內核)、assert_constraint()、remove_constraint()和set_operatInK—state()(內核和驅動程序)、set_policy()和set_ta