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