嵌入式系统电源管理(二): 具体实现

关闭外围设备:微控制器包含定时器和A/D转换器这类的芯片模块,但是并不需要所有的模块都同时工作。通过禁止那些不需要工作的模块的时钟,可以降低功耗。 

I/O
端口驱动:输入端口应该由外部设备或MCU驱动。如果允许端口输入信号浮动,它会漂移在最大逻辑低电平与最小逻辑高电平之间,这在CMOS器件中可导致额外功耗。 

多输入唤醒(MIWU):在许多诸如PDAPDA/电话复合装置的设计中,使用MIWU就可免去扫描类似于键盘操作这样的输入信号。CPU能被暂停,这也可以节能。 

功率循环:看门狗定时器可以在一段设定的时间后使系统跳出空闲模式。设备苏醒过来,检查是否有需要服务的事件,然后再回到空闲模式。 

内部开关:工作电流被直接连到芯片晶体管的内部开关。从逻辑低电平切换到逻辑高电平或进行相反切换的晶体管越多,内部电流消耗也就越大。因而,需要设计应用软件以使内部开关最少化。 

振荡器稳定性:在进行模式切换时,为稳定振荡器的频率和振幅所产生的功耗是一种浪费。在象气压计和烟尘探测器这样的装置中,一天可发生10万次模式切换。 设计人员必须在频繁的工作模式切换与空闲或停止模式所用的总时间之间取得平衡。 

 

第三章:时钟和电源管理

这个模块控制给系统中各个模块的时钟频率,和在不同的电源管理模式下切换

31 本模块给系统中各个外设单元提供固定的时钟频率,一些设备的外部时钟可以通过Clock Enable Register (CKEN)  disable掉,或者是外设控制寄存器中某些位,当某个单元不要用了时,就可以把它的时钟关掉,省电。 关于LCD控制器,内存控制器,CPU的频率是可编程的,并且是相关系的,因为它们都来自同一个LLT时钟源,设置PLL频率的步骤是:

1 先决定要求最快的同步内存的要求,即SDRAM的频率

2 如果SDRAM频率低于995M,那么内存频率必须是SDRAM频率的两倍,并且在内存控制器中要把SDRAM比率设为2。如果SDRAM频率等于995M,那么内存频率也等于SDRAM频率

3 把内存频率合到跟995M最近的数值,比如99.5 MHz (L = 0x1B), 118.0 MHz (L = 0x20), 132.7 MHz (L = 0x24), 147.5 MHz (L = 0x28), or 165.9 MHz (L = 0x2D),当然是通过配置CCCR中的L值,这就是外部同步内存的频率(如果SDRAM比率设为2了的话,要除2

4 确定处理器处于正常运行模式(RUN 模式)时的核心频率,即确定M

5 确定要处于TURBO 模式时的频率,即N

6 在内存控制器合LCD控制器中设置好新的内存频率,然后进入频率改变阶段

关于频率改变是怎么样个具体过程,到时再看

32 电源管理介绍

本模块能够让处理器进入三种reset状态

l        RESET,不可屏蔽的,用于电源启动,或不需要保存任何信息的时候

l        看门狗RESET,由看门狗计时器发出断言,reset系统中除了时钟和电源管理模块的其他模块,相当于一个代码监视器

l        GPIO RESET,通过GPIO功能选择寄存器使能的,相对于硬reset来说,可以保存内存控制器和时钟和电源管理模块中一些关键状态,还有RTC

本模块还控制着处理器进入和退出任何低电模式或其他模式,模式有:

Tubro 模式:处理器处于峰值速度运行,很少进行外部内存处理

Run 模式:核心处于正常运行模式,进行较多的外部内存处理

Idle 模式:核心时钟停止了,但系统其他模块正常运行,用于一段短期的暂停期,此时,外部系统继续操作,但核心不用参与

Sleep 模式:处理器处于最低电源状态,仅仅维持I/O状态,RTC,本模块。唤醒需要reset

本模块还控制着处理器在频率改变阶段中的动作,具体看后面

33        时钟管理器

有五个主要时钟源

32.768 kHz Oscillator

3.6864 MHz Oscillator

Programmable Frequency Core PLL

95.85 MHz Fixed Frequency Peripheral PLL

147.46 MHz Fixed Frequency PLL

本模块还通过Clocking Gating来减少电源消耗

31L代表核心PLL

图中PXbus是核心与DMA/,LCD控制器,内存控制器间的总线,频率越快越好,是Run 模式使核心频率的一半

331 32768K 振荡器

低电,低频率,驱动RTC和时钟电源管理模块,硬reset后,此振荡器是关闭的,RTC和时钟管理模块都是用36864M时钟,要通过软件设置Oscillator Configuration RegisterOSCC)中的振荡器位来使能它,这样,当它稳定后就给RTC它们供时钟了

这个振荡器是可选的,主要是为睡眠模式下提供最低的电源消耗,在对电不那么敏感的时候,可以diaable它,让它的外部引脚处于浮动态,用于节省成本。当系统中没有这个振荡器,RTC它们的频率就是36864M12后,32914K,那么进入睡眠模式,36864M的时钟得继续运行,得消耗大量无用的电,Oscillator Power Down Enable (OPDE) 位决定了睡眠模式是要不要36864M的时钟

332        36864M振荡器

为系统大部分模块时钟的,硬reset时还供RTCPM的,当32768K振荡器使能并且稳定后(OSCCOONOOK位设置了),并且OPDE位设置了时,进入睡眠模式时,此振荡器就会关了

333        核心PLL

这是核心,DMA控制器,LCD控制器,内存控制器频率的来源,以36864M为参考,通过以下乘数就可以了,

L:到内存频率的乘数,设为273645

M:内存频率到Run模式的乘数,设为124

NRun模式到Turbo模式的乘数,10152030

CCCR中设置

SDRAM的频率不能超过100M,当MEMCLK超过100M时,内存控制器必须设SDCLKMEMCLK的比率为12

334        335 9585M14746M是为外部接口中其他外部块提供时钟的

335        Clock Gating

时钟管理器包含有CKEN寄存器,包含一些配置位来disable不要用到的模块,同时,当某个模块只是暂时不用时,又没有Clock Gating功能时,也通过寄存器位来disable

有这个功能的是,模块虽然时钟被disable了,但该模块的寄存器都还可以读可以写,AC97除外

34                    CPM模块控制着处理器的reset,电源顺序,电源模式,每种模式操作上都不同,有特殊的进入和退出顺序

341            硬重置

断言nRESET就硬重置了,仅用于电源启动和完全的重启动

3411        发起硬重置

外力按下nRESET引脚,不可以被屏蔽,不论时处于何种模式下都要reset,当然,信号要维持 tDHW_NRESET段时间

3412        硬重置中的行为

所有寄存器和单元处于确定的reset状态,只有36864M振荡器活跃,nBATT_FAULT and nVDD_FAULT 引脚也被忽略,动态RAM中的内容也丢失

3413        硬重置的完成

要完成硬重置,否断言nRESET,在否断言nRESET前,所有电源供应必须稳定,否断言后,进入下列顺序:

136864M振荡器和内部PLL等待稳定

2nRESET_OUT引脚被否断言

3,开始正常的启动顺序,所有处理器单位回到预定reset状态,软件必须检查Reset Controller Status register (RCSR)确定启动的原因

342                          看门狗重置

除了CPM外,其他单元都会处于reset

3421        它的触发

Watchdog Enable位(WE)(在OWER中)设置了,同时OSMR[3]又匹配了OS计算器就触发了,同时断言nRESET_OUT

3.4.2.2            过程中的行为

可以参考表格26

3422        看门狗重置的完成

nRESET断言后就转变成了硬重置了,另外,它的完成顺序是:

136864M振荡器和内部PLL等待稳定,326768K振荡器的配置和状态不受影响

2,过tDHW_OUTnRESET_OUT否断言

3,进入正常启动序列。软件要建成RCSR来确定原因

343                    GPIO重置

GP[1]被配置成reset源后被断言四个时钟周期后进入GPIOreset了,除了RTCCPM,还有内存控制器,不会进入预定reset状态

3431        GPIO重置的触发

先把GP[1]设成输入,在在GPIO控制器中设它选择功能为reset,它是电平敏感的,不是边缘触发的,所有要通过一下步骤来设

1,先把它设为输出,并且数据寄存器中为1

2,从外部驱动GP[1]引脚到高状态

3,设置它为输入

4,设置它选择功能为reset

执行GPIO reset时,nRESET_OUT也断言,当GP[1]断言不超过4个周期时,处理器会保持原状态

GPIO reseet在睡眠模式下不起作用,因为睡眠模式下所有GPIO的选择功能输入都disable了,外部唤醒源必须路由到某个使能了的GPIO唤醒源,GP[1]可以使能为唤醒源

3432        GPIO重置的行为

GPIO前后,时钟单元以同样的配置值运行,另外,内存控制器设置的好的话,即GPIO reset的时间要小于SDRAM刷新的时候,就可以reset后保存SDRAM中内容

3433        GPIO重置的完成

跟其他差不多

344                    Run 模式

345                    Turbo 模式

允许处理器运行于一个高频率状态,并且频率切换时不要打断内存控制器LCD控制器和其他外设

3451        Turbo模式的进入

软件在Clock Config (CCLKCFG) Register 设置了Turbo 位后,就触发了,然后等流水线中所有指令执行完毕,然后开始在新的频率下运行

在设在Turbo位的时候,可以设置或清除CCLKCFG中其他位,这时,其他位会在进入Turbo模式前进行相应模式序列,从其他模式退出后,再根据CCLKCFG [TURBO] 进入Run模式还是Turbo模式

CCLKCFG寄存器是再14协处理器中,而CCCRCPM中,不会搞混了

这几个模式的触发,进入,退出的具体过程很烦,觉得现在也没必要这么看

看电源管理的相关寄存器吧

Power Manager Control Register (PMCR)

里面就第0位,IDAE,断言nVDD_FAULT nBAT_FAULT时是否产生数据异常信号给CPU

Power Manager General Configuration Register (PCFR)

0位,OPDE,睡眠模式时是否disable36864M振荡器

12FPFS,睡眠模式时的Float PCMCIA controls Float Static Chip Selects

Power Manager Wake-Up Enable Register (PWER)

015位,GP[x]位的唤醒使能,第31RTC的唤醒使能位

Power Manager Rising-Edge Detect Enable Register (PRER)

Power Manager Falling-Edge Detect Enable Register (PFER)

对应上面GP[x]唤醒位是上升沿还是下降沿唤醒

Power Manager GPIO Edge Detect Status Register (PEDR)

通过上面三个寄存器设置的GP[x]信号,是否触发了,再写入1就清除相应位

Power Manager Sleep Status Register (PSSR)

关于进入睡眠模式的原因的状态位,有第0位-SSS,通过软件设置PWRMODE寄存器进入睡眠的,第1位,BFS,是nBAT_FAULT,2位,VFS,是nVDD_FAULT,,另外,第4位,PH,第5位,RDH,是开始睡眠后,GPIO引脚被保持

Power Manager Scratch Pad Register (PSPR)

可以在进入睡眠前把处理器任意的配置信息存入此中,睡眠醒来后取出

Power Manager Fast Sleep Walk-up Configuration Register (PMFW)

就第2FWAKE,为1时,快速醒来模式,不要经过等待电源稳定的延迟

Power Manager GPIO Sleep State Registers (PGSR0, PGSR1, PGSR2)

对于设为输出的GPIO来说,当进入睡眠模式,可以把相应的PGSR放入GPIO输出的数据寄存器中,当处理器回到Run模式,GPIO仍然保持着,值得PSSR[PH]位被重置

Reset Controller Status Register (RCSR)

用来确定重置的原因的,0HWR1WDR2SMR3GPR

 

再来看时钟管理的相关寄存器

Core Clock Configuration Register (CCCR)

设置LMN

Clock Enable Register (CKEN)

Enable或者disable大部分外部单元

Oscillator Configuration Register (OSCC)

里面两位,OONOOKOON通过软件设置使能327678KHzOOK说明已经稳定

协处理器   

CP14 register 6 CCLKCFG register

CP14 register 7 – PWRMODE register

101页,指令说明

Core Clock Configuration Register (CCLKCFG)

用来进入Turbo模式和“频率改变”

0位,TURBO,第1位,FCS

Power Mode Register (PWRMODE)

01位,用来进入 Idle模式和睡眠模式

 

. 嵌入式Linux系统下的电源管理机制:

1.   嵌入式Linux系统下低功耗模式的电源管理应用

2.嵌入式Linux系统下动态电源管理应用

Linux系统下的电源动态管理机制,主要包括下面三个模块:

1

 

具体的算法,请参考附录【4】。

Clock scaling allows you to change the clock speed of the CPUs on the

    fly. This is a nice method to save battery power, because the lower

            the clock speed, the less power the CPU consumes.

 

 

Contents:

---------

1. Supported Architectures and Processors

1.1 ARM

1.2 x86

1.3 sparc64

1.4 ppc

1.5 SuperH

 

2. "Policy" / "Governor"?

2.1 Policy

2.2 Governor

 

3. How to change the CPU cpufreq policy and/or speed

3.1 Preferred interface: sysfs

3.2 Deprecated interfaces

 

 

 

1. Supported Architectures and Processors

=========================================

 

1.1 ARM

-------

 

The following ARM processors are supported by cpufreq:

 

ARM Integrator

ARM-SA1100

ARM-SA1110

 

 

1.2 x86

-------

 

The following processors for the x86 architecture are supported by cpufreq:

 

AMD Elan - SC400, SC410

AMD mobile K6-2+

AMD mobile K6-3+

AMD mobile Duron

AMD mobile Athlon

AMD Opteron

AMD Athlon 64

Cyrix Media GXm

Intel mobile PIII and Intel mobile PIII-M on certain chipsets

Intel Pentium 4, Intel Xeon

Intel Pentium M (Centrino)

National Semiconductors Geode GX

Transmeta Crusoe

Transmeta Efficeon

VIA Cyrix 3 / C3

various processors on some ACPI 2.0-compatible systems [*]

 

[*] Only if "ACPI Processor Performance States" are available

to the ACPI<->BIOS interface.

 

 

1.3 sparc64

-----------

 

The following processors for the sparc64 architecture are supported by

cpufreq:

 

UltraSPARC-III

 

 

1.4 ppc

-------

 

Several "PowerBook" and "iBook2" notebooks are supported.

 

 

1.5 SuperH

----------

 

The following SuperH processors are supported by cpufreq:

 

SH-3

SH-4

 

 

2. "Policy" / "Governor" ?

==========================

 

Some CPU frequency scaling-capable processor switch between various

frequencies and operating voltages "on the fly" without any kernel or

user involvement. This guarantees very fast switching to a frequency

which is high enough to serve the user's needs, but low enough to save

power.

 

 

2.1 Policy

----------

 

On these systems, all you can do is select the lower and upper

frequency limit as well as whether you want more aggressive

power-saving or more instantly available processing power.

 

 

2.2 Governor

------------

 

On all other cpufreq implementations, these boundaries still need to

be set. Then, a "governor" must be selected. Such a "governor" decides

what speed the processor shall run within the boundaries. One such

"governor" is the "userspace" governor. This one allows the user - or

a yet-to-implement userspace program - to decide what specific speed

the processor shall run at.

 

 

3. How to change the CPU cpufreq policy and/or speed

====================================================

 

3.1 Preferred Interface: sysfs

------------------------------

 

The preferred interface is located in the sysfs filesystem. If you

mounted it at /sys, the cpufreq interface is located in a subdirectory

"cpufreq" within the cpu-device directory

(e.g. /sys/devices/system/cpu/cpu0/cpufreq/ for the first CPU).

 

cpuinfo_min_freq :              this file shows the minimum operating

                            frequency the processor can run at(in kHz)

cpuinfo_max_freq :             this file shows the maximum operating

                            frequency the processor can run at(in kHz)

scaling_driver :             this file shows what cpufreq driver is

                            used to set the frequency on this CPU

 

scaling_available_governors :     this file shows the CPUfreq governors

                            available in this kernel. You can see the

                            currently activated governor in

 

scaling_governor,         and by "echoing" the name of another

                            governor you can change it. Please note

                            that some governors won't load - they only

                            work on some specific architectures or

                            processors.

scaling_min_freq and

scaling_max_freq         show the current "policy limits" (in

                            kHz). By echoing new values into these

                            files, you can change these limits.

 

 

If you have selected the "userspace" governor which allows you to

set the CPU operating frequency to a specific value, you can read out

the current frequency in

 

scaling_setspeed.         By "echoing" a new frequency into this

                            you can change the speed of the CPU,

                            but only within the limits of

                            scaling_min_freq and scaling_max_freq.

                           

 

3.2 Deprecated Interfaces

-------------------------

 

Depending on your kernel configuration, you might find the following

cpufreq-related files:

/proc/cpufreq

/proc/sys/cpu/*/speed

/proc/sys/cpu/*/speed-min

/proc/sys/cpu/*/speed-max

 

These are files for deprecated interfaces to cpufreq, which offer far

less functionality. Because of this, these interfaces aren't described

here.

3.嵌入式Linux系统下 ,电源与时钟管理

 

 

 

 

 

 

 

 

 

参考:

[1] IBM and Montavista Software. “Dynamic Power Management for Embedded Systems” – Version 1.1, November 19, 2002

[2]Bishop Brock and Karthick Rajamani. “Dynamic Power Management for Embedded Systems” IBM Research 11501 Burnet Road Austin , Texas 78758

[3] Linux user guide, “CPU frequency and voltage scaling code in the Linux(TM) kernel”

[4] CSC2228 Project Final Report, “Dynamic Voltage Scaling in Mobile Devices”

 

 

 

 

 

Backup:

降低功耗是每个便携式产品开发人员的设计目标之一,但功耗不仅仅与硬件设计有关,控制软件也会对产品的功耗产生很大影响。不管是操作系统、BIOS控制程序还是外设驱动程序,这些软件编写的方式决定了最终产品的功耗水平,因此在开发时必须加以考虑。本文介绍四种通过软件降低功耗的方法,可供中国的设计工程师们参考。 

作为嵌入式软件工程师,我们需要在质量与效率之间寻求平衡。为此,我们要优化软件性能,使之能在速度较慢而价格低廉的处理器上运行;我们要调整软件大小,这样就能使用更小且更便宜的存储器。现在随着为手持式和无线装置编写的软件越来越多,我们还需要优化产品的功耗,以延长小型低成本电源的寿命。 

有个好消息是,无论你在开发操作系统、外设驱动程序还是应用程序,现在已有多种软件设计技术可以帮助降低功耗,下面我们重点讨论其中的四种方法。 

智能等待 

很多最新的嵌入式处理器都具有能降低功耗的电源工作模式,最常用的是空闲模式,此时处理器内核指令执行部分关闭,而所有外设和中断信号仍有电并起作用。空闲模式比处理器执行指令时的功耗要小得多。 

空闲模式一个主要特点是其进入退出基本上不需要额外开销,通常一个毫秒可以反复很多次。任何时候只要操作系统检查到所有线程都处于阻塞状态如等待中断、事件或定时时间,它都可以把处理器置于空闲模式以省电。由于任何中断都能把处理器从空闲模式中唤醒,所以采用这种模式可使软件智能等待系统事件,不过为最大程度提高电源效率,该工具要求我们认真地设计软件。 

我们都编写过这样的代码,如记录状态寄存器内容并等待设定标记出现,也许是检查串口的FIFO状态标记,看是否收到数据;也许是监测一个双端口存储器看系统中是否有另外处理器写入一个变量,使我们能控制共享资源。尽管从表面上看这样的代码没有什么问题,但在每个时钟周期里不断记录寄存器状态将无法有效延长手持装置的电池寿命。 

更好的解决办法是使用一个外部中断来表明状态何时改变。在单线程软件环境里,你可以调用处理器空闲模式降低功耗直到发生实际事件,出现中断时,处理器自动唤醒然后继续执行后面的代码。 

空闲模式甚至能用于事件不能直接连接到外部中断的场合,在这种情况下,用一个系统定时器定期唤醒处理器是个很好的方法。例如你在等待一个事件并且知道只要事件发生后在一毫秒内能检测到都能迅速做出处理,那么可以启动1ms定时器并把处理器置于空闲模式,每次中断时检查事件状态,如果状态没有变化,就立刻回到空闲模式。 

这种等待机理应用很普遍,现今大多数PDA和智能电话都是由具有空闲模式功能的处理器和操作系统控制。事实上,很多这些设备每秒会多次进出空闲模式,只要有触摸、按键或时间到就会被唤醒。 

减少事件 

另一种可以考虑的技术是减少事件。智能等待是使处理器尽可能高频率地进入空闲模式,减少事件则是尽可能长时间地将处理器置于空闲模式,它通过分析代码和系统要求来决定你是否能改变处理中断的方式实现。 

例如一个通过时隙安排线程的多任务操作系统,一般设定的定时中断通常在只有1ms的时隙间隔发生。假定你的代码很好利用了智能等待技术,操作系统会频繁使处理器置于空闲模式,并一直维持直到被中断唤醒。当然,在这种情形下,最有可能唤醒处理器的中断是定时器中断本身。即使所有其它线程被阻塞,在其它中断、内部事件及长时间延迟之前,定时器中断也会以每秒1,000次的频率把处理器从空闲模式中唤醒,以运行调度安排程序。 

但就算调度安排程序确定所有线路都被阻塞,并很快将处理器回复到空闲模式,这样频繁操作也会浪费大量电源。在这样的情况下,进入空闲模式时应关闭时隙中断信号,只有再次出现中断信号时才被唤醒。 

当然把时隙中断完全关闭通常不太合适。尽管多数阻塞的线程可以直接或间接等待外部中断,有些在特定时间还是服从于操作系统。例如一个驱动器会在等待外设时睡眠500ms,这时空闲模式下如果完全关闭系统定时器,可能意味着线路不能按时恢复工作。 

操作系统最好能为调度安排程序进行可变超时设定。操作系统知道每个线程是否无法确定等待的是外部还是内部事件,或者计划在某特定时间再次运行,操作系统可算出第一个线程预定何时运行,并相应地在处理器置于空闲模式之前设定定时器工作。可变超时设定不会对调度安排程序造成很大的负担,但却能节省电源和处理时间。 

可变计划超时限定只是减少事件的一种方法,存储器直接存取(DMA)也可让处理器长时间处于空闲模式,即使数据正在发送至外设或从外设收取。所以只要可能,都应在外围驱动器中使用DMA,省电效果相当令人满意。 

例如英特尔公司StrongARM处理器串口接收FIFO时,大约每收到8个字节发生一次中断,在115,200bps速度下,发送到这个端口的11KB脉冲数据会引起处理器内核每秒中断1,500次,很可能使其从空闲模式中唤醒,但如果实际上你不需要在这些小的8字节设备中处理数据,浪费是很惊人的。DMA最好与大容量缓冲器一起使用,以使中断发生的水平更加容易管理,或许是每秒10次或100次,让处理器在两次中断之间空闲。事实证明,在这些场合应用DMA能减少使用率达20%,可降低CPU功耗并提高供其它线程使用的处理器带宽。 

性能控制 

动态时钟和电压调整代表了微控制器在降低功耗方面的最新进展,电源管理的这种进展是基于以下观察,即处理器消耗的能量与驱动处理器的时钟频率以及应用其内核上的电压平方成正比。 

处理器允许动态降低时钟速度为节省电源迈出了第一步,降低一半时钟速度,功耗将成比例下降。但是光采用这种技术有效实现节能需要一些技巧,因为执行的代码可能要两倍长的时间才能完成,那样的话也不会省电。 

动态降低电压是另一种做法。越来越多的处理器允许降低电压,以适应处理器时钟速度的下降,这样在降低时钟速度时也能省电。事实上,只要处理器不饱和,频率和电压就能不断减少,这样还是能完成工作,而消耗的电源总体上却比较低。 

考虑到并不是所有线程都消耗同样多处理器带宽,所以即使这些方法也还是可以改进的。有效应用处理器带宽的线程会随着处理器时钟速度下降而花更长的时间才能完成,这些线程使用分配给它们的每一个周期。另一方面,I/O约束线程采用分配给它的所有处理器周期,即便处理器时钟速率下降也要用同样长的时间才能完成。 

举一个例子,像很多PDA使用的PC(以前称为PCMCIA)接口,当数据写入快闪存储卡时,系统瓶颈不是处理器的速度,而是物理总线接口以及卡的固件为擦掉和重新编程闪存所花的时间。理想情况下,上面讨论的智能等待技术可在这里应用以最大程度降低功耗,但是等待时间经常变化很大,远小于操作系统运行时间,所以智能等待会影响到性能。这些驱动程序常常检测状态寄存器,此时降低时钟速度将节省一部分电源,但会对数据写入卡时间产生轻微影响(多数处理器循环用于查询) 

当然,问题是要知道何时能降低时钟频率和电压而不会显著影响性能。作为软件开发商,考虑什么时候降低驱动器和应用代码的时钟速度比较难处理,该技术在多任务处理环境中更加富有技巧性。 

智能关机 

迄今为止,我们只讨论了设备在运行时能做什么,现在让我们来考虑关闭时会出现什么情况。我们很多人都希望,打开PDA后它会处于我们上次使用结束时的状态,假如我们正在输入一个新的联系信息时关机,那么我们一周或一月以后重新打开还将在这个地方。这可以采用智能关机程序实现,该程序能有效地骗过任何执行应用软件,使其以为设备根本就没有关闭。 

在用户按下电源按钮关闭设备时,有一个中断给操作系统发出关机信号,然后的动作包括保存系统最底层寄存器内容。操作系统实际上没有关闭程序,只是把其内容(代码、栈、堆、静态数据)留在存储器里,然后把处理器置于睡眠模式,关闭处理器内核和外设,但继续供电给重要的内部电路,如实时时钟。此外,靠电池支持的DRAM在睡眠模式期间保持自刷新状态,以使其内容完整无缺。 

再次按下电源按钮时,一个中断发信号唤醒处理器。唤醒中断服务程序(ISR)采用求校验和程序来验证处理器内部状态恢复之前DRAM的内容仍然保持原样。由于DRAM应含有与关机时一样的数据,所以操作系统能直接回到设备关闭时运行的线程,就应用而言,它甚至根本不知道发生了什么。 

说这个方法省电主要原因是它避免了需要处理器大量计算且耗时的重启工作。一个复杂设备重新启动要花好几秒时间,其间系统装载驱动程序。从用户的立场来看,这个时间是浪费,因为他在这段时间实际上不能用设备。考虑到需要多次开关的这种电池驱动装置,智能关机程序有很大意义,一是降低了功耗,二是提高了可用性。 

智能关机另一个重要特性是在睡眠模式期间可最大程度降低功耗。由于电池驱动设备会一整夜或整个周末放在一边的桌上,需要电源刷新DRAM和部分处理器外设接口,所以电池实际上在睡眠期间也会损失一些能量,最大限度减少睡眠模式下的功耗可以一次充电用上数周,而不用每天都给电池充电。 

减少睡眠模式下的功耗需要分析系统硬件,并确定如何将其设置为尽可能最低的电源状态。大多数电池驱动系统在睡眠模式期间仍然要给通用I/O引出端供电。这些I/O引出端作为输入可用做中断以唤醒设备,作为输出则用于给外接外设进行配置。认真考虑这些引出端如何配置将对睡眠模式下的功耗产生很大影响。 

例如把某个I/O引脚配置成输出,它将被上拉到Vcc,但如果在关机时把引出端设置为逻辑0将会导致电流穿过睡眠模式下的上拉电阻。另外,如果把一个引脚设置为输入而不与输出端连接,它将会漂浮引起虚假的逻辑变换,从而增加功耗。重要的是,应分析这些情况并适当配置引脚。 

本文结论 

有很多技术可以用来降低电池驱动装置的功耗,有些简单易懂,有些则不是如此。幸运的是,由于嵌入式装置中的电源管理越来越重要,设计人员未来在很多地方都能得到支持,如已经出现的软件技术就可以有助于降低功耗。同时,研究人员还在研究能优化代码的编译器,以进一步降低功耗,而且你还可以让软件开发工具自动考虑这些电源管理技术。 

 

 

 

经过近几年的快速发展,嵌入式系统已经成为电子信息产业中最具增长力的一个分支。随着手机、PDAGPS、机顶盒等新兴产品的大量应用,嵌入式系统的市场正在以每年30%的速度递增(IDC预测),嵌入式系统的设计也成为软硬件工程师越来越关心的话题。 

在嵌入式系统的设计中,低功耗设计(Low-Power Design)是许多设计人员必须面对的问题,其原因在于嵌入式系统被广泛应用于便携式和移动性较强的产品中去,而这些产品不是一直都有充足的电源供应,往往是靠电池来供电,所以设计人员从每一个细节来考虑降低功率消耗,从而尽可能地延长电池使用时间。事实上,从全局来考虑低功耗设计已经成为了一个越来越迫切的问题。 

那么,我们应该从哪些方面来考虑低功耗设计呢?笔者认为应从以下几方面综合考虑: 

处理器的选择 
接口驱动电路设计 
动态电源管理 
电源供给电路的选择 
下面我们分别进行讨论: 

一、处理器的选择 

我们对一个嵌入式系统的选型往往是从其CPU和操作系统(OS)开始的,一旦这两者选定,整个大的系统框架便选定了。我们在选择一个CPU的时候,一般更注意其性能的优劣(比如时钟频率等)及所提供的接口和功能的多少,往往忽视其功耗特性。但是因为CPU是嵌入式系统功率消耗的主要来源---对于手持设备来讲,它几乎占据了除显示屏以外的整个系统功耗的一半以上(视系统具体情况而定),所以选择合适的CPU对于最后的系统功耗大小有举足轻重的影响。 

一般的情况下,我们是在CPU的性能(Performance)和功耗(Power Consumption)方面进行比较和选择。通常可以采用每执行1M次指令所消耗的能量来进行衡量,即Watt/MIPS。但是,这仅仅是一个参考指标,实际上各个CPU的体系结构相差很大,衡量性能的方式也不尽相同,所以,我们还应该进一步分析一些细节。 

我们把CPU的功率消耗分为两大部分:内核消耗功率PCORE和外部接口控制器消耗功率PI/O,总的功率等于两者之和,即P=PCORE+PI/O。对于PCORE,关键在于其供电电压和时钟频率的高低;对于PI/O来讲,除了留意各个专门I/O控制器的功耗外,还必须关注地址和数据总线宽度。下面对两者分别进行讨论: 

1
CPU供电电压和时钟频率 

我们知道,在数字集成电路设计中,CMOS电路的静态功耗很低,与其动态功耗相比基本可以忽略不计,故暂不考虑。其动态功耗计算公式为: 

Pd=CTV2f 

式中,Pd---CMOS芯片的动态功耗
CT----CMOS
芯片的负载电容
V----CMOS
芯片的工作电压
f-----CMOS
芯片的工作频率 

由上式可知,CMOS电路中的功率消耗是与电路的开关频率呈线性关系,与供电电压呈二次平方关系。对于一颗CPU来讲,Vcore电压越高,时钟频率越快,则功率消耗越大。所以,在能够满足功能正常的前提下,尽可能选择低电压工作的CPU能够在总体功耗方面得到较好的效果。对于已经选定的CPU来讲,降低供电电压和工作频率,也是一条节省功率的可行之路。 

2
、总线宽度 

我们还经常陷入一个误区,即:CPU外部总线宽度越宽越好。如果我们仅仅从数据传输速度上来讲,也许这个观点是对的,但如果在一个对功耗相当敏感的设计来说,这个观点就不一定正确了。 

同样引用公式Pd=CTV2f ,对于每一条线(地址等数据线)而言,都会面临这样的功率消耗,显而易见,当总线宽度越宽的时候,功耗自然越大。每条线路的容性负载都不太一样,但一般都在412PF之间。我们来看下面一个例子:一片1Mbit Flash通过8bit16bit 总线与CPU相连,总线频率为4MHZ ,总线电压为3.3V。我们可以得到以下结果: 



由上可见,采用16-bit总线和采用8-bit总线会有3.7mw的功耗差异。 

当然,如果需要大量频繁地存取数据的场合下,用8-bit总线不见得会经济,因为增加了读写周期。 

另外,从上面的例子我们也可以看到:如果CPU采用内置Flash的方式,也可大大地降低系统功率消耗。 

二、接口驱动电路的低功耗设计 

接口电路的低功耗设计,往往是容易被大家所忽略的一个环节,在这个环节里,我们除了考虑选用静态电流较低的外围芯片外,还应该考虑以下几个因素: 

上拉电阻/下拉电阻的选取 
对悬空脚的处理 
Buffer
的必要性 
通常我们习惯随意地确定一个上拉电阻值,而没有经过仔细地计算。现在我们来简单计算一下,如果在一个3.3V的系统里用4.7KΩ为上拉电阻,当输出为低的时候,每只脚上的电流消耗就为0.7mA,如果有10个这样的信号脚时,就会有7mA电流消耗在这上面。所以我们应该在考虑在能够正常驱动后级的情况下(即考虑ICVIHVIL,尽可能选取更大的阻值。现在很多应用设计中的上拉电阻值甚至高达几百。另外,当一个信号在多数情况下时为低的时候,我们也可以考虑用下拉电阻以节省功率。 

CMOS
器件的悬空脚也应该引起我们的重视。因为CMOS悬空的输入端的输入阻抗极高,很可能感应一些电荷导致器件被高压击穿,而且还会导致输入端信号电平随机变化,导致CPU在休眠时不断地被唤醒,从而无法进入休眠状态或其他莫名其妙的故障,所以正确的方法是将未使用到的输入端接到VCC或地。 

Buffer
有很多功能,如电平转换,增加驱动能力,数据传输的方向控制等等,但如果仅仅基于驱动能力的考虑增加Buffer的话,我们就应该慎重考虑了,因为过驱动会导致更多的能量被白白浪费掉。所以我们应该仔细检查芯片的最大输出电流IOHIOL是否足以驱动下级IC,如果可以通过选取合适的前后级芯片来避免Buffer的使用,对于能量来讲是一个很大的节约。 

三、动态电源管理(DPM 

所谓动态的电源管理就是在系统运行期间通过对系统的时钟或电压的动态控制来达到节省功率的目的,这种动态控制是与系统的运行状态密切相关的,这个工作往往通过软件来实现。 

1
、选取不同工作模式 

如前所述,系统时钟对于功耗大小有非常明显的影响。所以我们除了着重于满足性能的需求外,还必须考虑如何动态地设置时钟来达到功率的最大程度节约。CPU内部的各种频率都是通过外部晶振频率经由内部锁相环(PLL)倍频式后产生的。于是,是否可以通过内部寄存器设置各种工作频率的高低成为控制功耗的一个关键因素。现在很多CPU都有多种工作模式,我们可以通过控制CPU进入不同的模式来达到省电的目的。 

我们以SAMSUNG S3C2410X 32bit ARM 920T内核)为例,它提供了四种工作模式:正常模式、空闲模式、休眠模式、关机模式,各种模式的功耗如下: 



由上图可见,CPU在全速运行的时候比在空闲或者休眠的时候消耗的功率大得多。省电的原则就是让正常运行模式远比空闲、休眠模式少占用时间。在类似PDA的设备中,系统在全速运行的时候远比空闲的时候少,所以我们可以通过设置使CPU尽可能工作在空闲状态,然后通过相应的中断唤醒CPU,恢复到正常工作模式,处理响应的事件,然后再进入空闲模式。 

2
、关闭不需要的外设控制器 

一般来讲,CPU都提供各种各样的接口控制器,如I2CI2SLCDFlashTimerUARTSPIUSB等等,但这些控制器在一个设计里一般不会全部都用到,所以我们对于这些不用的控制器往往任其处于各种状态而不用花心思去管。但是,当你想尽可能节省功耗的情况下,则必须关注它们的状态,因为如果不将其关闭,即使它们没有处于工作状态,但是仍然会消耗电流。仍以S3C2410X来讲: 



从上表我们可以看到,通过设置寄存器我们可以有选择地关闭不需要的功能模块,以达到节省电的目的,比如在我们的实际应用中,ADCI2CI2SSPI都没有用到,通过CLKCON寄存器的设置,我们可以节省2mA的电流。当然,也可以动态关闭一些仍然需要的外设控制器来进一步节省能量。如在空闲模式下,CPU 内核停止运行,我们还可以进一步关闭一些其他的外设控制器,如USB,SDI,FLASH等,只要保证唤醒CPUI/O控制器正常工作即可,如通过UART唤醒,则UART控制器不能被关闭。等到CPU被唤醒后,再将USBSDIFlash等控制器再打开。 

上面两种方式只是动态电源管理的最为简单的实现。在这两种方式中,一种是通过改变了系统的时钟频率,另一种是通过控制外设控制器的开关来达到节约能量的目的。在最近的研究中,已经有人把目光投入到了同时动态改变处理器的电压和频率来进一步节省功率,如IBMMontaVista合作进行的嵌入式系统的动态电源管理的研究。这是一个更为复杂、也更为系统的工程,它涉及了从硬件到操作系统以及应用层的有关内容。 

四、电源供给电路 

在数字电路设计中,工程师往往习惯于采用最简单的方式来完成电源的设计,但在对功耗要求严格的情况下,我们就必须对采用何种电压变换结构仔细考虑一番再做决定。 

通常来讲,我们有以下几种进行电压转换的方式: 

线性稳压(Linear Regulator 
DC to DC 
LDO
Low Drop-Out 
其中LDO本质上还是一种线性稳压,主要用于压差较小的场合。所以我们将其合并为线性稳压来谈。 

对于线性稳压来说,其特点时电路结构简单,所需元件数量少,输入和输出压差可以很大,但其致命弱点就是效率低,功耗高。其效率η完全取决于输出电压大小。下图是线性稳压器LM7805的输出电流大小相对压差的曲线图。 



由图中可见,压差越大,可提供的最大输出电流越小。假设采用LM7805,输入12V,输出电压为5V,压差为7V, 输出的电流为1A的情况下,我们可以计算出消费在线性稳压器上的功率为P=ΔV*IOUT=7*1=7w,效率仅为η5×1/(5*1+7*1)=41.7%,由这个结果我们可以看出,有一大半功率消耗在IC本身上。 

DC to DC
电路的特点是效率高,升降压灵活,但缺点时电路相对复杂,干扰较大。一般常见的由BoostBuck两种电路,前者用于升压,后者用于降压,示意图如下: 



这两种电路的核心是通过MOS管的开关来控制电感和电容间的能量转换。调节MOS管栅极脉冲信号的占空比可以控制MOS管的导通和关闭,从而改变输出电压的高低。 

下图是一个从12V转换到5VDC to DC电路图,其控制IC采用国家半导体(NS)的LM2596,实际是采用Buck电路,其MOSFET和相关的控制电路位于芯片内部,其转换效率图如下: 



由转换效率图可见,当输入为12v,输出为5v时,转换效率约为82%,为线性稳压器转换效率的一倍。LM2596的开关频率为固定的130KHZ,如果我们提升器件的开关频率,如采用NSLM2676时(260KHZ开关频率),在同样的应用条件下,效率可达88%以上。 

从上面的论述中我们可见,在适当的情况下使用DC-DC的电压转换线路,可以有效地节约能量,降低整机功耗。

 

 

你可能感兴趣的:(嵌入式系统(RTOS)比较)