wakeup events framework 就包括 3 大功能:
1. 解決內核空間同步問題(framework 的核心功能)
2. 解決用戶空間同步問題的情景1(wakeup count 功能)
3. 解決用戶空間同步問題的情景2(wake lock 功能)
wakeup events framework architecture
wakeup count 的功能
wakeup count 的功能是 suspend 同步,實現思路是這樣的:
1)任何想發起電源狀態切換的實體(可以是用戶空間電源管理進程,也可以是內核線程,簡稱 C),在發起狀態切換前,讀取系統的 wakeup counts(該值記錄了當前的 wakeup event 總數),并將讀取的 counts 告知 wakeup events framework。
2)wakeup events framework 記錄該 counts 到一個全局變量中(saved_count)。
3)隨后 C 發起電源狀態切換(如 STR),執行 suspend 過程。
4)在 suspend 的過程中,wakeup events framework 照舊工作(直到系統中斷被關閉),上報 wakeup events,增加 wakeup events counts。
5)suspend 執行的一些時間點,會調用 wakeup events framework 提供的接口(pm_wakeup_pending),檢查是否有 wakeup 沒有處理。
6)檢查邏輯很簡單,就是比較當前的 wakeup counts 和 saved wakeup counts(C 發起電源狀態切換時的 counts),如果不同,就要終止 suspend 過程。
wakelocks
wakelocks 是一個有故事的功能。
wakelocks 最初出現在 Android 為 linux kernel 打的一個補丁集上,該補丁集實現了一個名稱為“wakelocks”的系統調用,該系統調用允許調用者阻止系統進入低功耗模式(如 idle、suspend 等)。同時,該補丁集更改了 Linux kernel 原生的電源管理執行過程(/kernel/power/main.c 中的 state_show 和 state_store),轉而執行自定義的 state_show、state_store。
這種做法是相當不規范的,它是典型的只求實現功能,不擇手段。就像國內很多的 Linux 開發團隊,要實現某個功能,都不去弄清楚 kernel 現有的機制、框架,牛逼哄哄的猛干一番。最后功能是實現了,可都不知道重復造了多少輪子,浪費了多少資源。
kernel 的開發者是有原則的,不讓這種機制合并到 kernel 分支,直到 kernel 自身的 wakeup events framework 成熟后,這種僵局才被打破。因為 Android 開發者想到了一個壞點子:不讓合并就不讓合并唄,我用你的機制(wakeup source),再實現一個就是了。至此,全新的 wakelocks 出現了。
所以 wakelocks 有兩個,早期 Android 版本的 wakelocks 幾乎已經銷聲匿跡了。本文關注在新的 wakelocks 上(/kernel/power/wakelock.c)
Android wakelocks
但是,我們還是提一下 Android wakelocks 的功能,這樣才能知道 kernel wakelocks 要做什么。Android wakelocks 提供的功能包括:
1)一個 sysfs 文件:/sys/power/wake_lock,用戶程序向文件寫入一個字符串,即可創建一個 wakelock,該字符串就是 wakelock 的名字。該 wakelock 可以阻止系統進入低功耗模式。
2)一個 sysfs 文件:/sys/power/wake_unlock,用戶程序向文件寫入相同的字符串,即可注銷一個 wakelock。
3)當系統中所有的 wakelock 都注銷后,系統可以自動進入低功耗狀態。
4)向內核其它 driver 也提供了 wakelock 的創建和注銷接口,允許 driver 創建 wakelock 以阻止睡眠、注銷 wakelock 以允許睡眠。
Kernel wakelocks
1)允許 driver 創建 wakelock 以阻止睡眠、注銷 wakelock 以允許睡眠:已經由 wakeup source 取代。
2)當系統中所有的 wakelock 都注銷后,系統可以自動進入低功耗狀態:由 autosleep 實現。
3)wake_lock 和 wake_unlock 功能:就是將 wakeup source 開發到用戶空間訪問。
autosleep 的功能很直白,“系統沒有事情在做”的時候,就將系統切換到低功耗狀態。
-
嵌入式
+關注
關注
5198文章
20442瀏覽量
333989 -
Android
+關注
關注
12文章
4024瀏覽量
133978 -
接口
+關注
關注
33文章
9519瀏覽量
157020 -
Linux
+關注
關注
88文章
11758瀏覽量
219009
發布評論請先 登錄
.Net Micro Framework 快速入門
sushu---Actor Framework基本介紹
stm32的引腳wakeup有什么作用
.NET Micro Framework開發板介紹
.NET Framework 高級編程
基于Microsoft .NET Framework的OPC
Meter Design for Power Failure Events
Linux電源管理總體框架及實現原理
專題分綱目錄 Android Framework 電源子系統
Events(事件)概述、配置及使用方法
SystemVerilog里的regions以及events的調度
Wakeup events framework同步問題
framework框架流程 模塊綁定
深度揭秘GPIO的三重身份:從普通IO到AGPIO與Wakeup IO
wakeup events framework三大功能介紹
評論