zoukankan      html  css  js  c++  java
  • 【Android休眠】引申之关于系统PM的思考

    受不了xxxx恶心人的行为,遂搬迁至博客园。
    始发:2017-01-22 15:42:20
    

    一、开篇

    对于一个完整的系统,我们在做 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模组/WiFi模组等。这种情况下,在休眠/唤醒动作发生时,通过通信链路告知外设执行休眠/唤醒。
    被动外设:外设的行为完全由kernel控制,典型的就是led。这种情况下的休眠/唤醒比较简单,按照外设支持的方式操作即可,最简单的方式就是断电/上电(比如休眠的时候关闭led)。

  • 相关阅读:
    CentOS 7 使用NVM管理nodejs(转)
    Linux下Git安装及配置 (转)
    linux添加计划任务(转载)
    centos编译libcurl库找不到ssl的问题
    windows下搭建nginx+php+虚拟主机配置过程(转)
    xocde中宏定义使用
    unity shader vs高亮提示插件
    xcode8 自动打包
    3DMax中如何刷顶点色
    Adreno Profiler调试注意事项
  • 原文地址:https://www.cnblogs.com/rockyching2009/p/13428174.html
Copyright © 2011-2022 走看看