基于Android的Linux内核的电源管理:概述

2022-05-06 07:32:32柯树博
导读 大家好,我是本期栏目编辑小友,现在为大家讲解基于Android的Linux内核的电源管理:概述问题。 1 电源管理的状态。 Android Linux内核

大家好,我是本期栏目编辑小友,现在为大家讲解基于Android的Linux内核的电源管理:概述问题。

1.电源管理的状态。

Android Linux内核为系统提供了四种电源状态。内核的源代码定义了其中三个的名称和相应的宏定义。这些名称在内核/电源/挂起中定义。

[cpp]查看普通copy const char * const PM _ States[PM _ SUSPEND _ MAX]={ 0

#ifdef CONFIG_EARLYSUSPEND

[PM_SUSPEND_ON]=“开”,

#endif

[PM _ SUSPEND _待机]=“待机”,

[PM _ SUSPEND _ MEM]=“mem”,

};

的宏定义在:include/Linux/suspend . h;

[cpp]查看普通copy typedef int _ _ bitwise suspend _ state _ t;

#定义PM _ SUSPEND _ ON(_ _强制挂起_状态_t) 0)

#定义PM _挂起_待机(_ _强制挂起_状态_t) 1)

#定义PM _挂起_ MEM(_ _强制挂起_状态_t) 3)

#定义PM _挂起_最大值(_ _强制挂起_状态_t) 4)

奇怪的是,第四种状态(磁盘)没有具体的定义,而是在代码中硬编码。不知道为什么会这样做,至少我现在看到的版本是这样的(2.6.35)。这就是所谓的挂起到磁盘或休眠。但这不是重点。此外,目前支持hibernate的安卓设备很少。

顾名思义:

PM _ suspend _ on-设备处于全功率状态,即正常工作状态;

PM _ suspend _待机-设备处于省电状态,但也可以接收一些事件,具体行为取决于具体设备;

PM _ suspend _ MEM-暂停到内存,设备进入睡眠,但所有数据仍存储在内存中,只有一些外部中断可以唤醒设备;

目前大多数安卓设备只支持其中的两个:PM_SUSPEND_ON和PM_SUSPEND_MEM,所以下面的讨论是指PM_SUSPEND_MEM。

2.提前暂停、延迟恢复

提前暂停和延迟恢复是基于标准Linux的安卓的附加功能。当用户空间请求内核进入挂起时,会先进入早期挂起状态,驱动可以注册早期挂起的回调函数。当进入这种状态时,内核会逐个调用这些回调函数。例如,显示屏的驱动程序通常会注册早期挂起,在他的回调函数中,驱动程序会关闭屏幕和背光。在这种状态下,所有后台进程都还在活动,应该播放的歌曲和下载的数据还在下载,但是显示画面不好。进入早期挂起状态后,一旦所有唤醒锁被释放,系统将立即进入真正的挂起过程,直到系统停止工作,等待外部事件的唤醒。

图2.1电源状态的转换。

3.安卓电源锁定机制:唤醒锁定。

与标准的Linux内核相比,Android在电源管理上增加了唤醒锁定机制。一旦应用了某一类型的锁定,电源管理模块将“锁定”某一电源状态。目前安卓提供两种锁:

wake _ lock _ suspend-防止系统进入挂起状态;

wake _ lock _ idle-防止系统进入空闲状态;

唤醒锁也可以设置超时,时间到了自动解除锁定。

关于唤醒锁的代码在:kernel/power/wakelock.c。

4.电源状态迁移。

内核启动后,电源管理系统将在sysfs文件系统中创建三个文件:

/sys/power/state

/sys/power/wake_lock

/sys/电源/唤醒_解锁

电源状态的迁移首先由用户空间应用执行。

序发起,当系统应用检测到一定时间内没有用户活动后(例如触摸屏、按键),可以向/sys/power/state文件写入相应的电源状态名称(请参考第一节内容),如果写入“mem”,将会触发内核启动suspend的流程,内核将会按照图2.1进行状态的迁移。应用程序也可以通过/sys/power/wake_lock申请一个WAKE_LOCK_SUSPEND 类型的锁,相应地,通过/sys/power/wake_unlock则可以释放一个锁。内核在进入suspend之前如果检测到某个锁没有释放,则会放弃本次的suspend过程,直到这个锁释放为止。

  1. 电源管理的状态

  Android的Linux内核为系统提供了4种电源状态,内核的源代码为其中的3种定义了名字和对应的宏定义,名字定义在kernel/power/suspend.c中:

  [cpp] view plain copyconst char *const pm_states[PM_SUSPEND_MAX] = {

  #ifdef CONFIG_EARLYSUSPEND

  [PM_SUSPEND_ON] = “on”,

  #endif

  [PM_SUSPEND_STANDBY] = “standby”,

  [PM_SUSPEND_MEM] = “mem”,

  };

  对应的宏定义在:include/linux/suspend.h中:

  [cpp] view plain copytypedef int __bitwise suspend_state_t;

  #define PM_SUSPEND_ON ((__force suspend_state_t) 0)

  #define PM_SUSPEND_STANDBY ((__force suspend_state_t) 1)

  #define PM_SUSPEND_MEM ((__force suspend_state_t) 3)

  #define PM_SUSPEND_MAX ((__force suspend_state_t) 4)

  很奇怪的是,第四种状态(disk)没有具体的定义,而是硬编码在代码中,不明白为什么会这样做,至少我现在看的版本是这样(2.6.35),这种就是所谓的suspend to disk或者叫hibernate。不过这不是重点,再说,目前也很少有Android的设备支持hibernate。

  顾名思义:

  PM_SUSPEND_ON -- 设备处于全电源状态,也就是正常工作状态;

  PM_SUSPEND_STANDBY -- 设备处于省电状态,但还可以接收某些事件,具体的行为取决与具体的设备;

  PM_SUSPEND_MEM -- suspend to memory,设备进入睡眠状态,但所有的数据还保存在内存中,只有某些外部中断才可以唤醒设备;

  目前,大多数的Android设备都只支持其中的两种:PM_SUSPEND_ON 和 PM_SUSPEND_MEM,所以下面的讨论说道suspend的地方,均是指PM_SUSPEND_MEM。

  2. Early Suspend、Late Resume

  Early Suspend和Late Resume是Android在标准Linux的基础上增加的一项特性。当用户空间的向内核请求进入suspend时,这时候会先进入early suspend状态,驱动程序可以注册early suspend的回调函数,当进入该状态时,内核会逐一地调用这些回调函数。例如显示屏的驱动程序通常会注册early suspend,在他的回调函数中,驱动程序会把屏幕和背光都关闭。在这种状态下,所有的后台进程都还在活动中,该播放歌曲的播放歌曲,该下载数据的依然在下载,只是显示屏不良而已。进入early suspend状态以后,一旦所有的电源锁(wake lock)被释放,系统马上会进入真正的suspend流程,直到最后系统停止工作,等待外部事件的唤醒。

  

  图2.1 电源状态的转换

  3. Android的电源锁机制:wake lock

  Android相比标准的Linux内核,在电源管理中加入了wake lock机制。一旦申请了某种类型的锁,电源管理模块将会“锁住”某一种电源状态,目前,Android提供了两种类型的锁:

  WAKE_LOCK_SUSPEND -- 阻止系统进入suspend状态;

  WAKE_LOCK_IDLE -- 阻止系统进入idle状态;

  wake lock也可以设定超时,时间一到,自动释放该锁。

  有关wake lock的代码在:kernel/power/wakelock.c中。

  4. 电源状态迁移

  内核启动完成以后,电源管理系统会在sysfs文件系统中建立3个文件:

  /sys/power/state

  /sys/power/wake_lock

  /sys/power/wake_unlock

  电源状态的迁移首先由用户空间的应用程序发起,当系统应用检测到一定时间内没有用户活动后(例如触摸屏、按键),可以向/sys/power/state文件写入相应的电源状态名称(请参考第一节内容),如果写入“mem”,将会触发内核启动suspend的流程,内核将会按照图2.1进行状态的迁移。应用程序也可以通过/sys/power/wake_lock申请一个WAKE_LOCK_SUSPEND 类型的锁,相应地,通过/sys/power/wake_unlock则可以释放一个锁。内核在进入suspend之前如果检测到某个锁没有释放,则会放弃本次的suspend过程,直到这个锁释放为止。

技术专区 睿赛德科技喜迁新址 ,RT-Thread进入新的加速发展阶段 可靠性高、控制灵活、低功耗可调速风扇散热系统 安防监控摄像头LED驱动解决方案 如何定制嵌入式Linux发行版 基于SoC实现的数据采集系统详解
免责声明:本文由用户上传,如有侵权请联系删除!