Android电源管理框架

一、wakelock机制
Android电源管理使用的wakelock机制:系统中有激活(未释放)的wakelock存在,系统就不能进入休眠状态;如果系统没有激活的wakelcok存在,则系统立即进入到休眠状态。
wakelock按加锁的方式有两种:永久锁,这样的锁除非显示的放开,是不会解锁的,所以这种锁的使用是非常小心的;超时锁,这种锁会锁定系统唤醒一段时间,如果这个时间过去了,这个锁会自动解除。

Wakelock按锁定系统的状态有两种:WAKE_LOCK_SUSPEND:这种锁会防止系统进入睡眠(suspend);WAKE_LOCK_IDLE:这种锁不会影响系统的休眠,用于阻止系统在持有锁的过程中进入低功耗状态。即直到wake_lock被释放,系统才会从idle状态进入低功耗状态,此低功耗状态将使中断延迟或禁用一组中断。

内核中维护了两种类型的wakelock链表,是一个处于激活状态的wakelock,另外一个是处于未激活状态的wakelock链表。
激活状态的wakelock链表:
active_wake_locks[WAKE_LOCK_TYPE_COUNT]
   active_wake_locks[0]维护的是suspend lock.(用户申请的多为suspend类型)
   active_wake_locks[1]维护的是idle lock.
未激活状态的wakelock链表:
一个链表,inactive_locks来记录所有处于inactive状态的锁.


二、sys用户接口
Android在sys目录下提供了操作内核wakelock的接口。
2.1 获得系统支持的休眠状态
#cat /sys/power/state    //得到系统支持的休眠等级信息
Linux默认的有standby、mem、disk
2.2 设置系统休眠状态
#echo state_name >/sys/power/state  //将设置系统即将处于的休眠状态,执行该命令后系统首先会进入early_suspend分支处理流程,如果在该流程中,系统中的active_wake_locks链表中的元素为空,则系统里面休眠;否则,系统继续处在early_suspend状态。

early_suspend处理分支是Android有别于标准Linux电源管理的地方。标准Linux中,休眠时所有设备同时进入到休眠状态或者同时被唤醒。Android中,可以先把某些设备先进入到睡眠状态,等到系统中所有的wakelock被释放后,剩余的设备才会进入到休眠状态。这样做的目的在于:可以使某些耗电的设备提前关闭(比如显示器在播放音乐时可以提前关闭)达到省电的目的。实现方式:在设备驱动函数的编写的时候对它的early_suspend函数指针进行赋值,然后系统会将设备的early_suspend方法组织成一个链表,供Android进入到early_suspend调用。
当系统处于early_suspend的时候,整个系统并没有完全休眠,只是屏幕这些有支持early_suspend方法的设备处于休眠,如果用户想唤醒整个系统可以使用下面的命令:
#echo on > /sys/power/state
2.3 查看系统wakelock状态
#cat /proc/wakelocks  //会按下面按列罗列出所有的锁的状态信息
Name(锁名称)    count(使用次数)    expire_count(终止次数)    wake_count(唤醒次数) active_since(是否激活)    total_time(总时间) sleep_time(睡眠时间) max_time(最大时间) last_change(最后状态改变时间)
#dumpsys power 
2.4 锁的上锁和释放
#echo lock_name > /sys/power/wake_locks //给该锁上锁
#echo lock_name > /sys/power/wake_unlocks //释放该锁
#cat /sys/power/wake_locks    //罗列出系统中激活的锁
#cat /sys/power/wake_unlocks  //罗列出系统中未激活的锁
2.5 打开调试信息
echo N > /sys/module/printk/parameters/console_suspend //使控制台在suspend最后才关闭,这样可以打印出休眠过程完整信息
echo 0xff  >  /sys/module/wakelock/parameters/debug_mask
echo 0xff > /sys/module/userwakelock/parameters/debug_mask//打开wakelock调试信息,使得每次锁的释放和上锁信息都会打印出来

三、Linux内核调用关系
下面为linux内核中电源管理相关的源码位置
linux_source/kernel/power/main.c
linux_source/kernel/power/earlysuspend.c
linux_source/kernel/power/wakelock.c
linux_source/kernel/power/process.c
linux_source/driver/base/power/main.c
linux_source/arch/xxx/mach-xxx/pm.或
linux_source/arch/xxx/plat-xxx/pm.c

当用户读写/sys/power/state时,linux_source/kernel/power/main.c中的state_store()函数会被调用,它是系统进入休眠模式的入口。




四、参考资料

http://blog.csdn.net/myarrow/article/details/8136691
http://wenku.baidu.com/view/3201eb8b680203d8ce2f24ed.html?qq-pf-to=pcqq.c2c

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值