<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 高效率嵌入式程序開發(fā)技巧

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

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

          通常,工程師總是竭力避免使用冗余變量,以精簡程序。一般情況下這樣做是正確的,但是也有例外,如下所示:
          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時(shí)都要先從相應(yīng)的存儲(chǔ)器下載到寄存器里,經(jīng)f()或g()函數(shù)調(diào)用后再存儲(chǔ)回原來的存儲(chǔ)器里面。在該例子中,一共要進(jìn)行兩次這樣的下載/存儲(chǔ)操作。而在第二種情況test2()里,局部變量localerrs被分配以寄存器,這樣一來,整個(gè)函數(shù)就只需要一次下載/存儲(chǔ)全局變量存儲(chǔ)器了。盡量節(jié)省存儲(chǔ)器訪問的次數(shù),對于提高系統(tǒng)性能非常有用。

          循環(huán)程序的處理
          計(jì)數(shù)循環(huán)是程序中常用的流程控制結(jié)構(gòu)。在C中,類似下面的for循環(huán)比比皆是:
          for(loop=1;loop=limit;loop++)

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

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

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

          ARM處理器核對NZ(零比較轉(zhuǎn)移)有特別的指令處理,速度非常快,如果你的循環(huán)對方向不敏感,可以由大向小循環(huán)。需要注意的是,如果指針操作使用了i值,這種方法可能引起指針?biāo)饕绲膰?yán)重錯(cuò)誤(i = MAX+1)。當(dāng)然你可以通過對i做加減運(yùn)算來糾正,但是如果這樣就沒有提的作用了。

          結(jié)語
          本文對ARM總結(jié)了一些編程。在實(shí)際的系統(tǒng)開發(fā)中,可以大大的提高系統(tǒng)的性能,特別是在多媒體和通信等復(fù)雜度高的應(yīng)用中,對程序設(shè)計(jì)具有指導(dǎo)意義。

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

          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();