今天我在優化**的時候。出現了問題。如下:
/* 讀暫存器,引數 位址 返回內容*/
unsigned int readcmd(unsigned char addr)
#define readhdat0() readcmd(spi_hdat0)
hdat0=readhdat0();//讀***檔案幀頭資訊
假如我不用o3優化項。我讀出的資料是正確的。但用的話,每次讀出來的資料都錯。而且都不相同(數值和正確的數值相差不大,可以說在正確數值下波動)。
然後我就查了對應o3的資料,書本有如下一段:
「-o3:表示最大可能優化級別。各種迴圈優化都執行了,並且各種檔案級性質也用來改善效能。」
請問:1、假如我要選用o3優化的話,我該怎樣做才不出錯?
2、o3的說明中,「各種迴圈優化都執行了」,各種迴圈優化,具體怎麼優化?在什麼條件下?優化了些什麼?
3、「各種檔案級性質也用來改善效能」,檔案級性質指的是什麼?它何以改善效能?
o3是最大的優化級別,特別對迴圈試圖進行軟體流水。優化後一些不常用的中間變數將被釋放掉,優化前中間變數被定義在l2快取裡,優化後直接分配在了cpu內部暫存器裡,所以這些變數將不能被看到。建議買一本dsp優化方面的書,一般講得很清楚
很正常,採用o3優化後,少些**會不正常,我也遇見過好幾次,把c**的方法改一下,再採用fulll-debug模式回過去看看(mix模式)彙編確認一下。
肯定要使用-o3,不然全用手工優化,得把人累死。
至於錯誤的原因,不能怪-o3,只能說程式不嚴謹!
03出錯,有時是用指標讀寫記憶體的錯誤,可以把程式分成比較小的檔案,乙個檔案乙個檔案的o3,每次-o3乙個檔案,縮小錯誤的範圍。
不會使用-o3的工程師,不算合格的dsp工程師。
關於編譯優化選項o3的問題
今天我在優化 的時候。出現了問題。如下 periph.c 讀暫存器,引數 位址 返回內容 unsigned int readcmd unsigned char addr main.c define readhdat0 readcmd spi hdat0 hdat0 readhdat0 讀 檔案幀頭資...
去掉編譯核心的優化選項
在使用gdb或者其他工具除錯預設優化選項的核心時,核心的反彙編 與原來的c語言 對應很亂。如果切換到c語言模式,使用單步除錯時會看到執行順序在c語言源 裡面跳來跳去,甚是紊亂。這一切都是gcc對 進行了優化造成的,優化後的 執行順序與源 的順序就有出入了。gcc優化 提高執行效率與 緊湊度,但對於除...
gcc 中 O選項對空函式的優化
將空函式優化掉是一項很有意義的工作。比如,在程式中,常常要定義乙個列印函式。如果在 release時,把這個函式使用條件編譯定義為空函式。且此空函式被優化掉,那就可以極大地提高程式的效能。測試表明 在gcc中,使用 o可以優化掉內聯的空函式。預設情況下,空函式不會被優化掉。即使使用 o,也不會優化掉...