SONIX单片机C语言程序优化方法,对其他类型的单片机应该也会有一些借鉴作用
资料来源:SONIX单片机C语言编译器《SN8 C studio》里的帮助文档
1、如果在定义或声明变量为int数据类型时足够,请勿使用关键字“long”。 以同样的方式,如果浮动的精度足够,不要使用“double”。
2、如果声明一个通用指针,当程序中使用指针时,需要对指针指向RAM或ROM进行判断。 但是使用ram / rom指针可以避免这个额外的动作!
int* pInt;
int g;
void main()
{
pInt = &g1;
g = 1;
if(*pInt != 1)
return 1;
return 0;
}
Rom has used : 93 [0x5D] words
----------
__RAM int* pRam;
int g;
int main()
{
pRam = &g;
g = 1;
if(*pRam != 1)
return 1;
return 0;
}
Rom has used : 79 [0x4F] words
3、如果一个标志只有两个状态:0或1,可以采用位数据类型而不是int类型。 因为位类型的操作比int类型更简单,所以会产生较少的指令。 此外,位变量占用的内存比int变量少。
4、因为操作多维数组是复杂的,所以C编译器必须生成大量的指令来实现多维数组操作。所以没事不要用多维数组。
5、通常,当使用int数据类型时,C编译器将生成一些处理否定条件的指令,但是对于数组,大多数这些指令是无用的。 所以用户可以使用unsigned类型来避免这个问题。
int a[10];
int main(void)
{
int i;
for(i = 0;i<=9;i++)
a[i] = 1;
}
Rom has used : 73 [0x49] words
--------------------
int a[10];
int main(void)
{
unsigned i;
for(i = 0;i<=9;i++)
a[i] = 1;
}
Rom has used :70 [0x46] words
6、如果全局变量位于ram bank 0中,则不需要生成额外的指令来更改RBANK寄存器。
#pragma rambank 1
int g_i, g_j,g_k;
int main(void)
{
int i,j,k;
i = 1;
g_i = 1;
j = 1;
g_j = 1;
k = 1;
g_k = 1;
}
Rom has used : 69 [0x45] words
---------------------
#pragma rambank 0
int g_i, g_j,g_k;
int main(void)
{
int i,j,k;
i = 1;
g_i = 1;
j = 1;
g_j = 1;
k = 1;
g_k = 1;
}
Rom has used : 64 [0x40] words
7、由于位数据类型的操作比指针简单,使用位参考类型而不是指针是减少代码大小的更好方法。
#include<sn8p2708a.h>
int main(void)
{
if(FP4CON2 != FP4CON3)
return 1;
else
return 0;
}
Rom has used : 76 [0x4C] words
----------------------
#pragma data_address 0xae:2
sbit fpcon2;
#pragma data_address 0xae:3
sbit fpcon3;
int main(void)
{
if(fpcon2 != fpcon3)
return 1;
else
return 0;
}
Rom has used : 62 [0x3E] words
8、因为位数据类型的操作比位字段更简单,所以使用位参考类型而不是位归档是减少代码大小的更好方法。也就是直接位定义,而不需要把位归类。
struct BitField
{
unsigned int bit0:1;
unsigned int bit1:1;
unsigned int bit2:1;
unsigned int bit3:1;
unsigned int bit4:1;
unsigned int bit5:1;
unsigned int :2;
};
int main(void)
{
struct BitField bitfield;
bitfield.bit0 = 1;
if(bitfield.bit1==1)
bitfield.bit2 = 0;
if(bitfield.bit3!=0)
bitfield.bit3 = 0;
}
Rom has used : 73 [0x49] words
------------------------
int bitfield;
int main(void)
{
sbit bit0 = bitfield:0;
sbit bit1 = bitfield:1;
sbit bit2 = bitfield:2;
sbit bit3 = bitfield:3;
bit0 = 1;
if(bit1==1)
{
bit2 = 0;
}
if(bit3!=0)
{
bit3 = 0;
}
}
Rom has used : 64 [0x40] words
9、为了实现相同的功能,使用变量会产生比指针少的指令。 所以不要尽可能使用指针。
int main (void)
{
int i;
int *p = &i;
*p= 1;
}
Rom has used : 62 [0x3E] words
--------------------------
int main (void)
{
int i;
int *p = &i;
i = 1;
}
Rom has used : 58 [0x3A] words
10、如果在程序中多次使用指针,其值不会频繁更改,则可以使用变量作为替代来完成相同的工作。
#include<sn8p2708a.h>
int main(void)
{
int temp = R;
int i = 2;
int j = temp*i;
int k = temp*j;
}
Rom has used : 71 [0x47] words
-----------------------
#include<sn8p2708a.h>
int main(void)
{
int i = 2;
int j = R*i;
int k = R*j;
}
Rom has used : 69 [0x45] words
11、当使用“++ / - ”和其他运算符在一起时,首先编译器将变量的值增加到寄存器之前或之后,然后获取寄