1. 程式人生 > 實用技巧 >【Android休眠】引申之關於系統PM的思考

【Android休眠】引申之關於系統PM的思考

受不了xxxx噁心人的行為,遂搬遷至部落格園。
始發:2017-01-22 15:42:20

一、開篇

對於一個完整的系統,我們在做 PM(Power Manager) 相關的事情時,應該(至少)其休眠涉及三個部分:

  • 使用者(User Space)
  • CPU(Kernel)
  • 外設

關係圖示:

二、使用者(User Space)

作為完成具體業務的角色,它產生是否允許系統進行休眠的訊息。Kernel對訊息做出休眠/繼續工作的反應。比如:
Android裝置後臺在播放音樂,那麼播放器就會採取一定方式(比如休眠鎖的方式)告知系統不能休眠;kernel得到禁止休眠的訊息就一直處於工作狀態。

三、CPU(kernel)

這裡,CPU針對硬體,kernel針對執行在CPU中的軟體(Linux)。CPU硬體支援某幾種休眠模式,由kernel實現對這幾種休眠模式的控制。
kernel除了控制CPU外,還提供了訪問各種外設的驅動程式;驅動程式中,有一部分程式碼就是做休眠之類的工作,比如常見的:

#ifdef CONFIG_PM
static int xxx_suspend(struct platform_device *dev, pm_message_t state)
{
}
 
static int xxx_resume(struct platform_device *dev)
{
}
 
#else
#define xxx_suspend NULL
#define xxx_resume  NULL
#endif
 
static struct platform_driver xxx_driver = {
    .suspend= xxx_suspend,
    .resume = xxx_resume,
};

kernel進入休眠時,呼叫驅動註冊的xxx_suspend()函式,喚醒時呼叫xxx_resume()函式。

四、外設

這裡把外設分作兩類:
自帶CPU型別的外設:即外設有自己的控制中心,比如4G模組/WiFi模組等。這種情況下,在休眠/喚醒動作發生時,通過通訊鏈路告知外設執行休眠/喚醒。
被動外設:外設的行為完全由kernel控制,典型的就是led。這種情況下的休眠/喚醒比較簡單,按照外設支援的方式操作即可,最簡單的方式就是斷電/上電(比如休眠的時候關閉led)。