【藍橋杯】— Keil C51 優化等級全解析

1、優化等級種類

Keil C51中的Code Optimization欄共有0-9個優化等級,高優化級別中包含了前面所有的優化級別。本文主要介紹如何設置代碼優化等級及各等級的優化內容。

2、針對的問題

如果你因爲編譯代碼過多,而導致超出編譯的範圍,可以修改下優化等級。如:

從這可以看出,這個keil c51共有0800H字節碼大小限制,但是使用了0955H字節,超出了限制,所以造成致命錯誤,無法生成HEX文件。針對這可以修改下優化等級,每種優化都是針對代碼編譯來說的,不是數字越大越好,視具體情況而定。

3、優化等級

 (1)0級(Constan folding)

    \blacktriangle 常數摺疊:只要有可能,編譯器就執行將表達式化爲常數數字的計算,其中包括運行地址的計算。

    \blacktriangle 簡單訪問優化:對8051系統的內部數據和位地址進行訪問優化。

    \blacktriangle 跳轉優化:編譯器總是將跳轉延至最終目標上,因此跳轉到跳轉之間的命令被刪除。

(2)1級(Dead code elimination)

    \blacktriangle​​​​​​​ 死碼消除:無用的代碼段被消除。

    \blacktriangle​​​​​​​ 跳轉否決:根據一個測試回溯,條件跳轉被仔細檢查,以決定是否能夠簡化或刪除。

(3)2級(Data overlaying)

    \blacktriangle​​​​​​​ 數據覆蓋:適於靜態覆蓋的數據和位段被鑑別並標記出來。連接定位器BL51通過對全局數據流的分析,選擇可靜態覆蓋的段。

(4)3級(Peephole optimization)

    \blacktriangle​​​​​​​  “窺孔”優化:將冗餘的MOV命令去掉,包括不必要的從存儲器裝入對象及裝入常數的操作。另外如果能節省存儲空間或者程序執行時間,複雜操作將由簡單操作所代替。

(5)4級(Register variables)

    \blacktriangle​​​​​​​  寄存器變量:使自動變量和函數參數儘可能位於工作寄存器中,只要有可能,將不爲這些變量保留數據存儲器空間。

    \blacktriangle​​​​​​​  擴展訪問優化:來自IDATA、XDATA、PDATA和CODE區域的變量直接包含在操作之中,因此大多數時候沒有必要將其裝入中間寄存器。

    \blacktriangle​​​​​​​  局部公共子式消除:如果表達式中有一個重複執行的計算,第一次計算的結果被保存,只要有可能,將被用作後續的計算,因此可從代碼中消除繁雜的計算。

    \blacktriangle​​​​​​​  CASE/SWITCH語句優化:將CASE/SWITCH語句作爲跳轉表或跳轉串優化。

(6)5級(Common subexpression elimination)

    \blacktriangle​​​​​​​  全局公共子式消除:只要有可能,函數內部相同的子表達式只計算一次。中間結果存入一個寄存器以代替新的計算。

    \blacktriangle​​​​​​​  簡單循環優化:以常量佔據一段內存的循環再運行時被優化。

(7)6級(Loop rotation)

    \blacktriangle​​​​​​​  迴路循環:如果程序代碼能更快更有效地執行,程序迴路將進行循環。

(8)7級(Extended Index Access optimizing)

    \blacktriangle​​​​​​​  擴展入口優化:在適合時對寄存器變量使用DPTR數據指針,指針和數組訪問被優化以減小程序代碼和提高執行速度。

(9)8級(Reuse Common Entry Code)

    \blacktriangle​​​​​​​  公共尾部合併:對同一個函數有多處調用時,一些設置代碼可被重複使用,從而減小程序代碼長度。

(10)9級(Common Block Subroutines)

    \blacktriangle​​​​​​​  公共子程序塊:檢測重複使用的指令序列,並將它們轉換爲子程序。C51甚至會重新安排代碼以獲得更多的重複使用指令序列。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章