[应用相关] 一些小经验,不同的编译器对变量初始值有不同的处理

[复制链接]
1564|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 | 显示全部楼层
很多编译器都提供关键字来进行初始化的设置
mmuuss586 发表于 2014-9-9 12:42 | 显示全部楼层
不管编译器怎么初始化的;
你都要自己在程序中初始化下;
zh113214 发表于 2014-9-9 22:47 | 显示全部楼层
关于编译器的知识,学习哈子。
huangfeng33 发表于 2014-9-10 14:34 | 显示全部楼层
按C语言的规定,对于全局变量,静态全局变量,以及静态局部变量,如果没有初始化,则要把它们放到“ZI”(GCC称为bss),并初始化为零。但是自动变量(也就是普通的局部变量)的初值,则取决于当时栈内存中遗留的内容。
jxmzzr 发表于 2014-9-12 15:11 | 显示全部楼层
如果自动变量被优化到寄存器中,也取决于当时寄存器遗留的值。
ARMCC与GCC是符合要求的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

519

主题

4194

帖子

31

粉丝
快速回复 在线客服 返回列表 返回顶部