SN单片机c程序优化方法

本文分享了SONIX单片机C语言程序优化的一些实用方法,包括选择合适的数据类型、避免冗余操作、简化位操作和数组操作等,以减少代码大小和提高效率。建议使用位数据类型代替int,避免多维数组,尽量用加法替换乘法等,以优化程序性能。
摘要由CSDN通过智能技术生成

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、当使用“++ / - ”和其他运算符在一起时,首先编译器将变量的值增加到寄存器之前或之后,然后获取寄

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值