leicai05 发表于 2013-11-22 21:38:53

请教c函数定义局部变量不要超过12个?

本帖最后由 leicai05 于 2013-11-22 22:07 编辑

书中这么说“函数中的局部变量最好不要超过12个”

我是否可以这么理解,这样的函数发生调用的时候,需要使用过多的寄存器保存变量。
这种情况还不如使用全局变量。比如我在发送串口函数的时候。
方式一
void send_news(void)
{
    uchar mdata = {0};//定义局部变量
    mdata = 0x0a;//数据赋值
        mdata = 0x31;
        mdata = 0;
        mdata = crc(mdata,11);//求和校验
        tx_chars(mdata,12);//底层串口发送函数
}

方式二
uchar mdata = {0};//定义全局变量
void send_news(void)
{   
    mdata = 0x0a;//数据赋值
        mdata = 0x31;
        mdata = 0;
        mdata = crc(mdata,11);//求和校验
        tx_chars(mdata,12);//底层串口发送函数
}
这两种方式是不是第二种方式更好,请教大家。

leicai05 发表于 2013-11-22 22:14:27

自己顶起,是不是这样分析,局部变量是通过堆栈实现的,太多的局部变量数组会冲掉堆栈。

请高手下结论啊!

mcu_lover 发表于 2013-11-23 08:10:27

看C语言编译器的实现,如KEIL C51的局部变量传递就不是通过堆栈的。
但大多数的嵌入式C编译器都是通过堆栈来传递局部变量的。使用局部变量可以节省内存,开销是进出栈需要耗费额外的指令周期。此外,局部变量过多,也存在堆栈溢出的可能。
在你目前的情况下,用全局变量也是可以的。但是一般情况下,尽量避免,如果要用,建议定义为static型,紧紧只在串口模块内使用。

leicai05 发表于 2013-11-23 08:57:50

mcu_lover 发表于 2013-11-23 08:10 static/image/common/back.gif
看C语言编译器的实现,如KEIL C51的局部变量传递就不是通过堆栈的。
但大多数的嵌入式C编译器都是通过堆栈 ...

谢谢建议

jackiezeng 发表于 2013-11-28 09:18:57

寄存器的访问比堆要来的快 , 51中 。 所以局部变量优先分配在寄存器中。

绿茶山人 发表于 2013-11-28 15:55:30

一个函数中的局部变量多了可能会栈溢出。
页: [1]
查看完整版本: 请教c函数定义局部变量不要超过12个?