嵌入式系统中程序功耗的分析及优化
- 格式:pdf
- 大小:96.76 KB
- 文档页数:1
嵌入式系统中程序功耗的分析及优化
任斌
(江苏食品职业技术学院计算机应用技术系江苏淮安223003)
[摘要]分析嵌入式系统中程序功耗产生来源及各种不同操作所产生的功耗,同时提出功耗优化的方法。
[关键词]嵌入式系统功耗优化
功耗是采用电池供电的嵌入式系统中一个特别重要的设计指标,因为
电池有使用寿命是较为有限的。而目前对于使用电网供电的嵌入式系统来
说,功耗指标也变成越来越重要了。由于快速的芯片在运行时会产生较大
的热量,因而,控制系统功耗是提高系统稳定性并降低成本的重要因素。
虽然系统中的硬件消耗的电能(如显示、输入设备等所需的电能)直
接影响了系统的功耗性能,但程序消耗的能量也对系统的功耗性能有很大
的影响,可以这样说,在相同的硬件平台下,程序的耗能情况将直接决定
着系统功耗性能。
一、程序功耗分析
对于嵌入式系统的功耗,程序如何才能施加影响呢?虽然系统必需消
耗所需的能量才能完成相应的功能。但是,对程序加以优化仍有减少系统
功耗的可能。一些可行的做法有:在程序设计时,应尽可能用工作效率高
而省电的算法;程序消耗的能量主要体现之一是读写存储单元,内存访问
在许多应用程序中是功耗的主要部分,因此,通过优化内存访问可以显著
地降低程序的功耗;当系统可以处于休眠状态时,就尽可能地使系统处于
休眠状态。即关闭系统的一部分,例如CPU的子系统、系统显示等;
优化程序,减少能量消耗的第一步是了解程序消耗了多少能量。可以
通过如下图所示的方式来测试一条指令或一小段程序代码的功耗。该技术
是通过反复循环执行某段代码来测
量流过CPU的电流,从而计算出整段
程序代码的功耗。即通过单独测量
没有循环体的空循环不,然后再测
量只含有某段程序指令的循环的功
耗,就可以由其与空循环功耗之差
来确定体内该段程序的功耗
实现同一个功能,不同的程序
员所编写的程序可能是不相同的,因而,使得系统功耗也会不同。那么影
响程序对能量消耗有哪些方面的因素呢?主要有以下几个:程序消耗的能 量随程序中采用的指令不同而不同;程序中指令次序对能量消耗有影响;
操作码以及操作数的位置对程序消耗能量也有影响。
当然,程序中选择使用何种指令会对程序的能量消耗产生影响,但对
大多数CPU来说,着力于选择用何种指令来实现编程,在能量消夏方面只能
获得有限的回报。因为程序必须进行一定数量的计算完成它的功能。当有
更好的算法可以完成该运算时,其基本运算消耗的能量只能改善整个程序
能量消耗总量的--+部分,通常还需为此付出极大的努力。另外,在选择
指令来优化程序的能量消耗时,还会遇到另一个障碍,即许多CPU芯片制造
商不能详尽地提供他们生产的微处理器指令的能量消耗。
在许多应用程序中,程序中对存储器的操作是程序消耗能量最大因
素,因而,致力于程序操作码以及操数的存放,减少对内存系统的读写,
会带来最大的节能效益,下图显示了某些操作的能量消耗对比。从图中可
加 乘外部YO访问 内存访问 以看出,在所有的CPU指令中,完
成内存传输的指令是CPU完成的所
有操作中消耗能量最多的操作,一
次内存传输操作消耗的能量是一次
加法运算消耗能量的33倍。因此,
合理组织内存中的数据和指令能达
到优化能量消耗的最大收益。程序
中就尽量采用寄存器临时数据,这可以减少能量消耗;同时高速缓存的访 -l。l重I
问比大多数主存在访问消耗能量小。
采用高速缓存是程序执行时能量消耗的另一个重要方法。一方面,一
次高速缓存命令中节省了大量的对主存访问,另一方面,高速缓存在器件
本身相对节能一些,因为高速缓存是由SRAM而非DRAM制成。但高速缓存的
价格比较高,因此,如果能够控制高速缓存的容量大小,那么就应该以最
小的高速缓存来提供必要的性能。
但是,随着高速缓存容量的增大,在CPU中运行的程序所消耗的能量
就会下降,然而,高速缓存在器件本身又会造成能量消耗。通过测试试验
表明:许多程序在能量消耗上有一个转折点。因为,如果高速缓存容量太
小,程序运行将变慢,并且系统由于需经常访问内存而将消夏大量的能
量。如果高速缓存容量太大,器件本身的功耗就太高,而没有带来与此相
应的功耗性能上的提高。因此,取一个折中值,将可以使程序执行时间和
程序功耗都得到较大的提高。
二、功耗优化
一般而言,使程序代码更短、程序运行得更快就能降低能量消耗。
当一个嵌入式系统硬件平台设计好后,能够被编程人员合理控制的最
大因素就是内存访问模式,编程人员通过它来实现降低功耗。另一种减少
功耗的方法是通过重新组织程序中的指令或选择不同的指令编写程序,但
其产生的效果不太明显,并依赖于所涉及的微处理器。具体改进能量消耗
的方法有:
(1)尽量有效地使用CPU内部寄存器。使程序成组地访问一个变量
值 以便这个值被写入寄存器并被保存。
(2)分析高速缓存行为并发现主要的高速缓存冲突,然后重构该程
序代码,尽可能消除这些冲突。这些冲突是:①标题数据冲突:把数值移
到不同的位置以尽量减少冲突;②数组数据冲突:考虑移动数组或修改数
组访问模式以减少冲突;③指令冲突:如果冲突的程序代码段较小,试着
重写该程序段,使之尽可能小,以便更好地适用于高速缓存,使用汇编语
言也许是很有必要的。如果冲突的程序代码段跨度很大,尽可能移走指令
或用NOP填充。
(3)在任何可能的情况下,使用分页模式访问内存系统,分页模式
读写能够在访问内存时减少一步操作 可以通过组织程序中的变量,使更
多的变量可以被引用,从而提高分页模式的使用效率。
(4)适度的循环展开可以清洁卫生循环控制开销,然而,当循环展
开使用太频繁,线性代码的低命中率会使功耗上升。
(5)软件流水减少了流水线迟延,从而可以降低每一条指令的平均
能量消耗。
(6)尽可能消除程序中的递归函数调用,这可以减少函数调用时的
部分开销,进而降低程序的功能。
参考文献:
[1]马忠梅,徐英慧等编著
京航空航天大学出版社,2002.
[2]Wayne Wolf著,孙玉芳、
制工业出版社,2002. AT91系列ARM核微控制器结构与开发.北
梁彬等译,嵌入式系统计算设计原理.机
作者简介:
任斌,男,江苏淮安,工学硕士,讲师,研究方向:网络多媒体、嵌
入式计算。 ・