https://blog.csdn.net/coldsnow33/article/details/18138995 转载!
https://blog.csdn.net/qq_28779021/article/details/80046713 转载!
https://www.linaro.org/blog/suspend-to-idle/
https://www.cnblogs.com/deng-tao/p/6026373.html
自己这篇文章是在前人的基础上实践了一下,顺便写一下实验记录。
查看系统支持的休眠方式:
cat /sys/power/state
1 suspend state
suspend to idle、power-on standby(Standby)、suspend to ram(STR)和sudpend to disk(Hibernate),分别对应ACPI状态的S0、S1、S3和S4。Linux系统的suspend四种状态,对于不同的体系结构或者电源管理接口来说,状态的含义不一定完全相同,但是不会有太大的差别。下面的是ACPI电源接口的含义及其对应的Sleep State。
State in Linux | Label | state | ACPI state | 注释 |
#define PM_SUSPEND_ON ((__force suspend_state_t) 0) | 一切正常 | |||
#define PM_SUSPEND_FREEZE ((__force suspend_state_t) 1) | freeze | Suspend-to-Idle | S0 | 冻结进程+挂起设备+CPU空闲 |
#define PM_SUSPEND_STANDBY ((__force suspend_state_t) 2) | standby | Standby/Power-on Suspend | S1 | 冻结进程+挂起设备+关闭nonbootCPU |
#define PM_SUSPEND_MEM ((__force suspend_state_t) 3) | mem | Suspend-to-RAM | S3 | 仅保留RAM自刷新 |
#define PM_SUSPEND_MAX ((__force suspend_state_t) 4) | disk | Suspend-to-disk | S4 | 关闭所有设备包括RAM,也被称为Hibernate |
从freeze-->standby-->mem睡眠程度越来越深,唤醒花费的时间也越来越多。
通过写入/sys/power/state不同字符串,可以让系统进入不同睡眠状态。例如下面:
echo mem > /sys/power/state 让系统进入休眠。
echo on > /sys/power/state 使系统唤醒
cat /sys/power/wake_lock 查看锁
echo ************* /sys/power/wake_unlock 释放某一个锁。
2 suspend用户空间接口
Linux系统的电源管理Suspend框架跟Linux系统的驱动模型(Linux Driver Model) 是相关的,也是基于Linux的驱动模型来实现的。Linux的Suspend系统分为两部分,一部分是平台无关的核心层,另一个是平台相关的平台层。操作接口都在平台无关的核心层里了。
根据Linux系统驱动模型,device结构描述了一个设备,device_driver是设备的驱动,而class、type和bus分别描述了设备所属的类别、类型和总线。而设备的电源管理也根据此模型分为class级的、type级的、bus级的和驱动级的。如果一个设备的class或者bus确切的知道如何管理一个设备的电源的时候,驱动级别的suspend/resume就可以为空了。这极大的提高了电源管理的高效性和灵活性。