<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 高效率嵌入式程序開(kāi)發(fā)技巧

高效率嵌入式程序開(kāi)發(fā)技巧

作者: 時(shí)間:2009-07-20 來(lái)源:網(wǎng)絡(luò ) 收藏

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

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

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

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

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

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

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

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

上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>