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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > DSP編程技巧之28---答疑解惑哪家強之(3)

          DSP編程技巧之28---答疑解惑哪家強之(3)

          作者:paradoxfx 時間:2014-12-01 來源:電子產(chǎn)品世界 收藏

            19. 編譯器的優(yōu)化選項那么多,有什么通用的模版可以既快速配置優(yōu)化選項,又能達到較為合適的優(yōu)化效果?

          本文引用地址:http://www.ex-cimer.com/article/266191.htm

            關于編譯器的優(yōu)化選項,我們確實講了很多(http://www.ex-cimer.com/article/203169.htmhttp://www.ex-cimer.com/article/215180.htm,對很多初學者來說可能面臨“選擇恐懼癥”。所以我們?nèi)匀挥斜匾贫ㄒ恍┝鞒袒姆桨?,方便大家的使用。例如?/p>

            1) 把代碼盡可能根據(jù)功能劃分到多個獨立的文件中,這樣在優(yōu)化時可具有更多的級別供選擇。這樣做不光對優(yōu)化有好處,對代碼的模塊化也是有利的。

            2) 使能符號調(diào)試功能--symdebug:dwarf或者 -g

            在不啟用優(yōu)化器的情況下,編寫、編譯和調(diào)試代碼,這樣做的目的是在編譯之前首先能保證代碼的功能是正確的。

            3) 啟用優(yōu)化功能,并再次驗證代碼的功能。如果有需要,還得對代碼進行一定的調(diào)試。

            a) 優(yōu)化的級別有0,1,2和3等不同級別,對應了不同類型和不同程度的代碼優(yōu)化。

             在啟用優(yōu)化的情況下,必須指定優(yōu)化級別,否則優(yōu)化選項會被編譯器給忽略,同時顯示給你一個警告信息。

             優(yōu)化級別0 (--opt_level=0 或 -o0)是最低程度的優(yōu)化。

             優(yōu)化級別3 (--opt_level=3 或 –o3)是最高程度的優(yōu)化。

            Ø 考慮從最低的優(yōu)化級別開始進行驗證。

            b) 從編譯器版本6.0.1開始,又添加了優(yōu)化級別4的支持,即(--opt_level=4 或 -o4)

            這個級別的優(yōu)化針對的是鏈接之后的代碼,它在鏈接完成之后,從整個應用程序的角度來進行可能的優(yōu)化,具有進一步提高程序性能的潛力。與所有的優(yōu)化選項一樣,為了實現(xiàn)優(yōu)化的效果,就需要多付出一定的編譯時間,當然這個時間花費與的代碼效率相比還是值得的。

            4) 為了調(diào)試優(yōu)化過的代碼,需要在使用--opt_level的同時開啟符號調(diào)試選項-g。這保證了在保持代碼調(diào)試功能的同時,仍然可以實現(xiàn)最大程度的代碼優(yōu)化。

            老版本的編譯器中還可使用-mn選項,它可以在開啟符號調(diào)試選項的同時提供一定的優(yōu)化效果,但是此選項如今已經(jīng)廢止,再使用它不能起到任何效果了。

            5) 去掉符號調(diào)試選項(-g)

            a) 在已經(jīng)驗證了代碼的功能之后,可以移除符號調(diào)試選項了。這是因為雖然符號調(diào)試選項對代碼的效率影響非常小,但是在某些情況下可能會影響到特定代碼的執(zhí)行。例如,編譯器在使用某些FPU32指令的情況下,可以對代碼進行并行度更高的處理,或者減少NOP空指令的使用,這對應提高代碼運行速度是有幫助的;在使用-g選項的情況下,則有可能會妨礙編譯器充分發(fā)揮這一能力。如果對稱不是特別“強迫”的話,也可以干脆不去管它。

            b) 在比較老版本的編譯器手冊中,建議在此步驟中使用--symdebug:skeletal選項。但是這是個已經(jīng)廢棄的參數(shù),不再建議使用,即使使能了也不會再產(chǎn)生任何效果。

            c) 不開啟-ss選項。

            這個選項可以把的表達式生成交叉列表,以注釋的形式插入到編譯生成的匯編代碼中,方便我們查看/閱讀生成的匯編代碼。這個功能雖然方便了調(diào)試,但是顯然也妨礙了對代碼的優(yōu)化。

            如果你希望把優(yōu)化器所做的改動以注釋的形式插入到編譯生成的匯編代碼中的話,則可以在開啟了-g選項的前提下,使用-s選項。如果不使用-g,則-s與-ss的效果是相同的。

            20. 為什么開啟代碼優(yōu)化之后,程序就無法實現(xiàn)正確的功能了?

             在開啟代碼優(yōu)化之后,代碼中的一些功能有可能會被編譯器改變,例如:

             未初始化的變化會被優(yōu)化掉;

             未正確使用volatile關鍵詞的變量功能不正常;

             與標準ANSI C的結果有出入

             匯編函數(shù)沒能正確保存/恢復寄存器的

            所以為了保證程序在代碼優(yōu)化之后仍然能正確地執(zhí)行我們的意圖,一定要認真閱讀一下相關編譯器選項的使用說明。這其中需要注意的一些典型問題,可以參考http://www.ex-cimer.com/article/255842.htm。

            21. volatile關鍵字能對我們有什么幫助?

            volatile提醒編譯器它后面所定義的變量隨時都有可能改變,因此編譯后的程序每次需要存儲或讀取這個變量的時候,都會直接從變量地址中讀取數(shù)據(jù)。如果沒有volatile關鍵字,則編譯器可能優(yōu)化讀取和存儲,可能暫時使用寄存器中的值,如果這個變量由別的程序更新了的話,將出現(xiàn)不一致的現(xiàn)象。volatile的使用場合可以包括:

             在中斷或者別的任務中會被修改的變量

             可以被硬件改變的外設寄存器的值

             可以被其它處理器所修改的變量的值(用于多核的場合,例如OMAP等)

          c++相關文章:c++教程



          上一頁 1 2 下一頁

          關鍵詞: DSP CCS C/C++

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁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); })();