摘要:系统功耗是嵌入式系统的一个重要方向,功耗很大程度上取决于执行的软件。传统的底层指令级模型功耗分析方法虽然能比较准确地估算出嵌入式系统的功耗,但是这种方法所需要的时间过长。本文介绍一种高层嵌入式软件功耗分析估测方法,以对象函数所使用的算法的复杂度来对该函数构建功耗模型,从而根据此功耗模型能快速估算出该函数在各种输入情形下的功耗情况。
1 嵌入式软件功耗
嵌入式系统的功耗主要来自微处理器的功耗与外围部件的功耗。虽然能量的水泵最终发生在底层硬件,但是微处理器的功耗很大程度上取决于其所执行的软件。因此,对嵌入式系统的功耗分析越来越多地转移到软件的角度上来,将能量的消耗过程视作软件执行过程。
目前的嵌入式软件功耗分析大多数都是基于指令级功耗模型的分析方法。在这种模型中,嵌入式软件程序的功耗由单条指令的基本功耗开销、连续执行不同类型的指令造成的功耗开销以及额外的功耗开销(如流水线断流、Cache不命中)等构成。虽然这种底层的嵌入式软件功耗的分析方法的准确性较高,但是其分析过程需要在特定微处理器平台上将程序翻译成汇编指令,然后通过逐条指令功耗分析和综合因素考虑,最后才能估算出该程序在某种微处理器上执行的系统功能,需要相当长的分析时间。
2 基于复杂度的嵌入式软件功耗模型
针对指令级功耗模型的瓶颈,本文介绍一种基于复杂度的嵌入式软件功耗模型,利用现有条件能快速估算出某函数的功耗情况。
在嵌入式软件应用中大量使用的多媒体计算和其它数据密集型计算中,经常用到诸如查找、排序、矩阵运算等算法。由于这些算法的平均复杂度都是已知的,因此复杂度成为这些嵌入式软件程序的一个重要特征,同样也能够成为分析和估测嵌入式软件功耗的一种重要依据。基于复杂度的嵌入式软件功耗模型以具体函数所使用的算法的复杂度为建模的参数,选取该函数的典型输入,并利用现有指令级模型分析方法获得该函数在这些典型输入情况下的功耗,利用回归算法出该函数软件功耗模型的系数,从而获得完事的该函数软件功耗模型,并可以用于快速估算该函数在任何输入情况下的软件功耗。
在某函数的算法复杂度是已知的或较容易获得的情况下,假设该函数的执行所需功耗与其复杂度有关,则可以使用一个线性公式来描述该函数的软件功耗:

其中Pj为模型的参数与函数的算法复杂度与函数的输入相关;cj为相应的系数;p是参数个数。
构建模型的第一步是决定描述功耗模型的参数Pj。参数的选择与具体的函数所使用的算法密度相关。几种比较常见的算法的功耗模型可以表1中的线性公式来描述。
表1 基于复杂度的软件功耗模型
| 算 法 | 平均复杂度 | 软件功耗宏模型 |
| 数组求和 | O(n) | c1+c2N |
| 插入排序 | O(n2) | c1+c2N+c3N2 |
| 快速排序 | O(nlog2n) | c1+c2N+c3Nlog2N |
参数确定之后,必须找到相应的系数cj,这是整个算法中最重要的步骤。一旦获得系数cj后,就可以利用这些系统估算出该函数在任何输入情况下的功耗。
要算出系数,首先要确定该函数的典型输入集合S={I1,I2,…,In},S中的每个Ii都与该函数一组模型参数Pj相对应。n个Ii对应形成一个该函数的模型参数矩阵。

通过底层指令级模型分析得到该函数在每组参数Ii情况下的功耗。
![]()
其中然后通过矩阵运算即可回归出参数向量C。
![]()
3 基于复杂度的插入排序函数软件功耗建模
以下将以Integrator/CM7TDMI评估板的ARM7TDMI微处理器为基础,对插入排序函数来构建基于复杂度的嵌入式软件功耗模型。
假设某运行在ARM7TDMI处理器上的函数,对一长度为n的整形数组a[n]使用简单插入排序算法进行排序。算法的C语言代码与其经过ARMCC编译器编译后的汇编代码如下:
void ins_sort(int a[],int n){
int x,i,j;
for(i=1;i for(j=0;j if(a[i] x=a[j]; a[j]=a[i]; a[i]=x; } } } ins_sort PROC STR lr,[sp,#-4]! MOV r3,#1 B |L1.56| |L1.12| MOV r2,#0 B |L1.44| |L1.20| LDR r12,[r0,r3,LSL #2] LDR lr,[r0,r2,LSL #2] CMP r12,lr STRLT r12,[r0,r2,LSL #2] STRL lr,[r0,r3,LSL #2] ADD r2,r2,#1 |L1.44| CMP r2,r3 BLT |L1.20| ADD r3,r3,#1 |L1.56| CMP r3,r1 BLT |L1.12| LDR pc,|sp|,#4 3.1 基于复杂度的功耗模型 简单插入排序算法平均复杂度为O(n2)。该函数的软件功耗模型可用如下线性公式描述: 其中,n为数组的长度,E为在输入数组长度的n的情况下函数的功耗。 3.2 获得系数cj 在这一步骤中,主要以Integrator/CM7TDMI评估板的三段流水线、不设cache的ARM7TDMI处理器的指令级功耗模型为基础,分析该插入排序函数分别在输入数组长度n=10、20、40情况下的功耗情况,并通过回归法获得系数cj。 在该指令级功耗模型中,指令执行的功耗主要来自两个部分:执行单条指令引起的功耗(base cost)与连续执行不同类型的指令导致处理器状态改变所引起的额外功耗(inter-instruction cost)。其公式如下: 其中,Ei为执行第I条指令的基本指令功耗(表2),Oij为连续执行第I条和第I指令引起的额外功耗(表3),ε为流水线断流引起的功耗(表4)。![]()

表2 Integrator/CM7TDMI ARM7TDMI基本指令功耗Instruction E/nJ Instruction E/nJ ADD R2,R0,R1 0.710 KDR R2,[R1,R3] 2.774 AND R2,R0,R1 0.856 STR R2,[R1,R3] 1.961 ORR R2,R0,R1 0.907 MUL R2,R0,R1 2.768 ORRS R2,R0,R1 0.967 MLA R2,R0,R1,R0 3.748 MOV R2,R1 0.935 CMP R0,R1 0.751 MOV R0,R0 0.903 SWP R2,R0,[R1] 3.917 ADD R2,R0,R1,ASR R3 2.137 MRS R2,CPSR 0.977 B lable 3.095 MSR CPSR_f,R2 1.143
表3 执行连接两条源操作数类型不同指令的功耗
| Instr1/Instr2 | SHIFT_REG | SHIFT_IMM | REG | IMM |
| SHIFT_REG | -0.332 | -0.215 | -0.232 | -0.159 |
| SHIFT_IMM | -0.269 | -0.177 | -0.165 | -0.103 |
| REG | -9.02E-02 | -5.98E-02 | -0.186 | -0.200 |
| IMM | -0.141 | -5.35E-02 | -9.08E-02 | -7.53E-02 |
表4 流水线断流引起的功耗
| Instruction type | Energy cost/nJ |
| Any | 2.04 |
根据以上表中的数据结合该函数汇编指令,得出该插入排序函数的指令级功耗分析情况(表5)。
表5 简单插入排序指令级功耗分析
| 指 令 | Base cost | Inter cost | Stall cost |
| MOV r3,#1 | 0.930 | - | - |
| B |L1,56| | 3.100 | -0.075 | 2.04 |
| MOV r2,#0 | 0.930 | -0.032 | - |
| B |L1,44| | 3.100 | -0.075 | 2.04 |
| LDR r12,[r0,r3,LSL #2] | 3.270 | -0.032 | - |
| LDR lr,[r0,r2,LSL #2] | 3.270 | -0.177 | - |
| CMP r12,lr | 0.830 | -0.165 | 2.04 |
| STRIT r12,[r0,r2,LSL #2] | 2.480 | -0.060 | - |
| STRLT lr,[r0,r3,LSL #2] | 2.480 | -0.177 | - |
| CMP r2,r2,#1 | 1.590 | -0.103 | - |
| CMP r2,r3 | 0.830 | -0.091 | 2.04 |
| BLT |L1.20| | 3.100 | -0.060 | 2.04 |
| ADD r3,r3,#1 | 1.590 | -0.075 | - |
| CMP r3,r1 | 0.830 | -0.091 | 2.04 |
| BLT |L1.12| | 3.100 | -0.200 | 2.04 |

至此,可以得出完整的简单插入排序函数的基于复杂度的嵌入式软件功耗模型
E=93.51-5.38n+10.67 2
3.3 基于复杂度的嵌入式软件功耗模型的估算功耗
当输入数组长度为n=80的情况下,通过该模型可快速估算出插入排序函数的功耗
E=93.51-5.38×80+10.67×1600=67924.85(nJ)
与指令级功耗模型的估测值误差小于1%(表6),而利用基于复杂度的功耗模型估测该函数执行所需的功耗的速度而大大提高。
表6 各种数组长度下简单插入排序指令级功耗
| 数组长度 | 指令级功耗模型估测 | 基于复杂度的功耗模型估测 | 误 差 |
| n=10 | 1106.338 | - | - |
| n=20 | 4252.333 | - | - |
| n=40 | 16943.823 | - | - |
| n=80 | 67604.803 | 67924.85 | 0.4% |
4 总结
本文介绍了一种基于复杂度的嵌入式软件功耗模型,以对象函数的算法平均复杂度的建模参数,利用现有底层指令级功耗模型对函数进行分析,回归出必需的系数,得到该函数完整的基于复杂度的嵌入式软件功耗模型,从而可快速估算出该函数在不同输入情况下的软件功耗。这种分析方法的缺点在于只适用于算法复杂度明显的一些函数,从而较容易构建基于复杂度的模型。另外在建模过程中,仍然需要指令级功耗模型的分析法的协助。
- 功耗模型(6263)
业务复杂度治理方法论--十年系统设计经验总结
1847
嵌入式软件动态的基本路径测试步骤是什么?
嵌入式软件和非嵌入式软件区别
嵌入式软件开发应该掌握哪些知识?
嵌入式软件开发特点是什么
嵌入式软件测试的研究
嵌入式应该学些什么?
嵌入式系统软件开发环境
嵌入式系统和实时系统开发的关键工艺
嵌入式系统和实时系统开发的关键工艺是什么?
嵌入式系统的软件部分
嵌入式组态软件系统应用举例
嵌入式视频教程之软硬件关系的复杂度
嵌入式视频教程之软硬件关系的复杂度
嵌入式视频教程之软硬件关系的复杂度
嵌入式设备的发展:解决复杂的设计挑战
PCB与PCBA工艺复杂度的量化评估与应用初探!
什么叫嵌入式软件
什么是嵌入式软件
公司招聘嵌入式软件开发,求推荐!
在嵌入式Linux下软件编写的几种功耗策略
在以下嵌入式软件设计模型中,属于数据流模型的是,哪里有设计模型的介绍?
基于模型的嵌入式软件开发设计
基于路径覆盖的嵌入式软件动态该怎么测试?
如何对嵌入式软件进行覆盖测试?
如何对日益复杂的嵌入式软件进行快速有效的测试?
怎么才能在嵌入式设计中降低CPLD的功耗?
怎么设计基于路径覆盖的嵌入式软件动态测试?
怎么降低嵌入式芯片的功耗?
时间复杂度是指什么
求一种基于模型检查的嵌入式软件验证方法
纯软件和嵌入式软件区别
组件技术在嵌入式软件中有何作用
解析嵌入式软件开发语言:嵌入式C编程
解析嵌入式软件开发语言:嵌入式C编程
基于模块化设计的嵌入式软件测试方法
23构造嵌入式系统软件的构件模型研究
17基于嵌入式组件电能质量分析软件的研究
20嵌入式ZigBee串口模块的设计
57基于模块化设计的嵌入式软件测试方法
2343
基于CodeTEST的嵌入式软件测试技术
41嵌入式系统及其实时软件的开发
55嵌入式系统设计中的低功耗技术
1606嵌入式软件开发中构件技术的研究
32如何利用嵌入式仪器调试SoC?
7703SCADE为嵌入式软件提供了一套基于模型的开发方式
7实时多任务嵌入式软件的架构方式的设计应用
1基于模型检查的嵌入式软件验证方法解析
0嵌入式程序开发
8图像复杂度对信息隐藏性能影响分析
5开源与嵌入式软件设计:需要被管理的复用
435嵌入式系统的组成及其低功耗的设计
9基于SCADE模型的高安全性嵌入式软件解决方案设计
3325
随着嵌入式系统复杂度的提高 软硬件的协同是嵌入式系统的关键
1145基于嵌入式软件的JNI技术应用解析
1395
航天高可靠嵌入式实时操作系统的详细资料简介
3如何为嵌入式应用程序选择操作系统
1378嵌入式软件复习总结
7嵌入式软件测试参考书籍
51嵌入式软件测试研究意义,嵌入式软件测试的研究
17嵌入式软件开发环境
7嵌入式Linux的低功耗策略
1嵌入式软件开发的特点、设计流程、嵌入式软件的结构
38嵌入式系统设计的问答
6嵌入式系统笔记
3几款常见的嵌入式软件测试工具
8222
谈谈汽车嵌入式软件
1600嵌入式软件的设计模式(上)
2167
嵌入式软件架构设计之程序分层
2692
攻破嵌入式系统开发中的复杂代码
451如何计算时间复杂度
4716
软件架构搞好了,还用担心代码可读性差?
861
嵌入式机器学习的应用特性与软件开发环境
1340
电子发烧友App


评论