專利名稱:一種基于c語言的嵌入式軟件能耗估算方法
技術(shù)領(lǐng)域:
本發(fā)明涉及嵌入式軟件功耗優(yōu)化技術(shù)領(lǐng)域,尤其是涉及一種基于C語言的嵌入式軟件能耗估算方法。
背景技術(shù):
在全球能源緊缺和環(huán)境污染問題日益突顯的背景下,各學(xué)科領(lǐng)域的節(jié)能減排問題受到越來越多的關(guān)注。全球目前有超過30億臺(tái)計(jì)算機(jī),這些計(jì)算機(jī)的年電力消耗超過1000億千瓦時(shí)。而在這些消耗中,又以無處不在的嵌入式設(shè)備能耗占大部分。因此,研究嵌入式設(shè)備的能耗問題對(duì)緩解日益嚴(yán)重的能源和環(huán)境問題來說,是十分重要的。
嵌入式系統(tǒng)由嵌入式硬件部分和嵌入式軟件部分組成,因此嵌入式系統(tǒng)的能耗可劃分為硬件能耗和軟件能耗兩部分。其中硬件能耗就是指系統(tǒng)在運(yùn)行過程中硬件電路所產(chǎn)生的能耗;而在系統(tǒng)運(yùn)行過程中,軟件指令的執(zhí)行,數(shù)據(jù)的存儲(chǔ)都會(huì)驅(qū)動(dòng)硬件電路活動(dòng),在這種情況下產(chǎn)生的能耗稱為軟件能耗。嵌入式軟件能耗的測(cè)量和估算是開展嵌入式軟件能耗分析與優(yōu)化的基礎(chǔ)性工作。對(duì)嵌入式軟件能耗的測(cè)量和估算方法有多種,主要包括硬件平臺(tái)測(cè)量方法;指令級(jí)能耗估算方法;源程序級(jí)能耗估算方法。源程序級(jí)的能耗估算采用一種靜態(tài)語法分析方法,不采用目標(biāo)運(yùn)行平臺(tái)和仿真運(yùn)行平臺(tái),比指令級(jí)軟件能耗估算更加直觀、快捷,與現(xiàn)有開發(fā)工具更易集成。本發(fā)明就屬于源程序級(jí)能耗估算方法。因?yàn)榍度胧杰浖嗖捎肅語言開發(fā),本發(fā)明對(duì)C語言程序的結(jié)構(gòu)進(jìn)行研究,提出了一種基于C語言的嵌入式軟件能耗估算方法。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供了一種基于C語言的嵌入式軟件能耗估算方法。本發(fā)明解決其技術(shù)難題所采用的技術(shù)方案的步驟如下
1)因?yàn)镃語言程序由順序結(jié)構(gòu)、跳轉(zhuǎn)結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和函數(shù)調(diào)用結(jié)構(gòu)組成,所以C語言程序的能耗由這幾個(gè)部分的能耗組成,即
g —丁^loop ! unc_ccll
其中,表不嵌入式C程序的能耗,表不C程序中順序結(jié)構(gòu)的能耗,表不
C程序中跳轉(zhuǎn)結(jié)構(gòu)的能耗,Eloop表示c程序中循環(huán)結(jié)構(gòu)的能耗,Efzmc_CBll表示C程序中函數(shù)調(diào)用的能耗;
2)在步驟I)公式中的采用如下方法計(jì)算
定義數(shù)據(jù)結(jié)構(gòu)struct variable// 變量
{
int variable_kind;// 變量類型
char* variable_name;//變量名 char* variable_value;//以字符串形式存儲(chǔ)變量的值
struct variable* next;//指向下——variable 結(jié)豐勾
};
struct operator// 運(yùn)算符
{
int operator_kind;// 運(yùn)算符類型
int operator_treat;//運(yùn)算發(fā)生時(shí),如需轉(zhuǎn)化,按轉(zhuǎn)化后的類型處理
int operator_time;//該運(yùn)算符出現(xiàn)次數(shù),默認(rèn)為0
struct operator* next;//指向下——operator 結(jié)豐勾
};
struct variable_energy// 變量倉泛耗
{
int variable_time;//變量出現(xiàn)次數(shù)
double variable_energy;// 變量能耗值
};
struct variable氺 v_list;//變量鏈表 struct variable_energy v_energy [VAR] ; // 變量倉泛耗表
Essq的計(jì)算方法遍歷v_list鏈表,計(jì)算variable_kind相同的結(jié)點(diǎn)個(gè)數(shù),并存儲(chǔ)在
v_energy表中相應(yīng)類型結(jié)點(diǎn)的variable_time中,表v_energy的長度VAR為全部C語言變量類型的個(gè)數(shù),在結(jié)束整個(gè)C程序的處理后,遍歷v_energy表,將variable_time與
variable^nergy相乘,得到每種類型變量的總能耗,將每種類型變量總能耗累加便得
3)在步驟I)公式中的£/ ^采用如下方法計(jì)算
首先根據(jù)編譯原理判斷出跳轉(zhuǎn)結(jié)構(gòu)在執(zhí)行過程中的正確路徑,得到正確的執(zhí)行代碼,然后對(duì)正確的執(zhí)行代碼按順序結(jié)構(gòu)進(jìn)行處理,得出跳轉(zhuǎn)結(jié)構(gòu)的能耗值&_ ;
4)在步驟I)公式中A5i^采用如下方法計(jì)算
首先判斷循環(huán)結(jié)構(gòu)執(zhí)行過程中的循環(huán)的次數(shù),然后按照順序結(jié)構(gòu)處理循環(huán)體,最后結(jié)合循環(huán)體,以及循環(huán)次數(shù),進(jìn)行累加處理,得到整個(gè)循環(huán)結(jié)構(gòu)的能耗值爲(wèi);5)在步驟I)公式中的米用如下公式計(jì)算
^func_call — ^user_call 了 ^sys_call
其中民表示用戶函數(shù)調(diào)用的能耗,表示系統(tǒng)庫函數(shù)調(diào)用的能耗;
6)在步驟5)公式中采用如下方法計(jì)算
定義數(shù)據(jù)結(jié)構(gòu)
struct user_function// 用戶函數(shù)
{
char* function_name;//函數(shù)名
int function_return_kind;// 函數(shù)返回類型
int function_variable8_quantity;//函數(shù) 8 位參數(shù)的個(gè)數(shù),默認(rèn)為 O
int function_variablel6_quantity; //函數(shù) 16 位參數(shù)的個(gè)數(shù),默認(rèn)為 O int function_variable32_quantity; //函數(shù) 32 位參數(shù)的個(gè)數(shù),默認(rèn)為 O int function_variable64_quantity; //函數(shù) 64 位參數(shù)的個(gè)數(shù),默認(rèn)為 O struct user_function* next;//指向下——個(gè) user—function 結(jié)豐勾
int function_time;//函數(shù)被調(diào)用次數(shù),默認(rèn)為0
double function_energy;//函數(shù)體能耗值,默認(rèn)為0
};
struct user_function* uf_list;// 用戶函數(shù)鏈表
其中的function_energy可根據(jù)函數(shù)的返回類型、參數(shù)個(gè)數(shù)和參數(shù)類型,利用事先求得的原始函數(shù)能耗值計(jì)算得出,原始函數(shù)能耗值是指一個(gè)既無參數(shù)又無返回值的函數(shù)被調(diào)用時(shí)產(chǎn)生的能耗;
E-ussr_Can的計(jì)算方法為遍歷uf_list鏈表,得到每個(gè)函數(shù)被調(diào)用的次數(shù)function_time,將其與該函數(shù)的function_energy相乘,得到整個(gè)程序中該函數(shù)總能耗,將每個(gè)函數(shù)的總能耗累加便得;
7)在步驟5)公式中的^”彡^采用如下方法計(jì)算
除printf、scanf函數(shù)外,絕大部分C庫函數(shù)的內(nèi)部執(zhí)行路徑都比較固定,其能耗值也相對(duì)固定,因此,可事先測(cè)定除printf、scanf函數(shù)外的每個(gè)庫函數(shù)的單次調(diào)用能耗值;定義數(shù)據(jù)結(jié)構(gòu)
struct lib_function// 庫函數(shù){
char* lib_function_name;//庫函數(shù)名稱
int lib_function_time; //庫函數(shù)被調(diào)用次數(shù),默認(rèn)為0 struct lib_function* next;//指向下——個(gè) lib_function 結(jié)豐勾
};struct lib—function* If—list;//庫函數(shù)鏈表
Esys_€^i的計(jì)算方法遍歷If—list鏈表,將庫函數(shù)的lib—function—time與其事先測(cè)定的單次調(diào)用能耗值相乘,得到整個(gè)程序中該庫函數(shù)的總能耗,將每個(gè)庫函數(shù)的總能耗累加便得 ESyS _call O
具體實(shí)施例方式下面結(jié)合實(shí)例對(duì)本發(fā)明作進(jìn)一步說明。選取迷宮函數(shù)(MAZE)、約瑟夫環(huán)函數(shù)(J0SEPHU)、八皇后函數(shù)(QUEEN)、冒泡排序(BUBBULE)、矩陣乘法(MATRIX)作為測(cè)試用例。I)使用HMSim能耗模擬器運(yùn)行測(cè)試用例的結(jié)果為
程序名 E model (nj)E NMsim (n])誤差(%)
MAZE — 465418.85462662.340.60
JQSEPH~ 3059.242984. Ql2. 52
QUEEN — 153246. 86145489.045. 33
BUBBUL~ 188026. 74171645.959. 54
MATRIX |2947.25|2875. 71[2.49
表中誤差計(jì)算公式為
E model — E HMSim
—-二-X 100%
E_HMSim
2)在Winbond W90P71開發(fā)板上運(yùn)行測(cè)試用例的結(jié)果為
程序名 \E—model (nj) \E_W90P71 (nj) |誤差(%)
MAZE 465418.85464400"p.21 "
JQSEPHU 3059.242925~4.58 "
QUEEN 153246.86140404~9.14 "
BUBBULE 188026. 74183600~9.08 "
MATRIX |2947.25|2934|l. 03 "
表中誤差計(jì)算公式為
E model - E W90P71 二^^-二————-x 100%
E_wmpil
通過以上兩表實(shí)驗(yàn)數(shù)據(jù)對(duì)比可知,釆用本發(fā)明的方法估算的能耗值與能耗模擬器HMSim和Winbond W90P71開發(fā)板的測(cè)量能耗值誤差均在10%以內(nèi),說明本文提出的方法能夠快速、有效地估算嵌入式軟件的能耗值,為嵌入式軟件能耗優(yōu)化和分析奠定了重要的基礎(chǔ)。
權(quán)利要求
1. 一種基于C語言的嵌入式軟件能耗估算方法,其特征在于建立該方法的步驟如下 1)因?yàn)镃語言程序由順序結(jié)構(gòu)、跳轉(zhuǎn)結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和函數(shù)調(diào)用結(jié)構(gòu)組成,所以C語言程序的能耗由這幾個(gè)部分的能耗組成,即
全文摘要
本發(fā)明公布了一種基于C語言的嵌入式軟件能耗估算方法。提供了一種新的方法用于快速預(yù)測(cè)嵌入式軟件的能耗,為相應(yīng)的能耗優(yōu)化研究和開發(fā)工作提供了數(shù)據(jù)基礎(chǔ)。本發(fā)明從源程序級(jí)對(duì)用C語言開發(fā)的軟件的結(jié)構(gòu)進(jìn)行了研究,將軟件能耗按源程序的控制結(jié)構(gòu)進(jìn)行劃分,給出了程序中順序結(jié)構(gòu)、跳轉(zhuǎn)結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和函數(shù)調(diào)用結(jié)構(gòu)的能耗估算方法,進(jìn)而給出了整個(gè)程序的能耗估算方法。實(shí)驗(yàn)結(jié)果表明,采用本發(fā)明計(jì)算出的軟件能耗,與使用能耗模擬器測(cè)量的結(jié)果相比,誤差在10%以內(nèi),可準(zhǔn)確地反映嵌入式軟件的能耗情況。
文檔編號(hào)G06F11/36GK102750222SQ20121018017
公開日2012年10月24日 申請(qǐng)日期2012年6月4日 優(yōu)先權(quán)日2012年6月4日
發(fā)明者張文麗, 徐闊海, 段林濤, 沈艷, 熊偉, 王毅, 郭兵, 韓洪良 申請(qǐng)人:四川大學(xué)