博客專欄

        EEPW首頁 > 博客 > 總結 MDK 幾種編譯優化設置的方法

        總結 MDK 幾種編譯優化設置的方法

        發布人:魚鷹談單片機 時間:2022-08-20 來源:工程師 發布文章

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


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


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

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

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

        圖片

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

        組優化

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

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

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

        圖片

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

        單個文件優化

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

        圖片

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

        圖片


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


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

        圖片

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

        單個函數優化

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


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



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

        #pragma push#pragma O0void function(void)

        {
            ...                 // Optimized at O0}#pragma pop

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


        AC6設置方法


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



        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


        關鍵詞: 單片機

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 宜黄县| 烟台市| 修武县| 青冈县| 莆田市| 商水县| 苏州市| 闽侯县| 融水| 道真| 海口市| 黄浦区| 旬邑县| 宁德市| 牟定县| 陆河县| 东乡| 宝鸡市| 姜堰市| 彝良县| 淅川县| 岳池县| 育儿| 临汾市| 肇庆市| 松阳县| 许昌县| 中山市| 四会市| 赣榆县| 宝兴县| 岑巩县| 隆子县| 济南市| 夏邑县| 大连市| 吴旗县| 丰顺县| 西林县| 太湖县| 敖汉旗|