2008-12-27 24 views
12

是否可以關閉特定功能的優化? 我的一個朋友有問題,gcc優化使一些(我不知道)μ控制器代碼不起作用。 我們知道它是哪些功能,但我們不知道代碼本身的線索,所以最簡單和最安全的方法可能是將其關閉以用於整個功能。關閉gcc中特定功能的優化4.2.2

不幸的是http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html顯示有一個優化函數屬性/編譯指示,但它需要gcc 4.4,我們沒有。

在此先感謝

+2

爲什麼不修復代碼而不是嘗試解決警告? – 2008-12-28 07:59:27

+0

GCC 4.3.2是當前最新版本的GA版本,所以沒有GCC 4.4並不奇怪。您提供的信息很有趣 - 謝謝。 – 2008-12-29 20:09:49

回答

12

如果編譯指示不適用於您,請嘗試將該函數拆分爲它自己的文件,然後在沒有設置優化標誌的情況下編譯該文件。

3

我不能肯定地說,但據我所知,沒有這樣的可能性。但是,優化不應該改變明確定義的代碼的語義。這裏唯一可能發生的事情是變量被內聯,或者讀/寫的順序被改變。

第一個,也可能是兩個問題都可以通過將變量聲明爲volatile來解決,因此向編譯器顯示,編譯器不應僅根據程序流程對其內容進行假設。

+0

我認爲這一點,它只是將它作爲一個函數屬性或類似的東西。謝謝 – 2008-12-27 16:51:56

7

你可以把這個函數放在一個單獨的文件中,然後編譯這個文件而不進行優化,但更好的解決方案是找出代碼的錯誤並修復它。

使用gcc啓用優化時出現的最常見錯誤之一是嚴格別名。確保所有警告已啓用,並查看是否有任何警告可幫助您找出問題所在。如果您無法弄清楚,請嘗試將問題簡化爲一個小而完整的程序並將其發佈到此處。

4

將函數放在自己的文件中,我不認爲有任何方法可以使用早期版本的GCC關閉功能級別的函數優化。但不是關閉這個函數的優化,你可以嘗試在整個程序中選擇關閉某些類型的優化。雖然你已經發現了這個特定函數中的一個錯誤,但這可能表明存在其他未發現的錯誤。

正如其他人指出的,這可能是罪魁禍首是關於'strict aliasing'的優化。儘管從長遠來看,您可能應該修復有問題的代碼,在短時間內,您可以在命令行中添加'-fno-strict-aliasing'來玩遊戲。在-O2及以上版本中,編譯器對指針之間的交互作出了某些假設。增加這個選項告訴它不要做這些假設。

如果此操作失敗,並且由於某些原因代碼無法修復,您可以嘗試禁用其他optimization options

5

迄今爲止的答案忽略了原始問題中的關鍵詞,它們是「微控制器代碼」。在編寫代碼時禁用 優化是非常常見的 - 積極的優化器將「優化」 副作用是驅動控制器。這是與應用程序 編碼不同的世界。對於通常編程空間中的應用程序,爲了避免將卡農總結(請參見維基百科) 優化爲虛無,我來到這裏查看 的相同信息。因此,我們不要假設生成不同程序行爲的優化級別 的更改自動成爲錯誤代碼的標誌。 聰明地使用volatile關鍵字可能會掩蓋某些事物,在某些情況下,應該生成實際的彙編語言並檢查它。 (我相信這個 仍然可以用-S切換到gcc來完成)。讓我們記住C的意圖是成爲一種便攜式彙編程序,而不是一種COBOL。

戴夫

3

我知道這是一箇舊的職位。 OP給出的GCC頁面實際上是這樣說的: 爲了防止這樣的調用被優化掉,把asm(「」);在函數中。 我想這是一個簡單的解決方法。只要把它弄出來,希望它可以幫助其他像我一樣的人 。

2

對於仍在使用舊版本gcc的人: 較新版本的gcc解決了這個問題。我已經在gcc-4.5.1中成功使用了它。 Goodluck。