wakeup events framework 就包括 3 大功能:
1. 解決內(nèi)核空間同步問題(framework 的核心功能)
2. 解決用戶空間同步問題的情景1(wakeup count 功能)
3. 解決用戶空間同步問題的情景2(wake lock 功能)
wakeup events framework architecture
wakeup count 的功能
wakeup count 的功能是 suspend 同步,實現(xiàn)思路是這樣的:
1)任何想發(fā)起電源狀態(tài)切換的實體(可以是用戶空間電源管理進(jìn)程,也可以是內(nèi)核線程,簡稱 C),在發(fā)起狀態(tài)切換前,讀取系統(tǒng)的 wakeup counts(該值記錄了當(dāng)前的 wakeup event 總數(shù)),并將讀取的 counts 告知 wakeup events framework。
2)wakeup events framework 記錄該 counts 到一個全局變量中(saved_count)。
3)隨后 C 發(fā)起電源狀態(tài)切換(如 STR),執(zhí)行 suspend 過程。
4)在 suspend 的過程中,wakeup events framework 照舊工作(直到系統(tǒng)中斷被關(guān)閉),上報 wakeup events,增加 wakeup events counts。
5)suspend 執(zhí)行的一些時間點,會調(diào)用 wakeup events framework 提供的接口(pm_wakeup_pending),檢查是否有 wakeup 沒有處理。
6)檢查邏輯很簡單,就是比較當(dāng)前的 wakeup counts 和 saved wakeup counts(C 發(fā)起電源狀態(tài)切換時的 counts),如果不同,就要終止 suspend 過程。
wakelocks
wakelocks 是一個有故事的功能。
wakelocks 最初出現(xiàn)在 Android 為 linux kernel 打的一個補(bǔ)丁集上,該補(bǔ)丁集實現(xiàn)了一個名稱為“wakelocks”的系統(tǒng)調(diào)用,該系統(tǒng)調(diào)用允許調(diào)用者阻止系統(tǒng)進(jìn)入低功耗模式(如 idle、suspend 等)。同時,該補(bǔ)丁集更改了 Linux kernel 原生的電源管理執(zhí)行過程(/kernel/power/main.c 中的 state_show 和 state_store),轉(zhuǎn)而執(zhí)行自定義的 state_show、state_store。
這種做法是相當(dāng)不規(guī)范的,它是典型的只求實現(xiàn)功能,不擇手段。就像國內(nèi)很多的 Linux 開發(fā)團(tuán)隊,要實現(xiàn)某個功能,都不去弄清楚 kernel 現(xiàn)有的機(jī)制、框架,牛逼哄哄的猛干一番。最后功能是實現(xiàn)了,可都不知道重復(fù)造了多少輪子,浪費(fèi)了多少資源。
kernel 的開發(fā)者是有原則的,不讓這種機(jī)制合并到 kernel 分支,直到 kernel 自身的 wakeup events framework 成熟后,這種僵局才被打破。因為 Android 開發(fā)者想到了一個壞點子:不讓合并就不讓合并唄,我用你的機(jī)制(wakeup source),再實現(xiàn)一個就是了。至此,全新的 wakelocks 出現(xiàn)了。
所以 wakelocks 有兩個,早期 Android 版本的 wakelocks 幾乎已經(jīng)銷聲匿跡了。本文關(guān)注在新的 wakelocks 上(/kernel/power/wakelock.c)
Android wakelocks
但是,我們還是提一下 Android wakelocks 的功能,這樣才能知道 kernel wakelocks 要做什么。Android wakelocks 提供的功能包括:
1)一個 sysfs 文件:/sys/power/wake_lock,用戶程序向文件寫入一個字符串,即可創(chuàng)建一個 wakelock,該字符串就是 wakelock 的名字。該 wakelock 可以阻止系統(tǒng)進(jìn)入低功耗模式。
2)一個 sysfs 文件:/sys/power/wake_unlock,用戶程序向文件寫入相同的字符串,即可注銷一個 wakelock。
3)當(dāng)系統(tǒng)中所有的 wakelock 都注銷后,系統(tǒng)可以自動進(jìn)入低功耗狀態(tài)。
4)向內(nèi)核其它 driver 也提供了 wakelock 的創(chuàng)建和注銷接口,允許 driver 創(chuàng)建 wakelock 以阻止睡眠、注銷 wakelock 以允許睡眠。
Kernel wakelocks
1)允許 driver 創(chuàng)建 wakelock 以阻止睡眠、注銷 wakelock 以允許睡眠:已經(jīng)由 wakeup source 取代。
2)當(dāng)系統(tǒng)中所有的 wakelock 都注銷后,系統(tǒng)可以自動進(jìn)入低功耗狀態(tài):由 autosleep 實現(xiàn)。
3)wake_lock 和 wake_unlock 功能:就是將 wakeup source 開發(fā)到用戶空間訪問。
autosleep 的功能很直白,“系統(tǒng)沒有事情在做”的時候,就將系統(tǒng)切換到低功耗狀態(tài)。
-
嵌入式
+關(guān)注
關(guān)注
5125文章
19438瀏覽量
313199 -
Android
+關(guān)注
關(guān)注
12文章
3959瀏覽量
129240 -
接口
+關(guān)注
關(guān)注
33文章
8885瀏覽量
152990 -
Linux
+關(guān)注
關(guān)注
87文章
11420瀏覽量
212361
發(fā)布評論請先 登錄
相關(guān)推薦
.Net Micro Framework 快速入門
sushu---Actor Framework基本介紹
stm32的引腳wakeup有什么作用
.NET Micro Framework開發(fā)板介紹
.NET Framework 高級編程

基于Microsoft .NET Framework的OPC
Meter Design for Power Failure Events
Linux電源管理總體框架及實現(xiàn)原理

專題分綱目錄 Android Framework 電源子系統(tǒng)

Android Framework 電源子系統(tǒng)(06)電池管理

Events(事件)概述、配置及使用方法
SystemVerilog里的regions以及events的調(diào)度

Wakeup events framework同步問題
framework框架流程 模塊綁定

評論