APP下载

基于嵌入式Linux系统电源管理的优化

2020-06-11朱振华

电子技术与软件工程 2020年3期
关键词:内核功耗时钟

朱振华

(珠海全志科技股份有限公司 广东省珠海市 519000)

1 引言

嵌入式系统对功耗很敏感,特别是移动设备,并且随着嵌入式系统的不断强大,计算性能的提高,低功耗已经成为嵌入式的重要标准之一。嵌入式系统与PC一样拥有BIOS系统等对电源管理所需的必要的硬件支持,与此同时,嵌入式硬件还有很大的灵活性,因此需要一个简单有效的电源管理方案。目前嵌入式Linux系统广泛的采用了一种名为高级电源管理(Advanced Power Management,APM)技术,高级电源管理(APM)技术基本已经满足大多数的应用场景。而随着技术的不断进步,用户需求的不断增加,动态电源管理DPM(Dynamic Power Management)技术提供了一种更为有效的电源管理机制,可以更为行之有效降低嵌入式系统的电源功耗。

2 嵌入式Linux系统高级电源管理技术

嵌入式Linux系统中的所有设备都有一套规范的操作方式,嵌入式电源控制系统中往往包含很多设备,见硬件结构图1。

结构图包括CPU,实时时钟,DRAM,Flash,LCD,UART,audio codec等模块。其中哪怕有一个设备没有按照规范设置电源管理的操作,都有可能导致整个系统的电源管理机制失效,通常最终的结果是导致系统的崩溃。

在系统可维持正常所期望工作状态的情况下,尽可能降低功耗。Linux电源管理涉及到系统待机,频率电压变换,系统空闲处理,运行时期电源管理等多个方面。因此电源管理机制中主要采用降低系统运行时钟及电压、减少CPU不必要的工作、休眠三种措施来降低功耗。

嵌入式系统主要有两种工作状态:

(1)正常工作状态;

(2)系统休眠态。

电源管理的主要任务是保证系统正常完成任务情况下控制系统在正常工作状态和系统休眠状态之间来回切换以降低系统功耗。

系统的休眠状态技术主要有两种:

(1)内存休眠(suspend to RAM);

(2)冬眠(suspend to disk).内存休眠技术在唤醒和休眠状态切换速度快,因此在当今的移动设备中广泛采用。

系统进入休眠(suspend)状态过程中内核会完成下面的主要任务:

(1)执行系统中所有的设备驱动程序中的休眠程序。

(2)保存中央处理器中相关寄存器到内存中。

(3)将内核唤醒信息/地址传递给引导程序,以便内核在唤醒时候会从该地址开始执行下一步的操作。

(4)处理器进入休眠(suspend)状态。

系统唤醒(resume)状态过程中内核会完成下面的主要任务:

(1)唤醒源发出唤醒信号给系统上电。

(2)从休眠阶段保存的唤醒地址开始运行。

(3)从内存中恢复中央处理器相关寄存器。

(4)执行每个设备驱动程序中的恢复程序,系统恢复到休眠前状态继续运行。

2.1 嵌入式外围设备中的电源管理

嵌入式系统的外围设备的电源管理主要有两个模式:

(1)系统休眠模型;

(2)设备运行模型。

系统休眠中,设备驱动程序就进入了低功耗的状态或者断电状态,作为系统范围内的功耗管理的一部分。在设备运行电源管理模型中,每一个设备都有根据自己的运行情况自行管理自己的功耗,无需系统处理。

图1:嵌入式电源控制系统硬件结构图

图2:嵌入式系统在功耗分布图

2.1.1 外围设备电源管理的实现策略

外部设备的电源管理由独自的驱动程序来自行管理,电源管理程序会根据当前的设备运行情况,以及计算任务量来选择适当的时机进入休眠或者唤醒设备。我们可以通过以下方法来设置设备的休眠状态:

(1)在一定的时间里面,设备的驱动没有对设备进行相应的访问,或者设备没有产生相应的数据信息。按照嵌入式Linux系统的电源管理规范,进行读写设备前调用pm.access,原Linux系统中该函数是空函数需要用户自行定义。我们在该函数中刷新last.access.time值。我们可以通过计算当前值和last.access.time值,可以知道设备有多久没有被访问过。

(2)当嵌入式Linux外部设备需要进入休眠状态时候,会可以调用pm.dev.idle声明该设备处于空闲状态中。Linux系统中,pm.dev.idle也是空函数,需要用户自行实现。我们可以利用该函数接口来修改pm.dev结构的flags。该标志记录了设备发送的所有请求。

(3)处理器CPU在进入休眠模式之前会通知所有的外围设备,外围设备接收到该通知会执行设备睡眠程序,然后进入睡眠模式。

2.2 嵌入式处理器的电源管理

嵌入式系统在功耗方面的分布如图2所示,处理器在系统中的功耗占据了很大一部分,特别是不带LCD显示模块的系统中。因此如何管理处理器的功耗是嵌入式系统的重点之一。通常情况下,我们可以通过下面的三种途径:

(1)根据系统负荷大小调整处理器时钟的频率,负荷较小时降低处理器的时钟速度及其电压。

(2)当当前的处理器处于空闲状态时候,设置处理器为空闲模式。

(3)系统关闭时候,设置处理器为休眠模式。

2.2.1 嵌入式处理器功耗控制

因为嵌入式处理器的功耗与其性能是正相关的,因此控制嵌入式处理器功耗就是控制处理器的性能大小,同理,处理器的性能与其时钟频率又是正相关的,因此我们最终是控制嵌入式处理器的时钟频率。大多数处理器都会有相应的寄存器来设置其时钟频率。我们可以在该函数中实现对处理器的运行时钟进行更改,以达到降低处理器功耗的效果。我们可以利用Linux内核当中的cpufreq.set函数,该函数在Kernel/cpufreq.c中实现。

实现的功耗调整需要在适当的时机更改CPU的时钟速度。我们可以通过调整CPU的运行频率来改变系统功耗和系统执行任务所需要的时间,比如,如果我们降低CPU的运行频率,会降低CPU的功耗,但同时会增加CPU执行任务的时间;如果我们提高CPU的运行速率的时候,会增加系统的功耗,同时提高系统性能,减少任务执行时间。这就需要用户自行决定在功耗和性能之间做个选择。我们可以通过cpufreq.sysctl函数提供的sysctl接口,在运行代码中更改,也可以通过系统脚本的方式改变系统文件来更改CPU的主频。

2.2.2 设置处理器空闲模式

当处理器处于空闲状态时候,我们可以设置处理器为空闲模式,以降低嵌入式系统功耗。此时嵌入式系统外设仍然是工作的,只是CPU的时钟会被关闭,直到有中断将CPU从空闲状态将CPU唤醒。通过cpu.do.idle函数,修改处理器状态为空闲状态。

2.2.3 设置处理器睡眠模式

处理器睡眠模式可以将除了处理器时钟和电源管理模块以外,其他设备电源都关闭,此时系统处于一个较低功耗状态,直到特定事件将系统从睡眠状态唤醒。

我们可以通过Linux中system.do.suspend和system.do.resume函数来实现使系统进入休眠和唤醒系统的功能。system.do.suspend函数会调用pm.send.all来使所有的外围设备进入睡眠。system.do.resume函数会将数据从DRAM中导出,并恢复系统到suspend之前的状态。

3 嵌入式Linux系统动态电源管理

上面介绍了嵌入式Linux系统带有的高级电源管理(Advanced Power Management,APM)技术,高级电源管理(APM)技术基本已经满足大多数的应用场景。如何有效的管理嵌入式系统电源功耗是一个很有意义的事情,下面我们介绍一种动态电源管理DPM(Dynamic Power Management)技术,包含控制CPU的工作频率以及电压,外部总线的时钟频率,外部设备时钟/电源等方面的动态调节以及管理等功能。更为智能的管理嵌入式系统电源功耗。

3.1 动态电源管理原理

电路功耗等于动态功耗和静态功耗相加。

其中P为总功耗,C电容,V电压,f开关频率,I漏电流。

从上公式我们可以得到下面三种管理功耗的方法:

(1)调节电压/时钟。我们可以通过调节电压V和时钟来调节功耗;

(2)时钟选通f(Clock Gating)。我们可以通过控制时钟断开和开通来控制设备在运行和闲置状态;

(3)电源的连接和断开(Power Gating)。我们可以控制设备电源的开通来使设备电源处于运行状态,断开电源停止设备运行。

上面的理论基础使我们动态管理嵌入式Linux系统电源成为可能。

3.2 嵌入式Linux系统动态管理电源功耗原理

嵌入式Linux系统有不同的运行形态,而每种状态有不一样的电源等级需求。图3显示了Linux有不一样的运行状态,并且每种状态之间的转换和任务之间的联系。

我们可以将嵌入式Linux系统动态管理分为三类:

(1)系统挂起/恢复。用于减少产品设备长时间空闲情况下,减少电源功耗。

(2)设备电源管理。用来关断或者开通设备电源,以达到控制设备功耗的目的。

(3)平台动态管理。用来管理系统频繁发生的电源状态切换。

图3:操作状态间的转换

图4:嵌入式内核电源动态管理

3.3 嵌入式内核动态电源管理实现

我们可以将嵌入式内核电源动态管理分为三层:应用层、内核层和硬件设备层。如图4所示。

应用层:我们可以使用嵌入式Linux系统提供的sysfs文件系统以及设备驱动系统模型来进行电源的动态管理。通过修改任务宏swith_to,实现dpm_set_os(dpm__state)接口来实现当前硬件参数的设置。

内核层:内核层提供了硬件无关的电源管理逻辑控制框架。此层我们主要是实现对底层的硬件细节的屏蔽,以及向应用层提供相应的API接口,和衔接应用层和具体硬件。

硬件设备层:此层主要是为电源动态管理机制提供需要的硬件基础。主要对应的是各种硬件总线和设备时钟。

4 总结

本文介绍了嵌入式电源硬件系统,嵌入式Linux系统的高级电源管理系统,以及通过高级电源管理系统进行嵌入式系统的电源管理,嵌入式Linux系统的高级电源管理系统可以应对大部分的应用场景。但人们总是追求更加完善的方案,因此在本文后面介绍了动态电源管理系统,以更加智能的方式管理嵌入式系统的电源功耗。对于嵌入式系统的电源管理我们还有很多需要完善的地方,比如我们可以根据软硬件来收集系统的负荷,进一步更加精确的调整系统功耗。电源管理和嵌入式系统实时性能之间的关系需要更进一步的协调处理等。

猜你喜欢

内核功耗时钟
基于任务映射的暗硅芯片功耗预算方法
别样的“时钟”
强化『高新』内核 打造农业『硅谷』
古代的时钟
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
数字电路功耗的分析及优化
时钟会开“花”
IGBT模型优化及其在Buck变换器中的功耗分析