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 的功能很直白,“系统没有事情在做”的时候,就将系统切换到低功耗状态。
-
嵌入式
+关注
关注
5082文章
19111浏览量
304885 -
Android
+关注
关注
12文章
3935浏览量
127354 -
接口
+关注
关注
33文章
8580浏览量
151049 -
Linux
+关注
关注
87文章
11296浏览量
209366
发布评论请先 登录
相关推荐
.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 电源子系统

Android Framework 电源子系统(06)电池管理

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

Wakeup events framework同步问题
framework框架流程 模块绑定

评论