【Android休眠】引申之關於系統PM的思考
阿新 • • 發佈:2020-08-03
受不了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)。