《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 業界動態 > DSP編程技巧之:使用代碼優化時必須考慮的五大問題

DSP編程技巧之:使用代碼優化時必須考慮的五大問題

2015-09-18
關鍵詞: DSP 編程技巧

  前面我們提到了使用編譯器的優化選項進行不同級別的代碼優化的方法。俗話說“好馬配好鞍”,即使我們有了強大的代碼優化工具,使得我們書寫的符合ANSI/ISO C/C++的代碼能被高效執行,我們在寫代碼時也要考慮到一些必要的原則,從而既能實現代碼的優化,也能保證代碼的安全,使得優化操作不會讓我們的代碼產生預期之外的結果。下面我們就來看一下在使用代碼優化時,必須考慮的五大問題。
  1. 小心使用匯編表達式
  在C/C++代碼中,有時候一些操作難免會對某些CPU寄存器進行操作,此時要使用內嵌的匯編表達式,例如asm("EALLOW"),或者重置某個中斷的掩碼寄存器等。在優化代碼時,編譯器會重新調整某些代碼段的順序,自己決定使用某些寄存器(例如AR0-AR7這樣的輔助寄存器),甚至刪除某些編譯器認為無用的變量、函數等,但是編譯器一般情況下并不會對內嵌的匯編代碼進行任何優化(除非這段匯編代碼被編譯器認為是永遠不會執行到的無用代碼),這就造成了編譯器的優化效果在這段匯編代碼和它的上下文代碼中無法進行有效的優化,特別是匯編代碼和C/C++代碼直接存在變量調用的情況下。所以非必要的情況下,要盡量避免C/C++和匯編語句的混用,如果確實需要的,也要在編譯之后檢查生成的匯編代碼是不是保證了我們代碼原意的完整性。
  2. 為必要的內存存取使用volatile關鍵字
  在C/C++代碼的編譯過程中,編譯器會分析數據流,從而盡量避免對存儲空間的直接存取。但是如果我們要在C/C++代碼中直接對內存地址進行操作的話,需要使用volatile關鍵字來定義變量,編譯器在優化時不會對volatile類型的變量進行優化。
  例如,在下面的代碼中,循環的結束條件為指針指向的地址為0xFF:
  unsigned int *ctrl;
  while (*ctrl !=0xFF);
  因為*ctrl是一個不變的表達式,這個循環會被優化為一次內存讀取。為了正確實現我們的代碼意圖,需要把ctrl定義為volatile類型:
  volatile unsigned int *ctrl
  使用volatile類型定義的類型在調試的時候還有一個極大的優勢,就是我們可以直接在CCS的debug窗口里改變變量的值,極大地方便我們的調試。
  3. 小心使用Alias變量
  Alias(別名)在一個變量可以被至少兩種方式存取的時候會用到,例如,當兩個指針指向同一塊區域或對象時,我們稱一個指針 alias 另一個指針。Alias變量的使用要非常謹慎,因為會涉及到非直接的引用,從而破壞了優化效果。編譯器在優化時會分析代碼來決定在哪些地方會產生alias引用,然后在保持代碼正確性的基礎上“保守”地優化代碼。
  一般情況下,編譯器會假設,如果一個本地變量的地址被傳遞給某個函數,則這個函數有可能會通過指針操作改變這個本地變量的內容,但是這個函數不能在該地址被返回后仍然可以被別的指針操作所示使用,例如把這個本地變量的地址分配給一個全局變量或者返回它。如果這種假設被打破,則需要在編譯器選項里使用-ma強制編譯器按照最壞情況的別名引用來進行一定的優化,在這種情況下,任何非直接的引用(例如使用指針)都可以引用到這個變量。

  4. 何時使用--aliased_variables選項?
  編譯器在優化時會假設,任何變量的地址在作為參數被傳遞給某個函數時,都不會在調用它的函數里被任何Alias變量修改,例如:從函數返回地址,或者把地址分配給某個全局變量。但是如果我們使用管理類似下面操作的代碼的時候,就需要使用--aliased_variables選項來優化代碼:
  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關鍵詞來表明指針沒有被別名操作
  在含有FPU浮點協處理器的器件中,當使用--opt_level=2(優化寄存器、局部變量和全局變量的使用)的優化級別時,優化器會分析代碼的依賴性。為了更好地幫助優化器完成內存的依賴關系,我們可以把指針、引用或者數組等的聲明中加入restrict關鍵詞。restrict關鍵詞是C99標準引入的,它會通知編譯器,所有修改該指針所指向內存中內容的操作都必須通過該指針來修改,而不能通過其它途徑(其它變量或指針)來修改。使用這一原則能幫助編譯器優化某些代碼段,因為別名信息可以被更加快速地確認。使用restrict關鍵詞后因為可以執行更多的FPU操作,而FPU操作與CPU是并行的,所以帶來的優化效果是提高了性能和減小了代碼尺寸。
  我們可以使用下面例子中的代碼來告訴編譯器,a和b永遠不會在函數foo中指向同一個地址,并且a和b的內存地址也不會互相覆蓋(說明它們沒有依賴性,可以并行執行)。
  void foo(float * restrict a, float * restrict b)
  {
  /* foo's code here */
  }
  或者
  void foo(float c[restrict], float d[restrict])
  {
  /* foo's code here */
  }

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
欧美激情综合色| 国产精品国产三级国产专区53| 99re66热这里只有精品3直播| 国产精品午夜在线| 欧美三级午夜理伦三级中视频| 欧美一区二区三区成人| 亚洲国产精品99久久久久久久久| 亚洲制服av| 亚洲男女自偷自拍| 亚洲欧美国产另类| 亚洲经典三级| 尤物精品国产第一福利三区| 国产精品xxxav免费视频| 欧美在线电影| 亚洲综合另类| 亚洲一区在线直播| 亚洲欧美综合精品久久成人| 久久av一区二区| 欧美一区二区视频免费观看| 欧美一区二区三区喷汁尤物| 久久不射2019中文字幕| 久久aⅴ国产紧身牛仔裤| 久久精品国产久精国产一老狼| 99国产精品自拍| 日韩视频不卡中文| 激情成人综合网| 国产精品视频网| 国产人成一区二区三区影院| 国产一区视频观看| 国产精品v一区二区三区| 国产精品久久久久久久久| 国产精品免费aⅴ片在线观看| 欧美国产欧美综合 | 亚洲综合视频1区| 久久国产加勒比精品无码| 9久草视频在线视频精品| 亚洲视频电影在线| 亚洲精品免费一二三区| 日韩一二在线观看| 在线成人中文字幕| 91久久香蕉国产日韩欧美9色| 夜色激情一区二区| 亚洲精品一区中文| 亚洲图片在线| 一区二区三区蜜桃网| 91久久精品国产| 激情一区二区| 国产亚洲精品久久久久动| 精品二区视频| 韩国精品久久久999| 亚洲国产一区二区三区青草影视| 国内精品久久久久久久影视麻豆| 韩国一区二区三区美女美女秀| 亚洲欧洲在线免费| 亚洲国产国产亚洲一二三| 国产一区二区三区久久 | 亚洲欧美日韩区| 中文精品在线| 在线午夜精品自拍| 欧美一二三视频| 99成人在线| 中文亚洲欧美| 在线亚洲激情| 亚洲先锋成人| 亚洲午夜精品国产| 亚洲图片欧洲图片日韩av| 一区二区毛片| 亚洲视频免费| 久久精品综合一区| 久久视频这里只有精品| 久久亚洲精选| 麻豆成人综合网| 国产精品久久一卡二卡| 亚洲激情女人| 99热这里只有精品8| 久久国产夜色精品鲁鲁99| 亚洲午夜激情| 午夜精品久久久久久久蜜桃app | 久热精品视频在线观看一区| 麻豆成人91精品二区三区| 麻豆freexxxx性91精品| 国产精品美女在线观看| 亚洲精品国产拍免费91在线| 一卡二卡3卡四卡高清精品视频 | 亚洲人成网站在线观看播放| 久久av一区二区| 久久天天综合| 欧美大胆成人| 欧美久久久久久久久久| 国产一区二区成人| 中文成人激情娱乐网| 午夜在线精品| 久久se精品一区二区| 亚洲综合精品四区| 欧美精品一二三| 国内自拍亚洲| 亚洲激情综合| 亚洲一区二区欧美日韩| 一区二区三区www| 欧美大片免费看| 激情文学综合丁香| 亚洲精品日产精品乱码不卡| 久久精品官网| 欧美在线播放视频| 欧美高清成人| 在线不卡免费欧美| 久久国产精品99精品国产| 久久成人一区二区| 国产精品美女主播| 亚洲一区二区三区四区在线观看 | 在线精品视频在线观看高清| 久久成人免费网| 久久国产精品久久精品国产 | 亚洲精品一区久久久久久| 亚洲男女自偷自拍| 亚洲女同性videos| 国产精品扒开腿做爽爽爽视频| 激情成人av在线| 麻豆freexxxx性91精品| 亚洲国产精品va在线看黑人动漫| 一区二区三区四区在线| 亚洲深夜福利| 国产精品爱啪在线线免费观看 | 亚洲电影中文字幕| 久久看片网站| 欧美激情综合五月色丁香| 亚洲国产精品va在线看黑人动漫 | 韩日成人av| 一区二区三区高清| 亚洲承认在线| 亚洲欧美成人| 国产精品美女午夜av| 亚洲制服av| 一级日韩一区在线观看| 欧美日韩免费高清一区色橹橹| 亚洲伦伦在线| 亚洲黄色有码视频| 欧美成人一区二区三区| 国产欧美一区二区三区在线老狼| 亚洲一区二区三区四区五区午夜| 欧美一区二区在线视频| 国产自产2019最新不卡| 一本色道久久88精品综合| 亚洲福利视频专区| 欧美一区二区三区视频免费| 国产欧美一区二区三区在线老狼| 久久疯狂做爰流白浆xx| 久久综合九色综合网站| 亚洲国产清纯| 亚洲一区二区成人| 国产精品一区二区三区久久久| 欧美诱惑福利视频| 欧美大片在线观看| 国产精品欧美日韩一区| 亚洲精品久久久久久久久久久久| 在线综合视频| 国产精品一区久久久久| 亚洲电影在线观看| 久久久久se| 国产日韩一区欧美| 亚洲一区二区三区免费视频| 久久精品在线免费观看| 亚洲国产经典视频| 久久成人av少妇免费| 欧美激情精品久久久久久蜜臀| 影音先锋国产精品| 欧美一区二区三区精品电影| 欧美91福利在线观看| 悠悠资源网亚洲青| 9l国产精品久久久久麻豆| 欧美大片一区二区| 一区二区三区你懂的| 亚洲在线成人| 国产亚洲综合在线| 一本一本a久久| 国产亚洲一本大道中文在线| 欧美一区二区视频在线观看2020| 欧美一区二视频在线免费观看| 国产精品vvv| 一区二区三区精品视频在线观看 | 激情成人亚洲| 久久精品亚洲精品| 欧美日韩精品系列| 欧美一区激情| 另类激情亚洲| 在线中文字幕不卡| 麻豆9191精品国产| 在线日韩中文字幕| 亚洲精品欧美激情| 欧美精品在线免费观看| 亚洲精品乱码久久久久久久久| 日韩视频免费大全中文字幕| 国产精品亚洲综合久久| 亚洲久久成人| 国产一区二区三区电影在线观看| 亚洲午夜国产一区99re久久| 国产精品久久97| 亚洲人成高清| 欧美日韩国产亚洲一区| 久久国产99|