搜索
bottom↓
回复: 5

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

[复制链接]

出0入0汤圆

发表于 2013-11-22 21:38:53 | 显示全部楼层 |阅读模式
本帖最后由 leicai05 于 2013-11-22 22:07 编辑

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

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

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-11-22 22:14:27 | 显示全部楼层
自己顶起,是不是这样分析,局部变量是通过堆栈实现的,太多的局部变量数组会冲掉堆栈。

请高手下结论啊!

出0入264汤圆

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

出0入0汤圆

 楼主| 发表于 2013-11-23 08:57:50 | 显示全部楼层
mcu_lover 发表于 2013-11-23 08:10
看C语言编译器的实现,如KEIL C51的局部变量传递就不是通过堆栈的。
但大多数的嵌入式C编译器都是通过堆栈 ...

谢谢建议

出0入0汤圆

发表于 2013-11-28 09:18:57 | 显示全部楼层
寄存器的访问比堆要来的快 , 51中 。 所以局部变量优先分配在寄存器中。

出70入0汤圆

发表于 2013-11-28 15:55:30 | 显示全部楼层
一个函数中的局部变量多了可能会栈溢出。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表