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的,但不是总是。