Android电源管理-休眠简要分析
2014-06-25 13:58
127 查看
工作需要,需要对这一块深入学习。故在此做一点分析记录,存疑解惑。
一、开篇
1.Linux 描述的电源状态
- On(on) S0 - Working
- Standby (standby) S1 - CPU and RAM are powered but not executed
- Suspend to RAM(mem) S3 - RAM is powered and the running content is saved to RAM
- Suspend to Disk,Hibernation(disk) S4 - All content is saved to Disk and power down
S3 aka STR(suspend to ram),挂起到内存,简称待机。计算机将目前的运行状态等数据存放在内存,关闭硬 盘、外设等设备,进入等待状态。此时内存仍然需要电力维持其数据,但整机耗电很少。恢复时计算机从内存读出数据,回到挂起前的状态,恢复速度较快。对 DDR的耗电情况进行优化是S3性能的关键,大多数手持设备都是用S3待机。
S4 aka STD(suspend to disk),挂起到硬盘,简称休眠。把运行状态等数据存放在硬盘上某个文件或者某个特定的区域,关闭硬盘、外设等设备,进入关机状态。此时计算机完全关闭,不耗电。恢复时计算机从休眠文件/分区中读出数据,回到休眠前的状态,恢复速度较慢。电子书项目中,见过一款索尼的电子书,没有定义关机状态,只定义了S4,从而提高开机速度。
以上摘录自:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763104
6893b4c4380147d8c8c4668d4e419ce3b4c413037bfa6663f405a8e906b6075fc
4d5bedfb6079370123b598938f4a85ac925f75ce786a6459db0144dc5bf0dc475
5d627e44de8df4aa0fcad7384afa28d880311dd52756d87849c5b704f9634b6&p
=c933cc16d9c116f51ebd9b7d0a13cd&newp=8366c54ad5c444e411b3c22d0214cf2
31610db2151d6db10349dcd1e&user=baidu&fm=sc&query=pm_autosleep_init&qid=&p1=1
在阅读下面的内容之前,强烈建议阅读下。
Android在Linux内核原有的睡眠唤醒机制上面新增了三个,如下:
• Wake Lock 唤醒锁机制;
• Early Suspend 预挂起机制;
• Late Resume 迟唤醒机制;
我们来看一张Android睡眠唤醒机制的框架图:
View Code
TAG:
未完待续......
本文很多内容参考且摘录自:
http://blog.csdn.net/myarrow/article/details/8136691 http://blog.csdn.net/myarrow/article/details/8137952 http://blog.csdn.net/myarrow/article/details/8137566 http://blog.csdn.net/sunweizhong1024/article/details/17102047
一、开篇
1.Linux 描述的电源状态
- On(on) S0 - Working
- Standby (standby) S1 - CPU and RAM are powered but not executed
- Suspend to RAM(mem) S3 - RAM is powered and the running content is saved to RAM
- Suspend to Disk,Hibernation(disk) S4 - All content is saved to Disk and power down
S3 aka STR(suspend to ram),挂起到内存,简称待机。计算机将目前的运行状态等数据存放在内存,关闭硬 盘、外设等设备,进入等待状态。此时内存仍然需要电力维持其数据,但整机耗电很少。恢复时计算机从内存读出数据,回到挂起前的状态,恢复速度较快。对 DDR的耗电情况进行优化是S3性能的关键,大多数手持设备都是用S3待机。
S4 aka STD(suspend to disk),挂起到硬盘,简称休眠。把运行状态等数据存放在硬盘上某个文件或者某个特定的区域,关闭硬盘、外设等设备,进入关机状态。此时计算机完全关闭,不耗电。恢复时计算机从休眠文件/分区中读出数据,回到休眠前的状态,恢复速度较慢。电子书项目中,见过一款索尼的电子书,没有定义关机状态,只定义了S4,从而提高开机速度。
以上摘录自:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763104
6893b4c4380147d8c8c4668d4e419ce3b4c413037bfa6663f405a8e906b6075fc
4d5bedfb6079370123b598938f4a85ac925f75ce786a6459db0144dc5bf0dc475
5d627e44de8df4aa0fcad7384afa28d880311dd52756d87849c5b704f9634b6&p
=c933cc16d9c116f51ebd9b7d0a13cd&newp=8366c54ad5c444e411b3c22d0214cf2
31610db2151d6db10349dcd1e&user=baidu&fm=sc&query=pm_autosleep_init&qid=&p1=1
在阅读下面的内容之前,强烈建议阅读下。
Android在Linux内核原有的睡眠唤醒机制上面新增了三个,如下:
• Wake Lock 唤醒锁机制;
• Early Suspend 预挂起机制;
• Late Resume 迟唤醒机制;
我们来看一张Android睡眠唤醒机制的框架图:
void request_suspend_state(suspend_state_t new_state) { unsigned long irqflags; int old_sleep; #ifdef CONFIG_PLAT_RK if (system_state != SYSTEM_RUNNING) return; #endif spin_lock_irqsave(&state_lock, irqflags); old_sleep = state & SUSPEND_REQUESTED; if (debug_mask & DEBUG_USER_STATE) { struct timespec ts; struct rtc_time tm; getnstimeofday(&ts); rtc_time_to_tm(ts.tv_sec, &tm); pr_info("request_suspend_state: %s (%d->%d) at %lld " "(%d-%02d-%02d %02d:%02d:%02d.%09lu UTC)\n", new_state != PM_SUSPEND_ON ? "sleep" : "wakeup", requested_suspend_state, new_state, ktime_to_ns(ktime_get()), tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, ts.tv_nsec); } if (!old_sleep && new_state != PM_SUSPEND_ON) { state |= SUSPEND_REQUESTED; //进入Early suspend处理,执行函数early_suspend queue_work(suspend_work_queue, &early_suspend_work); } else if (old_sleep && new_state == PM_SUSPEND_ON) { state &= ~SUSPEND_REQUESTED; wake_lock(&main_wake_lock); //进入Late resume处理,执行函数late_resume queue_work(suspend_work_queue, &late_resume_work); } requested_suspend_state = new_state; spin_unlock_irqrestore(&state_lock, irqflags); }
View Code
TAG:
const char * const OLD_PATHS[] = { "/sys/android_power/acquire_partial_wake_lock", "/sys/android_power/release_wake_lock", }; const char * const NEW_PATHS[] = { "/sys/power/wake_lock", "/sys/power/wake_unlock", };
static inline void initialize_fds(void) { // XXX: should be this: //pthread_once(&g_initialized, open_file_descriptors); // XXX: not this: if (g_initialized == 0) { if(open_file_descriptors(NEW_PATHS) < 0) open_file_descriptors(OLD_PATHS); g_initialized = 1; }
未完待续......
本文很多内容参考且摘录自:
http://blog.csdn.net/myarrow/article/details/8136691 http://blog.csdn.net/myarrow/article/details/8137952 http://blog.csdn.net/myarrow/article/details/8137566 http://blog.csdn.net/sunweizhong1024/article/details/17102047
相关文章推荐
- Android电源管理-休眠简要分析
- Android电源管理-休眠简要分析
- Android电源管理-休眠简要分析
- [置顶] Android电源管理-休眠简要分析
- Android电源管理-休眠简要分析
- android电源管理-休眠简要分析
- Android电源管理-休眠简要分析
- Android电源管理-休眠简要分析
- Android电源管理-休眠简要分析
- android休眠与唤醒驱动流程分析
- android 休眠唤醒机制分析(一)
- android休眠与唤醒驱动流程分析
- android 休眠唤醒机制分析(三)
- android 休眠唤醒机制分析(二)
- android 休眠唤醒机制分析(二) — early_suspend
- android 休眠唤醒机制分析(二) — early_suspend
- Android日志系统Logcat源代码简要分析
- android logger 简要分析 (kernel 3.0.0)
- Android日志系统Logcat源代码简要分析
- 1、Android音频系统分析--专业术语简要解析