当前位置:文档之家› Android智能手机平台电源管理技术

Android智能手机平台电源管理技术

Android智能手机平台电源管理技术

苏健

(重庆大学软件学院,重庆400044)

摘要:随着智能手机的普及发展,对系统的功能、可靠性、成本、体积、功耗提出了更严格的要

求,特别是电池供电系统,在电池性能严重滞后于手持终端设备需求的背景下,电源管理技术正成为这些产品设计的关键所在。在满足功能实现的前提下,使手机待机时间更长的电源管理技术已成为研究热点。通过分析目前流行的and谳d智能手机电源管理技术,探讨其现状并研究其应用前

景。关键词:Android系统;电源管理;智能手机

DOI编码:lO.3969/j.issn.1002—2279.2011.05.018中图分类号:TP36文献标识码:A文章编号:1002—2279【2011)05—0066—04

AndroidSmartPhOnePIatfOrmPOwerManagementTeChnOIOgy

SUJian(‰scJIl0Df矿黝啪reE嚼鹏e^r曙‰哪嘶所龇瑙渺,‰,嘲嘲400044,傩溉)

Abstract:witllthepopularit)rofthedevelopnlentofgmanphones,山esystem7sfunctionalit)r,

reliability。cost,size,powerconsumptionmademorestringentrequirements,inpanicuIar,battery—pw—

eredsystems’batterype怕瑚ancehasseriouslylaggedbehind.P0wermanagementtechnolog)risbecoming

t}lekeytothedesignoftheseproducts.undertllepremiseoffunction,longerstandbytimepowermanage。

menthasbecomeahotzone.卟ispaperanalysespopuIarandIDidsmanphonepowermanagement

technolo#呵andexploresthecun.entsituationandapplicationpI.ospect.

Keywords:Android;Powermanagement;Smartphone

l引言

电源管理是移动设备中最关键的技术之一,特

别是对于现代的智能手机,具有大屏幕,高频处理器,大内存,各种外设多(gps,c砌era,传感器),多任

务操作系统等特点,电源管理尤其显得重要。谷歌

的Android系统是一个平等开放的平台,其内核采

用linux,上层应用采用java,由于其稳定、开发简易

及无法比拟的资源整合,其在智能手机市场中所占

份额越来越大。linux内核层面对电源管理的支持是Andmid电源管理技术基础。

2“nux电源管理

对“nux嵌入式系统而言,电源管理可以分为静态电源管理,动态电源管理,设备电源管理等三个方面。

2.1静态电源管理Linux内核支持ON,standby,Suspend和Hiber—

Ilate四种电源状态。Standby指“带电挂起”,通过将

CPu置于halt状态,将设备置于Dl状态来达到节

能的目的(ACPI规范中按能耗从高到低分D0~

D3)。节能效果不明显,但是响应延迟最小。Sus—

pend就是挂起到RAM。在该状态下,所有设备被置

于D3状态,整个系统,除主存处于节电的自刷新模

式(self—refresh)外,全部关闭电源。响应延迟比

Standby大。Hibemate是通过将系统状态保存到非

易挥发性存储中(通常是磁盘),关闭整个系统的电

源。延迟时间最长,但比一次完整启动来得短。通

常情况下嵌入式设备都没有支持这种方式。

通过sysfs文件系统接口触发系统级电源状态

伤萱简佥:苏健(1975一),男,重庆市人,学士,主研方向:软件项目管理.嵌入式系统。

收稿日期:20lO—12—06

万方数据5期苏健:Andmid智能手机平台电源管理技术・67・

转化。转换管理是通过注册好的驱动来进行。例

如,prepare函数确认系统能够进入所请求的状态,并且进行相应的准备工作。例如通过禁止抢占和

“冷冻”所有进程来准备进入所请求的电源状态。

save函数枚举所有注册有电源管理能力的设备,保

存系统和处理器的低层状态。接着PM核心禁止中

断,关闭外部设备电源,调用Sleep函数根据挂起级

别进入睡眠状态。在嵌人式设备挂起过程中可以通

过写人某些特殊的非易失性处理器寄存器来记录挂

起的原因和挂起时的代码执行地址。系统上电后引导程序先执行,从特殊寄存器中判断系统是否从深

度睡眠(Hibemation)中恢复。如果是,则负责从非

易挥发性存储介质中恢复所有的硬件上下文。如果

不是,系统负责从sleep()函数处返回。给所有设备

上电,恢复中断。Restore函数被用来恢复系统的低

层调用,恢复设备上下文。CleaIlup函数从sleep状态恢复必须进行的清尾工作,例如抢占重新被允许,

系统恢复正常执行。当一次完整的转换完成后,CPu执行权还给之前执行的进程。

2.2动态电源管理

动态电源管理技术提供一种操作系统级别的电

源管理能力,包含工作频率和电压,外部总线时钟频

率,外部设备时钟/电源等方面的动态调节及管理功

能等。通过用户层制定策略与内核提供管理功能交

互,实时调整电源参数同时来满足系统实时应用的需求,允许电源管理参数在短时间的空闲或任务运

行在低电源需求时,可以被频繁地、低延迟地调整,

从而实现更精细、更智能的电源管理。

通过调节电压、频率来减少系统活动功耗需要

硬件支持。系统一般有多个执行单元,如电源管理

模块、片上晶振模块、锁相环模块、CPU核以及CPU

核中的数据缓存和指令缓存,其他模块统称为外围

模块(例如LCD控制器、UART、SDRAM控制器等)。

CPU高频时钟主要由PLL提供,同时PLL也为外围

模块和总线提供其他频率时钟。电源管理模块主要管理系统的电源供应状态。一般有自己的低频、高

准确度晶振,用以维持一个RTC时钟、RTC定时器和中断控制单元。其中中断控制单元使RTc定时

器和外部设备能够唤醒挂起的系统。

2.3设备电源管理

在某些设备闲置时可以被主动关闭,从而节电。

在2.6内核中需要实现总线以及设备的电源管理支持,在驱动中需要实现设备驱动的suspend/resume

函数。

关闭一个设备。其驱动的su8pend方法需要两

个不同的调用,一个用来保存状态.另外一个用来关

闭设备电源。相反,resume方法需要一个调用用来

给设备供电,另一个调用来恢复设备的状态。在关

闭一个总线设备时必须关闭所有的下一级子设备。

相反地,重新使能总线设备时,必须先使能根设备,然后再使能子设备。

3android电源管理

Android智能手机平台的操作系统仍然是

UNUx,只是在LINuX内核的基础上增加了Android

相关的驱动,也就是UNux的蹦ve璐目录下的an.

droid,其中包括alann。binder。pmem,power,timed—gpio等模块。

Power模块就是针对Andmid智能手机平台的

电源管理模块,也是应用和驱动结合的模块。An.

droid的电源管理和标准UNUX的电源管理还是有

很大的差别。

标准uNux的电源管理接口:

echo’’standby”>/8y&/power/state

echo”mem’’>/sy&/power/stateecho”deepsleep”>/sy∥poweI./stateAndroid的电源管理接口:

echo”standby”>/sy&/android—power/reque3【一State

echo’’wake”>/sys/andmid—power/request—statecat/sy∥蛐droid—power/acquire—panial—wake—Iock

cat/sys/andmid—power/rele踮e—wakejock

cat/sys/android-power/reque虬一state接下来从Java应用层面,Andmidframework层

面,“nux内核层面分别进行详细讨论:

3.1Java应用层面

Android提供了现成的aJldroid.os.PowerManag.

er类,该类用于控制设备电源状态的切换。该类对

外有三个接口函数:

VoidgoTosleep(10ngtime);//强制设备进入

S1eep状态

newwakeLock(intnags,Stringtag);//取得相

应层次的锁

万方数据・68・微处理机2011年

voiduserActivity(10ngwhen,booleaIlnoChange一

“ghts).//u¥eractivit)r事件发生,设备会被切换到

Fullon状态,同时ResetScreenofftimer.

3.2Androidframework层面

Framework层面主要代码文件如下:

fhmeworks\base\core\iava\andmid\os\Power—

MaIlager.jaVafhmeworks\base\sen五ces\iava、com\锄droid、

server、P0werManagersen,ice.java

fhmeworks\base\core、java、锄droid\os\P0wer.

jaVaf}帅eworks\base\cor℃\jni\android—os—power.cpp

hardware\libhar(1ware\power\power.c其中PowerManage焉enrice.java是核心,Power.

java提供底层的函数接口,与JNI层进行交互,JNI

层的代码主要在文件andmid—os—Power.cpp中,与Linu)【kemel交互是通过P0wer.c来实现的,Andriod

跟Kemel的交互主要是通过sys文件的方式来实现

的,具体请参考Kemel层的介绍。

3.3“nux内核层面

Android的电源管理主要是通过Wakekk来

实现的,在最底层主要通过如下三个队列来实现其

管理:

staticLIsT—HEAD(gjnactivejocks);

staticLIST—HEAD(g—actiVe—panial—wake—locks);

staticLIST—HEAD(&Jctive-fhU二wakejocks);

所有初始化后的kk都会被插入到g-iIlactive一10cks队列中,而当前活动的p枷alwakelock都会被

插入到g—active—paItial—wake_10cks队列中,活动的

fuUwakelock被插入到g—active—fuU—wake—kks队

列中,所有的p叭ialwakelock和fuUwakelock在过

期后或unlock后都会被移到inactive队列,等待下次调用。

在Kemel层使用wakelock步骤如下:

(1)调用函数android-in“一8uspenQ_lock初始化一个wakelock(2)调用相关申请kk的函数android—kk—

suspend司£andl-oid—lock—suspend—auto—expiIe请求‰k,这里只能申请partialwakelock,如果要申请FuUwakelock,则需要调用函数android—lock—partial

?uspend—auto—expire(该函数没有E)(PORT出来),这个命名有点奇怪,不要跟前面的androidjock—sus—

pend_auto.expire搞混了o

(3)如果是autoexpire的wakelock则可以忽

略,不然则必须及时把相关的wakelock释放掉,否

则会造成系统长期运行在高功耗状态。

(4)在驱动卸载或不再使用Wakelock时请记

住及时调用andmid_unin“一suspenQ—lock释放资源。系统有三种状态:usER—AwAl@(FuUonsta—tus);USER—NOTIFICATION(EadysuspendeddriVer

butCPUkeepon);USER—SLEEP(CPUentersleepmode)。系统正常开机后进入到AWAKE状态,Backli曲t会从最亮慢慢调节到用户设定的亮度,系

统screen硪timer(settings一>sound&display一>

Disphysettings一>screentimeout)开始计时,在计

时时间到之前,如果有任何的activit)r事件发生,如

T0uchclick,keyboardpressed等事件,则将Reset

screenofftimer,系统保持在AwAKE状态。如果有

应用程序在这段时间内申请了FuUwakelock,那么

系统也将保持在AWAKE状态,除非用户按下power

key。在AwAKE状态下如果电池电量低或者是用

AC供电8creeno珏timer时间到并且选中Keep

screenonwhileplugedin选项,backli出t会被强制调

节到DIM状态。

如果screenofftimer时间到并且没有FuUwake

lock或者用户按了powerkey,那么系统状态将被切

换到NOTIFICAl'ION,并且调用所有已经注册的¨ady—suspenQ—handlers函数,通常会把LCD和

Backlight驱动注册成eadysuspend类型,如有需要

也可以把别的驱动注册成earlysuspend,这样就会

在第一阶段被关闭。接下来系统会判断是否有

panialwakelockacquired,如果有则等待其释放,在等待过程中如果有useractivity事件发生,系统则马

上回到AwAKE状态;如果没有panialwakelockac.quired,则系统会马上调用函数pm—suspend关闭其

它相关的驱动,让CPu进入休眠状态。

系统在Sleep状态时如果检测到任何一个

wakeupsource,则CPu会从Sleep状态被唤醒,并且

调用相关驱动的resume函数,接下来马上调用前期

注册的edysuspend驱动的resume函数,最后系统

状态回到AWAKE状态。

Android与标准Linux休眠的区别:

pm—suspend()虽然会调用enter—state()来进

万方数据

相关主题