色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          "); //-->

          博客專欄

          EEPW首頁(yè) > 博客 > 總結(jié) MDK 幾種編譯優(yōu)化設(shè)置的方法

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

          發(fā)布人:魚鷹談單片機(jī) 時(shí)間:2022-08-20 來(lái)源:工程師 發(fā)布文章

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


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


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

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

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

          圖片

          level 0(-O0) 代表不進(jìn)行優(yōu)化,原汁原味,這種方式編譯出來(lái)的可執(zhí)行文件比較大,但是因?yàn)槊恳粭l代碼都和匯編代碼順序一一對(duì)應(yīng),所以定位問(wèn)題非常方便,非常建議代碼調(diào)試階段使用該等級(jí)。

          組優(yōu)化

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

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

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

          圖片

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

          單個(gè)文件優(yōu)化

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

          圖片

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

          圖片


          這么多差異性,我們?cè)趺粗牢覀儗?duì)些文件做了特殊配置呢,不可能一個(gè)個(gè)查看吧。


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

          圖片

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

          單個(gè)函數(shù)優(yōu)化

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


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



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

          #pragma push#pragma O0void function(void)

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

          這里的 push、pop 主要是為了保留、恢復(fù)之前的優(yōu)化等級(jí),這樣操作只對(duì)當(dāng)前函數(shù)有效。


          AC6設(shè)置方法


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



          *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。

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


          關(guān)鍵詞: 單片機(jī)

          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉