打印
[应用相关]

一些小经验,不同的编译器对变量初始值有不同的处理

[复制链接]
1092|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
拿起书本|  楼主 | 2014-9-9 09:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近这几天都在调试LM3S8962在uc\os-II系统下的程序,不是很顺利,给串口发数据的时候经常出现系统死掉的现象,而且是随机的,有时发一次数据就死,有时发好几次才死。每次都是死在默认的中断服务程序中,死循环,也不知道是哪个中断引起的。后来我就模仿STM32的中断程序那种格式,给每个中断都写一个单独的中断服务程序,但函数是空的,进入中断后什么都不干。结果这样做了以后,系统就不死了,不会进入不该有的死循环。

我是把数据发给串口然后回传回来,但我发现回传回来的数据字节数跟发过去的不一样,而且是随机的,很纳闷,跟踪计数数据长度的那个变量,发现每次计数的数值跟实际发送数据的长度不对,想了半天觉得可能是因为变量没有赋初始值,赋初始值以后果然一切都正常了,回传的数据和发送的一致,在一定范围内多长的数据都没关系。

不同的编译器对变量初始值有不同的处理,我记得AVR GCC里面变量默认的初始值就是0,我也一直这么用的,看来处理这些数据还是要小心一点。
沙发
zhaoyu2005| | 2014-9-9 10:02 | 只看该作者
全局变量一般是自动清零的,局部变量基本上就是随机的

使用特权

评论回复
板凳
sonicll| | 2014-9-9 10:03 | 只看该作者
所以一定要养成给变量赋初值的习惯

使用特权

评论回复
地板
w522930954| | 2014-9-9 10:37 | 只看该作者
很多编译器都提供关键字来进行初始化的设置

使用特权

评论回复
5
mmuuss586| | 2014-9-9 12:42 | 只看该作者
不管编译器怎么初始化的;
你都要自己在程序中初始化下;

使用特权

评论回复
6
zh113214| | 2014-9-9 22:47 | 只看该作者
关于编译器的知识,学习哈子。

使用特权

评论回复
7
huangfeng33| | 2014-9-10 14:34 | 只看该作者
按C语言的规定,对于全局变量,静态全局变量,以及静态局部变量,如果没有初始化,则要把它们放到“ZI”(GCC称为bss),并初始化为零。但是自动变量(也就是普通的局部变量)的初值,则取决于当时栈内存中遗留的内容。

使用特权

评论回复
8
jxmzzr| | 2014-9-12 15:11 | 只看该作者
如果自动变量被优化到寄存器中,也取决于当时寄存器遗留的值。
ARMCC与GCC是符合要求的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:好好学习,天天向上!

519

主题

4195

帖子

31

粉丝