如何寫出高效的單片機C語言程序代碼
結果:數組a
例子4:在大端模式下(8051
方法1:逐位賦值。
typedef
{
UINT8
UINT8
UINT8
UINT8
UINT8
UINT8
UINT8
UINT8
}BYTE2BITS;
BYTE2BITS
Byte2Bits._bit7=0;
Byte2Bits._bit6=0;
Byte2Bits._bit5=1;
Byte2Bits._bit4=1;
Byte2Bits._bit3=1;
Byte2Bits._bit2=1;
Byte2Bits._bit1=0;
Byte2Bits._bit0=0;
UINT8
a|=
a|=
a|=
a|=
a|=
a|=
a|=
a|=
結果:a=0x3C
方法2:強制轉換。
typedef
{
UINT8
UINT8
UINT8
UINT8
UINT8
UINT8
UINT8
UINT8
}BYTE2BITS;
BYTE2BITS
Byte2Bits._bit7=0;
Byte2Bits._bit6=0;
Byte2Bits._bit5=1;
Byte2Bits._bit4=1;
Byte2Bits._bit3=1;
Byte2Bits._bit2=1;
Byte2Bits._bit1=0;
Byte2Bits._bit0=0;
UINT8
a
結果:a=0x3C
例子5:在大端模式下(8051
方法1:逐位賦值。
typedef
{
UINT8
UINT8
UINT8
UINT8
UINT8
UINT8
UINT8
UINT8
}BYTE2BITS;
BYTE2BITS
UINT8
Byte2Bits._bit7=a&0x80;
Byte2Bits._bit6=a&0x40;
Byte2Bits._bit5=a&0x20;
Byte2Bits._bit4=a&0x10;
Byte2Bits._bit3=a&0x08;
Byte2Bits._bit2=a&0x04;
Byte2Bits._bit1=a&0x02;
Byte2Bits._bit0=a&0x01;
方法2:強制轉換。
typedef
{
UINT8
UINT8
UINT8
UINT8
UINT8
UINT8
UINT8
UINT8
}BYTE2BITS;
BYTE2BITS
UINT8
Byte2Bits=
12.
使用全局變量比函數傳遞參數更加有效率。這樣做去除了函數調用參數入棧和函數完成后參數出棧所
需要的時間。然而決定使用全局變量會影響程序的模塊化和重入,故要慎重使用。
13.
switch
發現匹配時,就跳轉到滿足條件的語句執行。使用時需要注意。每一個由機器語言實現的測試和跳轉僅僅
是為了決定下一步要做什么,就把寶貴的處理器時間耗盡。為了提高速度,沒法把具體的情況按照它們發
生的相對頻率排序。換句話說,把最可能發生的情況放在第一位,最不可能的情況放在最后。
14.
當switch
套switch
層,發生相對頻率相對低的case
低的情況放在缺省的case
UINT8
void
void
void
void
……………
void
switch(ucCurTask)
{
case
case
case
case
………………………
case
default:break;
}
可以改為
UINT8
void
void
void
void
……………
void
switch(ucCurTask)
{
case
case
default:
switch(ucCurTask)
{
case
case
………………………
case
default:break;
}
Break;
}
由于switch
UINT8
void
void
void
void
……………
void
if
else
else
{
if
else
………………
else
}
15.
當switch
可以運用函數指針來取代switch
和網絡實驗代碼。
UINT8
void
void
void
void
……………
void
switch(ucCurTask)
{
case
case
case
case
………………………
case
default:break;
}
可以改為
UINT8
void
void
void
void
……………
void
void
調用方法1:(*szTaskTbl[ucCurTask])();
調用方法2:
16.
循環在編程中經常用到的,往往會出現循環嵌套。現在就已for
UINT8
for(i=0;i<255;i++)
{
for(j=0;j<25;j++)
{
………………
}
}
較大的循環嵌套較小的循環編譯器會浪費更加多的時間,推薦的做法就是較小的循環嵌套較大的循環。
UINT8
for(j=0;j<25;j++)
{
for(i=0;i<255;i++)
{
………………
}
}
17.
在C++中,關鍵字inline
碼替換所有對于指出的函數的調用。這樣做在兩個方面快于函數調用。這樣做在兩個方面快于函數調用:
第一,省去了調用指令需要的執行時間;第二,省去了傳遞變元和傳遞過程需要的時間。但是使用這種方
法在優化程序速度的同時,程序長度變大了,因此需要更多的ROM。使用這種優化在inline
用并且只包含幾行代碼的時候是最有效的。
如果編譯器允許在C
足夠大,就可以考慮加上inline
18.
很多編譯器都具有偏向于代碼執行速度上的優化、代碼占用空閑太小的優化。例如Keil
譯時可以選擇偏向于代碼執行速度上的優化(Favor
Size)。還有其他基于GCC
-O2
19.
匯編語言是效率最高的計算機語言,在一般項目開發當中一般都采用C
之后會影響平臺的移植性和可讀性,不同平臺的匯編指令是不兼容的。但是對于一些執著的程序員要求程
序獲得極致的運行的效率,他們都在C
注意:如果想嵌入匯編,一定要對匯編有深刻的了解。不到萬不得已的情況,不要使用嵌入匯編。
評論