2021年12月20日 星期一

程式優化寫法

 

  1. unsigned/signed
    一般情況下,在使用signed類型時compiler會考慮其為正數和負數的情況,因此在不會出現負數的環境中,使用unsigned會避免負數的開銷,從而節省ROM。


  2. 資料形態選擇適當範圍的資料類型,助於產生更精簡的指令。


  3. 浮點常數浮點常數默認為double類型,如果計算所需要的精度不需太高,可以將它強制轉為float,如:(float)3.14


    編譯器不會給浮點運算常量折叠,所以,如果有兩個浮點常數需要計算,可以把結果先算出來:


  4. const陣列把const陣列定義成全域會比局域的節省RAM:


  5. 算術運算
    位與運算(&)代替取模運算(%)一般情況下,“&”操作比“%”操作簡單,在某些特殊情況下,如果可以使用“&”代替“%”,則會降低指令的開銷。


  6. 程式結構
    switch語句代替if else語句當程式中存在多層嵌套的if  else語句,如果多重判斷可轉為switch語句,可以試著轉為switch語句,以便節省ROM
  7. 重複多次的運算可以用迴圈代替當程式中存在多次重複的運算,而且都有規律性,可以用迴圈代替。



  8. 使用預處理命令維護原始程式碼有時候為了維護的方便,希望同一份源碼滿足不同環境的要求,如果用硬編碼的方式,可能會消耗很多的ROM,此時若利用條件編譯的特性,就能輕鬆的實現:



  9. 函式呼叫
    避免不必要的函式呼叫若某函式被多次調用,但其返回值並無差異,應考慮用變數接收函式返回值,使用時做為替代。



  10. 封裝頻繁使用的代碼為函式如果在程式中存在某段代碼被多次使用,在可能的情況下,應將這段代碼封裝起來獨立成為函式,以便節省指令



  11. 如果函式只在本文檔調用,可以定義成static



  12. 全局變數的分配對無擴展指令架構的MCU,RAM  BANK0以外的地址只能用間接定址的方式訪問,下例可以看出,間接定址的指令比直接定址多出5條,所以,當RAM bank0溢出時,用戶可以選擇把較少用到的變數定義到其它bank,比較常用的變數定義在bank0。



  13. 中斷服務程式一般,如果兩個函式沒有調用關係,那它們的局域變數是可以分配到同樣的地址,但中斷服務程式不會與主函式共用局域變數的地址,所以,為了減少RAM的使用,中斷程式可以儘量簡單,不宜寫得太過複雜。


資料來源:https://www.holtek.com.tw/documents/10179/178484/Holtek_C_compiler_V3_Users_Guide(950).pdf

沒有留言: