<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è) > 嵌入式系統 > 設計應用 > DSP編程技巧-使用代碼優(yōu)化時(shí)必須考慮的五大問(wèn)題

DSP編程技巧-使用代碼優(yōu)化時(shí)必須考慮的五大問(wèn)題

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

1. 小心使用匯編表達式

本文引用地址:http://dyxdggzs.com/article/201612/332391.htm

  在C/C++代碼中,有時(shí)候一些操作難免會(huì )對某些CPU寄存器進(jìn)行操作,此時(shí)要使用內嵌的匯編表達式,例如asm("EALLOW"),或者重置某個(gè)中斷的掩碼寄存器等。在優(yōu)化代碼時(shí),編譯器會(huì )重新調整某些代碼段的順序,自己決定使用某些寄存器(例如AR0-AR7這樣的輔助寄存器),甚至刪除某些編譯器認為無(wú)用的變量、函數等,但是編譯器一般情況下并不會(huì )對內嵌的匯編代碼進(jìn)行任何優(yōu)化(除非這段匯編代碼被編譯器認為是永遠不會(huì )執行到的無(wú)用代碼),這就造成了編譯器的優(yōu)化效果在這段匯編代碼和它的上下文代碼中無(wú)法進(jìn)行有效的優(yōu)化,特別是匯編代碼和C/C++代碼直接存在變量調用的情況下。所以非必要的情況下,要盡量避免C/C++和匯編語(yǔ)句的混用,如果確實(shí)需要的,也要在編譯之后檢查生成的匯編代碼是不是保證了我們代碼原意的完整性。

  2. 為必要的內存存取使用volatile關(guān)鍵字

  在C/C++代碼的編譯過(guò)程中,編譯器會(huì )分析數據流,從而盡量避免對存儲空間的直接存取。但是如果我們要在C/C++代碼中直接對內存地址進(jìn)行操作的話(huà),需要使用volatile關(guān)鍵字來(lái)定義變量,編譯器在優(yōu)化時(shí)不會(huì )對volatile類(lèi)型的變量進(jìn)行優(yōu)化。

  例如,在下面的代碼中,循環(huán)的結束條件為指針指向的地址為0xFF:

  unsigned int *ctrl;

  while (*ctrl !=0xFF);

  因為*ctrl是一個(gè)不變的表達式,這個(gè)循環(huán)會(huì )被優(yōu)化為一次內存讀取。為了正確實(shí)現我們的代碼意圖,需要把ctrl定義為volatile類(lèi)型:

  volatile unsigned int *ctrl

  使用volatile類(lèi)型定義的類(lèi)型在調試的時(shí)候還有一個(gè)極大的優(yōu)勢,就是我們可以直接在CCS的debug窗口里改變變量的值,極大地方便我們的調試。

  3. 小心使用Alias變量

  Alias(別名)在一個(gè)變量可以被至少兩種方式存取的時(shí)候會(huì )用到,例如,當兩個(gè)指針指向同一塊區域或對象時(shí),我們稱(chēng)一個(gè)指針 alias 另一個(gè)指針。Alias變量的使用要非常謹慎,因為會(huì )涉及到非直接的引用,從而破壞了優(yōu)化效果。編譯器在優(yōu)化時(shí)會(huì )分析代碼來(lái)決定在哪些地方會(huì )產(chǎn)生alias引用,然后在保持代碼正確性的基礎上“保守”地優(yōu)化代碼。

  一般情況下,編譯器會(huì )假設,如果一個(gè)本地變量的地址被傳遞給某個(gè)函數,則這個(gè)函數有可能會(huì )通過(guò)指針操作改變這個(gè)本地變量的內容,但是這個(gè)函數不能在該地址被返回后仍然可以被別的指針操作所示使用,例如把這個(gè)本地變量的地址分配給一個(gè)全局變量或者返回它。如果這種假設被打破,則需要在編譯器選項里使用-ma強制編譯器按照最壞情況的別名引用來(lái)進(jìn)行一定的優(yōu)化,在這種情況下,任何非直接的引用(例如使用指針)都可以引用到這個(gè)變量。

  4. 何時(shí)使用--aliased_variables選項?

  編譯器在優(yōu)化時(shí)會(huì )假設,任何變量的地址在作為參數被傳遞給某個(gè)函數時(shí),都不會(huì )在調用它的函數里被任何Alias變量修改,例如:從函數返回地址,或者把地址分配給某個(gè)全局變量。但是如果我們使用管理類(lèi)似下面操作的代碼的時(shí)候,就需要使用--aliased_variables選項來(lái)優(yōu)化代碼:

  int *glob_ptr;

  g()

  {

  int x = 1;

  int *p = f(&x);

  *p = 5; /* p是x的別名 */

  *glob_ptr = 10; /* glob_ptr 也是 x的別名 */

  h(x);

  }

  int *f(int *arg)

  {

  glob_ptr = arg;

  return arg;

  }

  5. 含有FPU的器件:使用restrict關(guān)鍵詞來(lái)表明指針沒(méi)有被別名操作

  在含有FPU浮點(diǎn)協(xié)處理器的器件中,當使用--opt_level=2(優(yōu)化寄存器、局部變量和全局變量的使用)的優(yōu)化級別時(shí),優(yōu)化器會(huì )分析代碼的依賴(lài)性。為了更好地幫助優(yōu)化器完成內存的依賴(lài)關(guān)系,我們可以把指針、引用或者數組等的聲明中加入restrict關(guān)鍵詞。restrict關(guān)鍵詞是C99標準引入的,它會(huì )通知編譯器,所有修改該指針所指向內存中內容的操作都必須通過(guò)該指針來(lái)修改,而不能通過(guò)其它途徑(其它變量或指針)來(lái)修改。使用這一原則能幫助編譯器優(yōu)化某些代碼段,因為別名信息可以被更加快速地確認。使用restrict關(guān)鍵詞后因為可以執行更多的FPU操作,而FPU操作與CPU是并行的,所以帶來(lái)的優(yōu)化效果是提高了性能和減小了代碼尺寸。

  我們可以使用下面例子中的代碼來(lái)告訴編譯器,a和b永遠不會(huì )在函數foo中指向同一個(gè)地址,并且a和b的內存地址也不會(huì )互相覆蓋(說(shuō)明它們沒(méi)有依賴(lài)性,可以并行執行)。

  void foo(float * restrict a, float * restrict b)

  {

  /* foo's code here */

  }

  或者

  void foo(float c[restrict], float d[restrict])

  {

  /* foo's code here */

  }



關(guān)鍵詞: DSP編程技巧代碼優(yōu)

評論


技術(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>