重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
由于项目产品需要过能源之星3.0,所以最近做了一些电源管理低功耗方面的工作,抽个时间正好梳理一下。
创新互联专注于永济网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供永济营销型网站建设,永济网站制作、永济网页设计、永济网站官网定制、微信小程序服务,打造永济网络公司原创品牌,更为您提供永济网站排名全网营销落地服务。
其实Linux 电源管理非常复杂,牵扯到很多方面,比如系统级的待机、频率电压变换、系统空闲时的处理以及每个设备驱动对于系统待机的支持和每个设备的运行时电源管理,可以说和系统中的每个设备驱动也都息息相关。
在Linux内核上有如下的框架支持:
1. CPU 在运行时根据系统负载进行动态电压和频率变换的CPUFreq ;
2. CPU 在系统空闲时根据空闲的情况进行低功耗模式的CPUIdle ;
3. 多核系统下CPU 的热插拔支持 ;
4. 系统和设备对于延迟的特别需求而提出申请的PMQoS,它会作用于CPUIdle 的具体策略 ;
5. 设备驱动针对系统Suspend to RAM/Disk 的一系列入口函数 ;
6. SoC 进入suspend 状态、SDRAM 自刷新的入口 ;
7. 设备的runtime(运行时)动态电源管理,根据使用情况动态开关设备 ;
8. 底层的时钟、稳压器、频率/电压表(OPP 模块完成)支撑;
Linux电源管理中主要使用的技术包括:
1、CPUFreq : 即DVFS(Dynamic voltage and frequency scaling),即动态电压频率调整。在系统运行时根据系统负载动态调节;
2、DEVFreq:CPUFreq只针对CPU做动态电压频率调节,而devfreq可以对设备,如DRAM,GPU等做动态电压频率调节;
3、CPUIdle:CPU在系统空闲时根据空闲的情况进行低功耗模式,比如C0--C3四个状态对应不同的低功耗策略;
4、CPUHotplug:多核系统下CPU的热插拔支持;
5、PM QOS:主要作用于cpuidle的具体策略,是针对系统和设备对于延迟的特别需求而提出的;
6、SUSPEND:主要有suspend to ram和suspend to disk两种,suspend to ram主要是挂起各设备,并使dram进入自刷新,而suspend to disk就干脆把dram也关掉,直接把状态保存到disk;
7、RUNTIME PM:设备的runtime(运行时)动态电源管理,根据使用情况动态开关设备;
8、Regulator:用于调节CPU等模块的电压和电流值;
9、OPP:可以使SOCs或者Devices正常工作的电压和频率组合。内核提供这一个Layer,是为了在众多的电压和频率组合中,筛选出一些相对固定的组合,从而使事情变得更为简单一些;
10、Thermal:温控管理。
电源管理相关源码在内核树中主要分布于:
kernel/power/ *
drivers/power/
drivers/base/power/*
drivers/cpuidle/*
drivers/cpufreq/*
drivers/devfreq/*
include/linux/power_supply.h
include/linux/cpuidle.h
include/linux/cpufreq.h
include/linux/cpu_pm.h
include/linux/device.h
include/linux/pm.h
include/linux/pm domain.h
include/linux/pm runtime.h
include/linux/pm wakeup.h
include/linux/suspend.h
Linux 使用哲学(正确而优雅的使用方法) 一文中说到,正确的使用 Linux 是不安装 Xwindow,而是通过远程 ssh 它。那么当我们在一台笔记本上安装好Linux 后,要想将他合盖后还能远程访问,就需要修改一下系统的电源相关选项。这里以 CentOS为例
systemd 处理某些电源相关的 ACPI事件,可以通过从 /etc/system/logind.conf 以下选项进行配置:
触发的行为可以有
如果要合盖不休眠只需要把HandleLidSwitch选项设置为如下即可:
注意:设置完成保存后运行下列命令才生效。
设置电源是个啥意思?重启关机吗?
reboot重启,poweroff关机
shutdown比较特别,可以man
shutdown看一下,电源相关几乎都管
这个问题我解决过哦。
用P/Invoke调 API:kernel32.dll中的GetSystemPowerStatus函数。函数返回系统的电源状态。状态指数系统是在直流电源还是交流电源下运作,电池是否在充电,电池的剩余电量。
先定义结构体:
[StructLayout(LayoutKind.Sequential)]
public struct SYSTEM_POWER_STATUS
{
public byte ACLineStatus;
public byte BatteryFlag;
public byte BatteryLifePercent;
public byte Reserved1;
public int BatteryLifeTime;
public int BatteryFullLifeTime;
}
然后导入外部函数:
[DllImport("kernel32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
public static extern bool GetSystemPowerStatus(ref SYSTEM_POWER_STATUS systemPowerStatus);
如果调用成功,返回 true,然后分析systemPowerStatus的数据就行。
ACLineStatus为1时,表示正在使用交流电源,为0使用直流电源。
希望能够帮到你。