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

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

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

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

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

Wakeup events framework同步問(wèn)題
framework框架流程 模塊綁定

評(píng)論