a一级爱做片免费观看欧美,久久国产一区二区,日本一二三区免费,久草视频手机在线观看

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 高效率嵌入式程序開發技巧

高效率嵌入式程序開發技巧

作者: 時間:2009-07-20 來源:網絡 收藏

通常,工程師總是竭力避免使用冗余變量,以精簡程序。一般情況下這樣做是正確的,但是也有例外,如下所示:
int f(void);
int g(void);
file://f()和g()不訪問全局變量errs
int errs; file://全局變量
void test1(void)
{ errs += f();
errs += g();
}
void test2(void)
{ int localerrs = errs;
// 定義冗余的局部變量
localerrs += f();
localerrs += g();
errs = localerrs;
}
在第一種情況test1()里,每次訪問全局變量errs時都要先從相應的存儲器下載到寄存器里,經f()或g()函數調用后再存儲回原來的存儲器里面。在該例子中,一共要進行兩次這樣的下載/存儲操作。而在第二種情況test2()里,局部變量localerrs被分配以寄存器,這樣一來,整個函數就只需要一次下載/存儲全局變量存儲器了。盡量節省存儲器訪問的次數,對于提高系統性能非常有用。

循環程序的處理
計數循環是程序中常用的流程控制結構。在C中,類似下面的for循環比比皆是:
for(loop=1;loop=limit;loop++)

這種累加計數的方法符合一般的自然思維習慣,所以比下面的遞減計數方法使用更多:
for(loop=limit;loop!=0; loop--)
這兩者在邏輯上并沒有效率差異,但是映射到具體的體系結構中,就產生了很大的不同。

累加法比遞減法多用了一條指令,當循環次數比較多的時候,這兩段代碼就會在性能上產生明顯的差異。分析其本質原因,在于當進行一個非零常數比較時,必須用專門的CMP指令來執行;而當一個變量與零進行比較時,ARM指令可以直接利用條件執行的特性(NE)來進行判斷。很多時候循環展開由編譯器自動完成,不過應注意對中間變量或結果被更改的循環,編譯程序往往拒絕展開,這時候就需要工程師自己來做展開工作了。

尤其值得注意的是,在有內部指令cache的CPU上(如ARM946ES芯片),因為循環展開的代碼很大,往往會出現高速緩沖存儲器溢出。這時展開的代碼會頻繁地在CPU的高速緩沖存儲器和內存之間來回調用,又因為高速緩沖存儲器速度很高,所以此時循環展開反而會變慢。同時,循環展開會影響矢量運算優化。

ARM處理器核對NZ(零比較轉移)有特別的指令處理,速度非常快,如果你的循環對方向不敏感,可以由大向小循環。需要注意的是,如果指針操作使用了i值,這種方法可能引起指針索引超界的嚴重錯誤(i = MAX+1)。當然你可以通過對i做加減運算來糾正,但是如果這樣就沒有提的作用了。

結語
本文對ARM總結了一些編程。在實際的系統開發中,可以大大的提高系統的性能,特別是在多媒體和通信等復雜度高的應用中,對程序設計具有指導意義。

linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

上一頁 1 2 下一頁

評論


相關推薦

技術專區

關閉