關於編譯優化選項o3的問題

2021-05-11 12:04:44 字數 985 閱讀 5275

今天我在優化**的時候。出現了問題。如下:

//----------------periph.c---------------------

/* 讀暫存器,引數 位址 返回內容*/

unsigned int readcmd(unsigned char addr)

//------------------main.c-----------------

#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的問題

今天我在優化 的時候。出現了問題。如下 讀暫存器,引數 位址 返回內容 unsigned int readcmd unsigned char addr define readhdat0 readcmd spi hdat0 hdat0 readhdat0 讀 檔案幀頭資訊 假如我不用o3優化項。我讀出...

去掉編譯核心的優化選項

在使用gdb或者其他工具除錯預設優化選項的核心時,核心的反彙編 與原來的c語言 對應很亂。如果切換到c語言模式,使用單步除錯時會看到執行順序在c語言源 裡面跳來跳去,甚是紊亂。這一切都是gcc對 進行了優化造成的,優化後的 執行順序與源 的順序就有出入了。gcc優化 提高執行效率與 緊湊度,但對於除...

gcc 中 O選項對空函式的優化

將空函式優化掉是一項很有意義的工作。比如,在程式中,常常要定義乙個列印函式。如果在 release時,把這個函式使用條件編譯定義為空函式。且此空函式被優化掉,那就可以極大地提高程式的效能。測試表明 在gcc中,使用 o可以優化掉內聯的空函式。預設情況下,空函式不會被優化掉。即使使用 o,也不會優化掉...