【Android休眠】引申之关于系统PM的思考
2017-01-22 15:42
323 查看
http://blog.csdn.net/u013686019/article/details/54668873
一、开篇
对于一个完整的系统,我们在做PM(Power Manager)相关的事情时,应该(至少)其休眠涉及三个部分:
用户(User Space)
CPU(Kernel)
外设
关系图示:
比如:
Android设备后台在播放音乐,那么播放器就会采取一定方式(比如休眠锁的方式)告知系统不能休眠;Kernel得到禁止休眠的消息就一直处于工作状态。
Kernel除了控制CPU外,还提供了访问各种外设的驱动程序;驱动程序中,有一部分代码就是做休眠之类的工作,比如常见的:
Kernel进入休眠时,调用驱动注册的xxx_suspend()函数,唤醒时调用xxx_resume()函数。
自带CPU类型的外设:即外设有自己的控制中心,比如4G模组。这种情况下,在休眠/唤醒动作发生时,通过通信链路告知外设执行休眠/唤醒。
被动外设:外设的行为完全由Kernel控制,典型的就是LED。这种情况下的休眠/唤醒比较简单,按照外设支持的方式操作即可,最简单的方式就是断电/上电。
一、开篇
对于一个完整的系统,我们在做PM(Power Manager)相关的事情时,应该(至少)其休眠涉及三个部分:用户(User Space)
CPU(Kernel)
外设
关系图示:
二、用户(User Space)
作为完成具体业务的角色,它产生是否允许系统进行休眠的消息。Kernel对消息做出休眠/继续工作的反应。比如:
Android设备后台在播放音乐,那么播放器就会采取一定方式(比如休眠锁的方式)告知系统不能休眠;Kernel得到禁止休眠的消息就一直处于工作状态。
三、CPU(Kernel)
这里,CPU针对硬件,Kernel针对运行在CPU中的软件(Linux)。CPU硬件支持某几种休眠模式,由Kernel实现对这几种休眠模式的控制。Kernel除了控制CPU外,还提供了访问各种外设的驱动程序;驱动程序中,有一部分代码就是做休眠之类的工作,比如常见的:
#ifdef CONFIG_PM static int xxx_suspend(struct platform_device *dev, pm_message_t state) { } static int xxx_resume(struct platform_device *dev) { } #else #define xxx_suspend NULL #define xxx_resume NULL #endif static struct platform_driver xxx_driver = { .suspend= xxx_suspend, .resume = xxx_resume, };
Kernel进入休眠时,调用驱动注册的xxx_suspend()函数,唤醒时调用xxx_resume()函数。
四、外设
这里把外设分作两类:自带CPU类型的外设:即外设有自己的控制中心,比如4G模组。这种情况下,在休眠/唤醒动作发生时,通过通信链路告知外设执行休眠/唤醒。
被动外设:外设的行为完全由Kernel控制,典型的就是LED。这种情况下的休眠/唤醒比较简单,按照外设支持的方式操作即可,最简单的方式就是断电/上电。
相关文章推荐
- 关于android不同系统样式的思考
- 关于Android系统休眠后,线程的执行情况
- 关于船舶建造系统的一点思考
- 关于编写高可靠性的软件(系统)的一些思考
- 关于系统异常设计的再思考
- 关于Android LOG系统
- 关于Android系统中system.img和data.img中文件系统的权限设置
- 关于.NET WEB应用系统UI层的一些思考
- 关于系统思考——现代科学抑郁症
- 关于通过DDMS向Android系统的模拟器的sdcard中导入mp3文件的问题
- 关于银行调度系统的思考:
- Android 禁止系统休眠,使屏幕不变暗
- 关于群集系统的一些思考
- 关于客户关系管理系统几点思考
- 关于安监系统内部OA、安全生产行政执法系统与安全生产行政许可审批的整合应用思考
- 【学习笔记】关于Android的Surface系统
- 日常的商业模式思考 - 答杭州的朋友关于评估系统和评估费的问题
- 关于系统性能的思考
- 关于系统休眠问题的研究
- 关于s5pc110系统休眠的情景分析(2)