標籤:

51單片機的代碼效率提升

1、51單片機不支持符號運算,所以程序中不要出現帶符號變數的運算。除了根據變數長度來選擇變數類型外,還需要考慮變數是否出現負數,如果程序中不需要負數,就可以把變數都聲明為無符號類型。

註:不支持符號運算:

帶符號變數就是這個變數里存儲的數據是可正可負的。51單片機沒有直接進行帶符號數運算的指令。例如:i 和 j 是兩個帶符號變數,兩個數相加,則你編寫程序的時候首先要判斷它們是正數還是負數,然後根據正負進行相應的加法或減法運算。C語言里支持帶符號變數的運算,如果在C語言里有兩個帶符號變數,可以直接進行加法運算,而不需要判斷其正負。

2、為了提高代碼效率,需要合理的選擇數據和變數類型,使用位變數(bit),並避免使用浮點指針,如果浮點指針運算能被中斷,則必須保證中斷程序中不會使用浮點指針運算。如使用sin()這樣的浮點運算程序時,應禁止使用中斷,要在運算程序執行完以後再使用它。

使用運算量最小的表達式,如:

1》求余運算:a = a % 8 ==> a = a & 7,因為位操作只需要一個指令周期,而%運算需要調用子函數,代碼長,執行慢。

2》平方運算:a = pow(a,3) ==> a = a * a * a,因為單片機內置乘法器,乘法運算速度比平方運算的速度快。

3》用移位運算代替乘除:a = a * 2 ==> a = a << 1,a = a / 2 ==> a = a >> 1,a = a * 5 ==> a = (a << 2) + a

使用自加自減指令

使用a += 1 編譯器生成的代碼指令位元組要少於 a = a + 1

循環變數控制

1》將不必要在循環內執行的表達式,函數的調用,指針運算,數組訪問等寫道循環的外面

2》延時函數使用自減而不是自加

for(i = 0 ; i<1000 ; i++) ==> for(I=1000; i>0 ; i–)

這是因為所有的51單片機幾乎都有為0轉移的指令,使用自減就比自加少了1~3位元組的指令

3》使用do…while而不是while,do…while的代碼長度比while短。

推薦閱讀:

TAG:單片機 |