加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內容快速變現
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 全局優(yōu)化(整個工程所有源文件)
    • 組優(yōu)化
    • 單個文件優(yōu)化
    • 單個函數優(yōu)化
  • 相關推薦
  • 電子產業(yè)圖譜
申請入駐 產業(yè)圖譜

總結 MDK 幾種編譯優(yōu)化設置的方法

2022/08/08
2192
閱讀需 5 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

來源:公眾號【魚鷹談單片機

作者:魚鷹Osprey

ID   :emOsprey

我們都知道,代碼是可以通過編譯器優(yōu)化的,有的時候,為了提高運行速度或者減少代碼尺寸,會開啟優(yōu)化選項。

但是開啟了優(yōu)化,即意味著調試不方便。因為實際匯編代碼執(zhí)行順序和源代碼不一定保持一致。在遇到復雜的問題下,就比較難定位了。

此時掌握多種編譯優(yōu)化設置的方法,就顯得尤為重要了,可以讓你進行正宗源碼級別的調試。

全局優(yōu)化(整個工程所有源文件)

這種優(yōu)化是大部分人最新了解、也是最新使用的一種方式,相信大家都知道。

 

level 0(-O0) 代表不進行優(yōu)化,原汁原味,這種方式編譯出來的可執(zhí)行文件比較大,但是因為每一條代碼都和匯編代碼順序一一對應,所以定位問題非常方便,非常建議代碼調試階段使用該等級。

組優(yōu)化

上面的方式,將所有的源文件都進行了優(yōu)化配置。有一棍子打死的感覺。雖然大部分的時候沒有問題,但有些情況可能是個麻煩。

比如你的工程代碼,只有開啟最高優(yōu)化級別(level 3(-O3))尺寸才足夠放入 FLASH 中,否則編譯出來的目標文件太大,放不進去,也就無法定位問題了。

此時,你可以使用該優(yōu)化方式,將部分文件優(yōu)化(需要定位問題的代碼),而保持其它文件的優(yōu)化級別不變。

這里的 default 意味著和這里的優(yōu)化級別和全局優(yōu)化級別保持一致(即全局優(yōu)化級別是啥,這里也是啥),但是我們可以通過這里差異化定制我們這個組里面的優(yōu)化選項(這個組里有 app.c app_cfg.c 兩個文件,意味著這兩個文件的優(yōu)化級別受這里控制)。

單個文件優(yōu)化

可能你的空間已經到極限了,不允許把組里的文件都進行優(yōu)化,那么單個文件優(yōu)化是個不錯的選擇。

這個界面(Options for File main.c)就是針對 man.c 這個文件進行優(yōu)化的,在這里可以選擇你希望優(yōu)化的級別,調試時設置 level 0(-O0)就好。

這么多差異性,我們怎么知道我們對哪些文件做了特殊配置呢,不可能一個個查看吧。

別怕,MDK 貼心的為我們做了區(qū)分標志。

 

這里的雪花標志,即代表有特殊配置,但是不是僅僅優(yōu)化級別改變了就不一定了。

單個函數優(yōu)化

如果單個文件由于某種原因不能修改優(yōu)化級別(比如改成 O0 直接不能運行,編譯不通過等,這些都有可能),那么可以試試單個函數優(yōu)化這個方法。

不過不同的編譯器,可能方法不同(MDK 支持不同的編譯器,比如 AC5、AC6、GCC),所以如果真有必要,可以嘗試把需要優(yōu)化的函數提取出來單獨作為一個源文件進行設置。

AC5 設置方法(O0 代表 0 優(yōu)化級別):

#pragma push#pragma O0void function(void){    ...                 // Optimized at O0}#pragma pop

這里的 push、pop 主要是為了保留、恢復之前的優(yōu)化等級,這樣操作只對當前函數有效。

AC6設置方法

void function(void) __attribute__((optnone)){    ...   // Optimized none}

文末閱讀原文鏈接為安富萊論壇相關的,有興趣的話,可以擴展學習一下其他編譯器的優(yōu)化方法。

相關推薦

電子產業(yè)圖譜

六年開發(fā)經驗,豐富的KEIL調試經驗,STM32使用經驗,C語言運用經驗。