问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C51 单片机 局部变量 问题

发布网友 发布时间:2022-06-01 20:16

我来回答

2个回答

热心网友 时间:2023-10-15 04:54

这个问题也困扰过我,比如定时器中断里设置一个变量x,不设置初值,然后程序里放个x++。
结果就是那个x真的一直在加。
不过我没有去深究过,个人理解是,如果系统不缺空间的话,单片机就不会去清除空余的单元。

是不是这样我不清楚,但是分析如下:
我们自己用汇编写程序的时候,直接对RAM操作,如果不去清0,里面的数是永远不会变的。这说明,单片机本身是没有这种操作的。
如果说C语言编译过程中有加这种功能,也很难想象会在每个工作周期中不断的去检查哪些单元闲置的,并且对其清零。因为这样要占用很多CPU时间。
个人猜测,注意,是猜测!应该是当不得不要把某个物理单元划分给新的变量时,才会真的把旧变量清除掉。否则,哪怕是局部变量,对应的物理单元应该是一直不变的。
(以上有错,是我一开始写的,请看下面的分析为准)

一边写一边仔细回忆一下,大概知道了:

如果你写了一个函数,里面有5个变量。并且,这个函数你不去调用它。那么编译后你会发现程序多占用了5个字节的RAM。如果你调用它,有些情况下(程序特别长,变量特别多时)你会发现,程序里使用的RAM没增加!(多说明一下,为什么不调用它反而要占用空间呢?因为系统不知道这5个空间什么时候可以释放,那么定义了以后只好一直保留着。而如果你调用它了,什么时候有用什么时候没用是固定的,那么系统编译时就可以在该变量不被使用时把空间分配给其他变量,有点“分时复用”的意思。而且,如果你写了太多函数,里面有足够多的变量,然后这些函数统统都永不调用,编译时就会出错,提示你系统RAM不足)

这至少说明两点,
一、如果你定义了一个局部变量,那么系统就会一直留着空间给它以备使用。那么那个物理单元随时都是为“那一个”变量准备着的,它的值并不会清零。
二、当你程序使用了太多变量时,那么系统编译时会自动调节,在适当的时候释放物理单元给“不同的变量”使用,也就是同一个物理单元要被不同的局部变量用,这种时候才会出现你说的情况,那就是局部变量会被清零。

实际上平时写的程序都太短了,根本没用使用完系统的RAM,那么编译时自然不会做这个操作。
同样可以得出一个结论,正是因为单片机的RAM有限,才会导致局部变量不清除。对于电脑来说,空间近乎无限的,随时随地你都可以分配空间给变量用。但是51单片机就那么128字节,必须详细策划好如何分配,所以局部变量才有了自己固定的地盘。

说到这里,我相信你的问题我已经找到答案了,虽然都是我推测的,但是十之*不会错。欢迎讨论!
哦,至于初始值为0,这个没啥啊,单片机复位以后,RAM就是0
书上没写,但是实际用都是这样

热心网友 时间:2023-10-15 04:55

为了代码整体的安全,还是初始化一下。有时会被编译器初始化为0的,但不是总是。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...开了一个小口有一点肉出来了触角也是,怎么碰都不缩回去,是死了吗 盗窃罪的可以免于刑事处罚吗 镇江新区森宇智能安防工程有限公司怎么样? 无锡聚瑞隆包装有限公司怎么样? 昆山科正荣电子材料有限公司怎么样? 无锡正荣钢铁贸易有限公司怎么样? 东莞市正荣数控刀具有限公司怎么样 IDEA的Web项目启动Tomcat出现404错误 男友刚刚说我们性格不合分手了,看到他刚刚在微信朋友圈发的说说 ...原因说性格不合,很难接受我冲动起来就把他微信关了,现在 用keil编写C51程序,变量顺序为什么会影响实际运行结果? C51 rand()函数 C51,随机亮小灯程序的一个小问题,见题中备注。 C51单片机编程题:编写一个C语言函数,该函数能产生0~10的随机数。 C51中在两个unchar类型数之间如何产生随机数 求C51随机数代码~ C51单片机用C语言写个随机函数该如何写呢?最好不要加载其它头文件的,能否实现呢? c51中如何得到随机数 34下,淘气已经跳了9下。如果淘气想要 赢,那么他最少还要跳多少下? 请推荐言情小说,不要*,不要小白,希望情节虐心但结局一定要*,悲剧请绕行,最好是出版的古言… 你好,可以跟你求吴姐姐讲历史故事吗?谢谢 我想写小说 但是我不知道网站 谁能告诉我? 鲜花送给谁 小弟弟坐在小凳子上听姐姐讲故事? “日语”的片假名拼法是什么? 幸福校园征文500字 59文学http://www.59too.com怎么加入收藏? 为什么日本有片假名姓氏? 小弟弟坐在小凳子上听大姐姐讲故事。不知为什么,小凳子的一条腿断了。小弟弟? 日文的片假名是什么? win 10 系统怎样安装字体 C51编程错误 MAIN.C(23): error C247: non-address/-constant initializer C51单片机如何用二维数组让88点阵显示汉字? 嘿siri零到一百的随机数 伪随机数产生程序 概率论,题目如图 zippo火机怎么换火绳 怎么修改微 zippo打火机捻子怎么更换 重复怎么改自己想要的 zippo打火机上的灯线能换吗? 不满一年怎么修改 海藻含有的营养成分? 血迹怎么洗干净 重庆现在去哪里好玩 海藻能吃鸡蛋吗 灵媒舅舅做了什么 灵媒盲人婆婆怎么死的 上海为何被称作“诈骗之都”? 上海是“诈骗之都”吗?