10个嵌入式C代码优化技巧,总有你不知道的,点滴之间涨水平

代码优化有两个方面,一个是速度优化,一个是代码大小优化,今天这10个技巧主要是

代码大小优化,特别适用于8位单片机上,代码是XC8编辑器(V1.42)测试通过。

1.使用短数学表达式

<code>void main(void)
{
int a, b;
a = (b-1)*3;
}/<code>

代码大小50字节,可改为

<code>void main(void)
{
int a, b;
a = (b-1);
a = a+a+a;
}/<code>

改后代码25字节。

2.使用if代替switch

<code>void main(void)
{
int a, b ;
switch (a)
{
case 0: b = a + 5 ; break ;
case 1: b = a * 5 ; break ;
case 2: b = a – 5 ; break ;
}
}/<code>

改为

<code>void main(void)
{
int a, b ;
if (a == 0) b = a + 5 ;
if (a == 1) b = a * 5 ;
if (a == 2) b = a – 5 ;
}/<code>

改之前79字节,改后74字节。

3.字符判断(大小写无关)

<code>void main(void)
{
char chx ;
if (chx == 'a' || chx == 'A') b = a + 5 ;
if (chx == 'm' || chx == 'M') b = a – 10 ;
if (chx == 't' || chx == 'T') b = a * 25 ;
}/<code>

改为

<code>void main(void)
{
char chx ;
// to lower case, alphabetical only
chx = chx | 0x20 ;
if (chx == 'a') b = a + 5 ;
if (chx == 'm') b = a – 10 ;
if (chx == 't') b = a * 25 ;
}/<code>

改之前84字节,改后77字节。

4.少用else

<code>void main(void)
{
int a, b, c ;
if (a == 0) b = 0 ; else b = (a – c) * 100 ;
}/<code>

改为

<code>void main(void)
{
int a, b, c ;
b = 0 ;
if (a) b = (a – c) * 100 ;
}/<code>

改之前64字节,改后63字节。

5.多用一维数组

<code>void main(void)
{
const char *TabMois[] =
{"Jan","Feb","Mar","Apr","May","Jun",
"Jul","Aug","Sep","Oct","Nov","Dec"} ;
char ch1 = TabMois[0][0],
ch2 = TabMois[0][1],
ch3 = TabMois[0][2] ;
}/<code>

改为

<code>void main(void)
{
const char TabMois[] =
"JanFebMarAprMayJunJulAugSepOctNovDec" ;
char ch1 = TabMois[0],
ch2 = TabMois[1],
ch3 = TabMois[2] ;
}/<code>

改之前149字节,改后68字节。

6.用整数代替浮点数运算

<code>int Measure (unsigned int canal)
{ //…
\treturn ((ADRESH<<8) + ADRESL) ;
}/<code>
<code>void main(void)
{
float Vbat, Vmean=0 ;
int a, cnt = 60 ;
while (cnt)
{
if (TMR1IF)
{
Vbat = Measure(a) * 4.88 ;
Vmean += Vbat ; cnt– ;
TMR1IF = 0 ;
}
}
Vmean /= 60 ;
}/<code>

改为

<code>void main(void)
{
float Vmean;
int a, cnt, Vbat, Vbat60=0 ;
while (cnt)
{
if (TMR1IF)
{
Vbat = Measure(a) ;
Vbat60 += Vbat ;
cnt– ;
TMR1IF = 0 ;
}
}
Vmean = (Vbat60 * 4.88) / 60 ;
}/<code>

改之前841字节,改后570字节。

7.for优化

<code>void main(void)
{
\tfor (a = 10 ; a > 0 ; a–)
\t\tb = c + a ;
}/<code>

改为

<code>void main(void)
{
for (a = 10 ; a– ; )
b = c + a ;
}/<code>

改之前43字节,改后27字节。

8.把乘法改为除法

<code>void main(void)
{
float a, b, c ;
a = (b + c) * 0.1 ;
}/<code>

改为

<code>void main(void)
{
float a, b, c ;
a = (b + c) / 10.0 ;
}/<code>

改之前570字节,改后559字节。

9.多用无符号整数

<code>void main(void)
{
int Vbat ; // 1, 2, …, 1023
Vbat = 1023 / Vbat ; // 例1
Vbat = (2048L * 15) / Vbat ; // 例2
}/<code>

改为

<code>void main(void)
{
int Vbat ; // 1, 2, …, 1023
Vbat = 1023U / Vbat ; // 例1
Vbat = (2048UL * 15) / Vbat ; // 例2
}/<code>

改之前102,160字节,改后73,114字节。

10.选择合理的判断语句

<code>void main(void)
{
int a, b ;
if (a – b) b = (a – 5) * 100 ; // 例1
if (b > a) b = (a – 5) * 100 ; // 例2
if (b – a > 0) b = (a – 5) * 100 ; // 例3
}/<code>

改为

<code>void main(void)
{

int a, b ;
if (a != b) b = (a – 5) * 100 ; // 例1
if (a < b) b = (a - 5) * 100 ; // 例2
if (a – b < 0) b = (a - 5) * 100 ; // 例3
}/<code>

改之前67,62,77字节,改后58,62,65字节。

看完之后,有没有收获,有的话关注一下,谢谢。


分享到:


相關文章: